我发现了渲染控制器的一些奇怪的行为,显示了我的实体的编辑表单。
但首先要做的事情是:
我正在渲染一个显示实体的模板。如果登录用户与该实体的所有者是同一用户,我还会渲染另一个隐藏的控制器,其中包含该实体的编辑表单。用户可以通过触发jQuery切换的按钮来访问它。
该实体有2个文本字段,可以是空的,描述和情况。
(null)
中。我不要那个!如何解决这个问题,以便文本字段为空,就像字段的值一样(这样我的占位符就会显示出来)。这是一张可视化的图片:
但进一步说明:这个实体(Poi)属于另一个实体(转),所以1转 - >很多Pois。您可以在我的网站中浏览pois。
但是如果所有者浏览它们(请记住,编辑表单将被呈现,但在按钮被点击之前不会显示)所有描述和情境字段现在都显示(null)
,即使他没有保存编辑。它只是自己发生。
这是显示它的图像
empty value
选项的内容?我搜索了一个解决方案,但我找不到任何与我的情况差不多的东西。
从我的表单类型构建表单:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', 'text', array(
'required' => false
))
->add('situation', 'textarea', array(
'required' => false
))
->add('description', 'textarea', array(
'required' => false
))
->add('isPrivateText', 'checkbox', array(
'required' => false
))
->add('isPrivateImage', 'checkbox', array(
'required' => false
))
;
}
edit.html.twig的相关部分
<p class="edit_form"><span class="edit_left">{{ form_label(edit_form.situation, 'Situation') }} </span>
<span class="edit_right">{{ form_widget(edit_form.situation, { attr: {'placeholder': 'Törn Situation'} }) }}</span></p>
<p class="edit_form"><span class="edit_left">{{ form_label(edit_form.description, 'Beschreibung') }} </span>
<span class="edit_right">{{ form_widget(edit_form.description, { attr: {'placeholder': 'Törn Beschreibung'} }) }}</span></p>
我的showPoi.html.twig渲染表单控制器:
<div class="col-md-6 col-sm-6 toggle_edit" style="display: none;">
<div>
{% render controller('MysailinglogMysailinglogBundle:Poi:edit', { id: poi[0].id , poi: poi}) %}
<!-- Don't worry about the 2 divs, i just shortened up the code -->
</div>
</div>
答案 0 :(得分:1)
您可以在表单类型中设置空数据属性:
$builder->add('description', 'textarea', array(
'required' => false,
'empty_value' => 'Choose your gender',
'empty_data' => null
));
答案 1 :(得分:1)
经过大量研究后,我找到了一个工作正常的解决方案
我正在为我的formType添加一个监听器,这会导致以下功能:
function onPreSetData(FormEvent $event) {
$data = $event->getData();
if($data->getDescription() == "(null)"){
$data->setDescription('');
}
if($data->getSituation() == "(null)"){
$data->setSituation('');
}
return $event->setData($data);
}
它只是从构建表单的事件中获取数据,而不仅仅是Poi实体。我只是检查值是否为(null)
,如果是,我将其设置为空字符串。
注册监听器也很简单,只需使用以下简单的代码:
$builder->addEventListener(FormEvents::PRE_SET_DATA, array($this, 'onPreSetData'));
这必须使用FormBuilder的一个实例来完成,"onPreSetData"
必须与上面的函数同名,该函数将由事件触发。
重要的是要提到事件在这种情况下必须是PRE_SET_DATA
事件,因为我想在将数据写入表单之前对其进行操作!