带有“额外”字段的管理员表单

时间:2010-12-13 17:10:05

标签: php symfony1 symfony-forms

我有一个名为AccountImport的对象的表单。此表单位于管理员生成的模块中。除了直接映射到此对象属性的字段之外,我还需要一些额外的字段。

如果我只是将字段添加到AccountImport表单,则无法正确保存,因为该表单将不再与AccountImport对象匹配。

如果我手动创建模板并以这种方式拼接额外的字段,我将丢弃管理生成器免费提供的所有内容(即格式化,“返回列表”按钮,保存按钮)。

做我想做的事情的“好”方法是什么?

2 个答案:

答案 0 :(得分:1)

如果您在generator.yml中定义其他字段,则可以覆盖其中一个管理生成器操作以处理您想要的字段。

查看 cache / YOURAPP / YOURENV / modules / autoYOURMODULE / actions / actions.class.php 中生成的 actions.class.php 。您可以在 apps / YOURAPP / modules / YOURMODULE / actions / actions.class.php 中覆盖任何这些函数,因为它继承自该缓存文件。当您对 generator.conf 进行更改时,缓存的文件会更新,但您的代码仍会覆盖它。您可能想要覆盖processForm()

我在step 5 at this blog post中有一个例子:

protected function processForm(sfWebRequest $request, sfForm $form)
{
  $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));

  if ($form->isValid())
  {
$notice = $form->getObject()->isNew() ? 'The item was created successfully.' : 'The item was updated successfully.';

// NEW: deal with tags
if ($form->getValue('remove_tags')) {
  foreach (preg_split('/\s*,\s*/', $form->getValue('remove_tags')) as $tag) {
    $form->getObject()->removeTag($tag);
  }
}
if ($form->getValue('new_tags')) {
  foreach (preg_split('/\s*,\s*/', $form->getValue('new_tags')) as $tag) {
    // sorry, it would be better to not hard-code this string
    if ($tag == 'Add tags with commas') continue;
    $form->getObject()->addTag($tag);
  }
}

try {
  $complaint = $form->save();
  // and the remainder is just pasted from the generated actions file

当我意识到我可以读取缓存中生成的文件以确切了解管理生成器正在做什么,并且我可以覆盖它们的任何部分时,它使管理生成器的使用效率提高了很多。

答案 1 :(得分:0)

我认为您已将额外字段作为小部件添加到表单对象,但是是否添加了验证程序?

无论您在表单对象中包含哪些表单字段,只要generator.yml文件不覆盖表单的设置(即您没有为[new|form|edit].display设置任何值该文件中的键)对象应该成功保存在有效输入上。