我的行动:
public function executeEdit(sfWebRequest $request)
{
// Get the object
$article = $this->getRoute()->getObject();
// Create the form
$this->form = new ArticleEditForm( $article );
}
您可以看到$article
是作为默认值传递给Form的Doctrine Collection。 $article
对象包含“title”,“text”,“author”等字段
但这会导致表单创建错误:
500 | Internal Server Error | Doctrine_Record_UnknownPropertyException
Unknown record property / related component "_csrf_token" on "article"
基本上,表单试图使用Doctrine Collection来填充表单元素的默认值。但显然在该对象中没有csrf_token
......但它仍然试图找到一个用作默认值......
如果您的表单中总是有空的空字段为空但其他字段已传递默认值,会发生什么情况。如果这些空字段在Doctrine Collection中没有设置值,则会出现错误...
现在,显然我可以提前创建一个简单的数组,在此我指定默认值并传递:
$defaults = array( 'title' => $article->title, 'text' => $article->text, 'author' => $article->author );
$this->form = new ArticleEditForm( $defaults);
这很有效。我的问题是,出于简化的原因,上述“文章”是一个例子。实际上,我的表格中有大约30个字段。因此,此解决方案的唯一方法是必须在数组中手动指定30个单独的默认值。从维护的角度来看,这显然是一个糟糕的解决方案。
我认为Symfony开发人员足够聪明,可以提出一个很好的解决方案,但我找不到它......任何线索?
答案 0 :(得分:0)
这个问题是关于你的表单没有创建_csrf_token。您可以在模板页面中创建表单时添加它,如:
<?php
echo $form->renderFormTag(url_for('article/edit'))
echo $form->render();
?>
<input type="hidden" name="form[_csrf_token]" value="<?= $form->getCSRFToken(); ?>">
<input type="submit" value="Submit" />
</form>
答案 1 :(得分:0)
我发现了我的问题。我的自定义表单正在扩展BaseForm
。一旦我将其更改为扩展BaseArticleForm
,我就能够成功地将文章Doctrine Collections作为默认值传递。