未在EntityType :: class formfield中设置所选选项symfony3

时间:2016-12-13 23:22:25

标签: php doctrine symfony formbuilder

我非常擅长使用像symfony这样的框架,但我必须说我很快就会变成一个粉丝。不幸的是,我连续几天完全陷入困境。

上下文
我正在尝试将我的旧式php CMS重构为symfony3框架。用户可以通过添加编辑来管理他的页面。向数据库添加新页面就像魅力一样。编辑页面也很好,除了它的一小部分。表单预填充了它应该的字段,并且帖子将编辑实体。

但是......由于某种原因,选择框不会预先选择所选的模板类型。此列表使用EntityType :: class构建,并使用AppBundle:Templates从数据库中获取可用数据。

我用来加载和构建表单的一段代码:

    // Fetch selected page
    $page = $this->getDoctrine()->getRepository('AppBundle:PageMan')->find($id);        

    // Generate form
    $form = $this->createFormBuilder($page)
      ->add('templateId', EntityType::class, array(
        'label' => 'Template type',
        'class' => 'AppBundle:Templates',
        'placeholder' => 'Kies een template',
        'choice_label' => 'name',
        'choice_value' => 'id',
        'multiple' => false,
        'expanded' => false,
        'required' => true,
       ))->getForm();

最近几天我尝试了所有可能的想法和谷歌。我还检查了以下内容:

  • templateId 在加载存储库后填充了一个值。当我将字段更改为纯文本字段时,将显示该值。
  • AppBundle:模板返回唯一值(数据库中只有两个实体,ID为1和2)
  • 在发布(而不是重定向)
  • 时设置selected =“selected”属性
  • 删除cashe无法解决问题

在他的时刻,我已经摆脱了可能的解决方案,希望有人可以提供帮助。它可能是如此简单,但我只是不再看到它了。

- 更新 -
刚刚在生成的表单的vardump中发现以下不一致。在'name'对象中,您可以看到预填充的modelData,normData和viewData。但'templateId'错过了viewData中的内容。

screenshot vardump formbuilder

在symfony的文档中,它说明了以下内容:

  

查看数据 - 这是用于填写表单字段本身的格式。它也是用户提交数据的格式。当您调用Form :: submit($ data)时,$ data采用“view”数据格式。 Source

这可能是解决问题的可能途径。

- 更新2 -
只需在\ vendor \ symfony \ symfony \ src \ Symfony \ Component \ Form \ Form.php中将$ this-> viewData硬编码为选择框中存在的硬编码值。这会在上面的更新中提到的空设置中添加一个值。现在,默认值将被选中。我将在代码中遵循此变量。希望找到它没有预先填充的原因。

2 个答案:

答案 0 :(得分:1)

实际上choice_value是可调用的,因此您可以创建一个函数:

'choice_value' => function($page){
    return strval( $page->getId() );
}

我认为这可能适用于这种情况。请试一试。

答案 1 :(得分:0)

最后解决了我的问题。不知道这是否是官方的方式,但就我而言,它就像一个魅力。

在我的EntityType设置中,我现在将'data' => $page,作为额外对象传递给formbuilder。这导致viewData被填充了一个值,这就是我需要在pageload上获得一个pre-selectid选择框。

这里是最后的片段:

            ->add('templateId', EntityType::class, array(
            'label' => 'Template type',
            'class' => TemplateMan::class,
            'placeholder' => 'Kies een template',
            'choice_label' => 'name',
            'choice_value' => 'templateId',
            'data' => $page,
            'data_class' => null,
            'multiple' => false,
            'expanded' => false,
            'required' => true,
        ))