EntityType::class 表单字段 symfony 3 中未设置所选选项

Selected option not set in EntityType::class formfield symfony3

我对使用像 symfony 这样的框架还很陌生,但我必须说我很快就变成了粉丝。不幸的是,我连续几天完全陷入困境。

背景
我正在尝试将我的老式 php CMS 重构为 symfony3 框架。用户可以通过添加和编辑页面来管理他的页面。向数据库添加一个新页面就像一个魅力。编辑页面也可以正常工作,除了其中的一小部分。表单预填所有字段,post 将编辑实体。

但是...出于某种原因,selectbox 不会预先 select 使用 selected 模板类型。此列表是使用 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();

最近几天我尝试了所有我能想到的可能性 google。我还检查了以下内容:

目前我没有可能的解决方案,希望有人能提供帮助。它可能很简单,但我只是再也看不到它了。

--更新--
刚刚在生成的表单的 vardump 中发现以下不一致。在 'name'-object 中,您会看到预填充的 modelData、normData 和 viewData。但是 'templateId' 缺少 viewData 中的内容。

screenshot vardump formbuilder

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

View Data - This is the format that's used to fill in the form fields themselves. It's also the format in which the user will submit the data. When you call Form::submit($data), the $data is in the "view" data format. Source

这可能是解决问题的线索。

--更新2--
只是将 \vendor\symfony\symfony\src\Symfony\Component\Form\Form.php 中的 $this->viewData 硬编码为 select 框中存在的硬编码值。如上面的更新中所述,这会为空设置添加一个值。现在默认值得到 selected 了。我将在代码中跟踪这个变量。希望能找到没有预填的原因

其实choice_value是可调用的,所以你可以做一个函数:

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

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

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

在我的 EntityType 设置中,我现在将 'data' => $page, 作为一个额外的对象传递给 formbuilder。这导致 viewData 被填充了一个值,这就是我在页面加载时获得预选选择框所需要的。

这是最后的片段:

            ->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,
        ))