表单类型默认值为呈现形式的空值

时间:2014-06-25 09:59:55

标签: forms symfony

我发现了渲染控制器的一些奇怪的行为,显示了我的实体的编辑表单。

但首先要做的事情是:

我正在渲染一个显示实体的模板。如果登录用户与该实体的所有者是同一用户,我还会渲染另一个隐藏的控制器,其中包含该实体的编辑表单。用户可以通过触发jQuery切换的按钮来访问它。

该实体有2个文本字段,可以是空的,描述和情况。

  • 因此,如果其中一个或两个都为空,则默认情况下,编辑表单将显示在文本域(null)中。我不要那个!如何解决这个问题,以便文本字段为空,就像字段的值一样(这样我的占位符就会显示出来)。

这是一张可视化的图片:

Description Textfield = (null)

但进一步说明:这个实体(Poi)属于另一个实体(转),所以1转 - >很多Pois。您可以在我的网站中浏览pois。

但是如果所有者浏览它们(请记住,编辑表单将被呈现,但在按钮被点击之前不会显示)所有描述和情境字段现在都显示(null),即使他没有保存编辑。它只是自己发生。

这是显示它的图像

Description = (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>

2 个答案:

答案 0 :(得分:1)

您可以在表单类型中设置空数据属性:

Symfony documentation

$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事件,因为我想在将数据写入表单之前对其进行操作!