即使我不想要它,Symfony2表单类也会呈现所有行

时间:2014-05-14 21:12:15

标签: forms symfony

首先,如果问题标题有点奇怪,我很抱歉,但我不知道还有什么可以称之为......

我有这个表格类,我无法改变:

class ItemDetailType extends AbstractType {


/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder
        ->add('name', 'text', array(
            'label' => 'Název'))
        ->add('room', 'entity', array(
                'class' => 'CvutFitIctCtuIdentityBundle:Room',
                'label' => 'Místnost'))
        ->add('person', 'entity', array(
                'class' => 'CvutFitIctCtuIdentityBundle:Person',
                'label' => 'Osoba'))
        ->add('organizationalUnit', 'entity', array(
            'class' => 'CvutFitIctCtuIdentityBundle:OrganizationalUnit',
            'label' => 'Organizační jednotka'))
        ;
    $builder->setAttribute('attr', array());
    if (isset($options['render_submit']) && $options['render_submit'])
        $builder
            ->add('submit', 'submit', array(
                'label' => 'Uložit',
                'attr' => array('class' => 'btn btn-success')))
            ->add('reset', 'reset', array(
                'label' => 'Zrušit',
                'attr' => array('class' => 'btn btn-danger')))
    ;
}

/**
 * @param OptionsResolverInterface $resolver
 */
public function setDefaultOptions(OptionsResolverInterface $resolver) {
    $resolver->setDefaults(array(
            'data_class' => 'Cvut\Fit\BiWt2\InventoryBundle\Entity\Item',
            'render_submit' => true,
            'attr' => array(
                    'role' => 'form',
                    'class' => 'form-horizontal'
            )
    ));
}

/**
 * @return string
 */
public function getName() {
    return 'cvut_fit_biwt2_inventory_form_item';
}
}

但是在模板中,我只需要渲染一些行( room person organizationalUnit submit < / em>),而不是呈现名称重置。这是我必须满足的条件,所以编辑课程不是一个有效的选择。

在控制器中我创建如下形式:

$form = $this->createForm(
    new ItemDetailType, $item, array(
        'action' => $this->generateUrl('items_detail_form', array('id' => $id)),
        'render_submit' => true
    )
);

我尝试以这种方式只渲染所需的行,但它只会使表单处于顶部,而其余两个仍然会在其下呈现...

{{ form_start(form) }}
    {{ form_errors(form) }}

    {{ form_row(form.room) }}
    {{ form_row(form.person) }}
    {{ form_row(form.organizationalUnit) }}
    {{ form_row(form.submit) }}
{{ form_end(form) }}

所以我现在有点困惑。这是正确的行为吗?如果是的话,我怎么做到我需要的?文档对此有些简要......

非常感谢!

3 个答案:

答案 0 :(得分:16)

在symfony2中,默认行为为:

{{ form_end(form) }}

是渲染所有(甚至之前未提及的)字段,如

{{ form_rest(form) }}

如果要阻止此行为,请使用以下选项:

</form>

或更好的方式,如本文档http://symfony.com/doc/current/reference/forms/twig_reference.html#form-end-view-variables

{{ form_end(form, {'render_rest': false}) }}

如果以这种方式执行此操作,请记住手动呈现CSRF令牌:

{{ form_widget(form._token) }}

答案 1 :(得分:1)

使用

怎么样?
{% do form.name.setRendered %}
{% do form.reset.setRendered %}

即使这些字段不是

,也会显示字段

答案 2 :(得分:0)

我很困惑你到底想要在这里实现什么。但这里有一些想法:

如果需要,您可以创建一个扩展此表单类型的新表单类型。

class ShorterItemDetailType extends ItemDetailType
{
    public function buildForm(FormBuilderInterface $builder, array $options) {
        // only add the fields you want
    }

    public function getParent() {
        return 'cvut_fit_biwt2_inventory_form_item'
    }

    /**
     * @return string
     */
    public function getName() {
        return 'cvut_fit_biwt2_inventory_form_item_shorter';
    }

}

在你的控制器中使用这个。

$form = $this->createForm(
    new ShorterItemDetailType(), $item, array(
        'action' => $this->generateUrl('items_detail_form', array('id' => $id))
    )
);