【问题标题】:Symfony: How to pass Doctrine Collection to Form as default values?Symfony:如何将 Doctrine Collection 作为默认值传递给 Form?
【发布时间】:2011-08-04 17:17:29
【问题描述】:

我的行动:

public function executeEdit(sfWebRequest $request)
{
    // Get the object
    $article = $this->getRoute()->getObject();

    // Create the form
    $this->form = new ArticleEditForm( $article );
}

您可以看到 $article 是作为默认值传递给表单的 Doctrine 集合。 $article 对象包含“标题”、“文本”、“作者”等字段。

但这会导致表单创建出错:

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 的开发人员足够聪明,可以提出一个好的解决方案,但我就是找不到...有什么线索吗?

【问题讨论】:

    标签: php symfony1 symfony-forms


    【解决方案1】:

    这个问题是关于你的表单没有创建_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>
    

    【讨论】:

    • 这是不正确的。 CSRF 令牌由表单创建。它使用您建议的上述代码或在您的模板中使用echo $form-&gt;renderHiddenFields(); 呈现。无论您是否选择渲染,错误仍然存​​在。
    【解决方案2】:

    我发现了我的问题。我的自定义表单正在扩展BaseForm。一旦我将其更改为扩展 BaseArticleForm,我就能够成功地将文章 Doctrine Collections 作为默认值传递。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多