我非常擅长使用像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();
最近几天我尝试了所有可能的想法和谷歌。我还检查了以下内容:
在他的时刻,我已经摆脱了可能的解决方案,希望有人可以提供帮助。它可能是如此简单,但我只是不再看到它了。
- 更新 -
刚刚在生成的表单的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硬编码为选择框中存在的硬编码值。这会在上面的更新中提到的空设置中添加一个值。现在,默认值将被选中。我将在代码中遵循此变量。希望找到它没有预先填充的原因。
答案 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,
))