避免Symfony强制显示表单域

VaN*_*VaN 10 forms symfony

我有一个表单类型,设置10个字段.在我的twig模板中,我每次显示8个字段,并且在条件中显示2个字段:

{% if computed is not empty %}
    <div class="container-filters">
        <div class="form-group">
             {{ form_row(form.filterStart) }}
        </div>
        <div class="form-group">
              {{ form_row(form.filterEnd) }}
        </div>
        <input type="submit" name="submit" class="btn btn-evo" value="OK" />
    </div>
{% endif %}
Run Code Online (Sandbox Code Playgroud)

但无论我的条件是真还是假,Symfony都会显示这两个字段.如果我的条件为真,则会因为我的{{form_row()}}语句而显示它们,这是正常行为.如果我的条件为假,则无论如何都会显示它们,因为Symfony 2强制显示表单字段.

我怎样才能防止这种奇怪的行为?

Chr*_*sen 34

我想你的代码后面有一个form_end或form_rest.

你可以告诉不要在form_end帮助器中渲染剩余的字段:

{# don't render unrendered fields #}
{{ form_end(form, {'render_rest': false}) }}
Run Code Online (Sandbox Code Playgroud)

http://symfony.com/doc/current/reference/forms/twig_reference.html

顺便说一下,我建议你在FormType中添加你的逻辑.

  • 您可以手动呈现csrf令牌:{{form_row(form._token)}} (4认同)

qoo*_*mao 8

您可以强制项目呈现为...

{% do form.filterStart.setRendered %}
{% do form.filterEnd.setRendered %}
Run Code Online (Sandbox Code Playgroud)

如果您正在使用,{{ form_end(form, {'render_rest': false}) }}那么您应该知道需要渲染CSRF令牌,除非您已经特别关闭它.

这两种方法都可能会清除模型上的值,因为它们不在发布的数据中.

或者你可以把字段放在一个隐藏的div中,但这有点hacky(然后其他方式也是如此).

正如Christophe所提到的,最好的方法是将其添加到表单逻辑中.您选择这样做的方式取决于这些字段的可用性是取决于预定因素还是来自实际模型的数据.

预定

您的表格类型

class YourFormType extends AbstractType
{
    //...

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        //...

        if ($options['your_condition']) {
            $builder
                ->add('filterStart', 'date')
                ->add('filterEnd', 'date')
            ;
        }
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            //...
            'your_condition' => false,
        ));
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)

创建表单

$form = $formFactory->create(
        // Or $this->createForm if you are using the controller
    'your_form_name', 
    $model, 
    array('your_condition' => true/false)
);
Run Code Online (Sandbox Code Playgroud)

来自模型

表格类型

class YourFormType extends AbstractType
{
    //...

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        //...

        $builder
            ->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) {
                $form = $event->getForm();
                $model = $event->getData();

                if (!$model || 'something' !== $model->getSomething()) {
                    return;
                }

                $form
                    ->add('filterStart', 'date')
                    ->add('filterEnd', 'date')
                ;
            })
        ;
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)

根据这些要求,您需要检查在模板中渲染字段时是否已创建字段,如...

{% if form.filterStart is defined and form.filterEnd is defiend %}
    <div class="container-filters">
        <div class="form-group">
            {{ form_row(form.filterStart) }}
        </div>
        <div class="form-group">
            {{ form_row(form.filterEnd) }}
        </div>
        <input type="submit" name="submit" class="btn btn-evo" value="OK" />
    </div>
{% endif %}
Run Code Online (Sandbox Code Playgroud)