我有一个名为AccountImport
的对象的表单。此表单位于管理员生成的模块中。除了直接映射到此对象属性的字段之外,我还需要一些额外的字段。
如果我只是将字段添加到AccountImport
表单,则无法正确保存,因为该表单将不再与AccountImport
对象匹配。
如果我手动创建模板并以这种方式拼接额外的字段,我将丢弃管理生成器免费提供的所有内容(即格式化,“返回列表”按钮,保存按钮)。
做我想做的事情的“好”方法是什么?
答案 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
设置任何值该文件中的键)对象应该成功保存在有效输入上。