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。我还检查了以下内容:
- templateId在加载版本库后填充了一个值。当我将字段更改为纯文本字段时,会显示该值。
- AppBundle:Templates returns 唯一值(数据库中只有两个实体的 ID 为 1 和 2)
- selected="selected" 属性在 posting(而不是重定向)
时设置
- 删除 cashe 并不能解决问题
目前我没有可能的解决方案,希望有人能提供帮助。它可能很简单,但我只是再也看不到它了。
--更新--
刚刚在生成的表单的 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,
))
我对使用像 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。我还检查了以下内容:
- templateId在加载版本库后填充了一个值。当我将字段更改为纯文本字段时,会显示该值。
- AppBundle:Templates returns 唯一值(数据库中只有两个实体的 ID 为 1 和 2)
- selected="selected" 属性在 posting(而不是重定向) 时设置
- 删除 cashe 并不能解决问题
目前我没有可能的解决方案,希望有人能提供帮助。它可能很简单,但我只是再也看不到它了。
--更新--
刚刚在生成的表单的 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,
))