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

Voj*_*jda 3 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';
}
}
Run Code Online (Sandbox Code Playgroud)

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

在控制器中我创建这样的表单:

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

我试图以这种方式只渲染所需的行,但它只使得在表单顶部进行,其余两个仍在其下呈现...

{{ 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) }}
Run Code Online (Sandbox Code Playgroud)

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

非常感谢你!

Kar*_*ski 16

在symfony2中,默认行为为:

{{ form_end(form) }}
Run Code Online (Sandbox Code Playgroud)

是渲染所有(甚至没有提到过)字段之类的

{{ form_rest(form) }}
Run Code Online (Sandbox Code Playgroud)

如果要防止此行为,则使用一个选项:

</form>
Run Code Online (Sandbox Code Playgroud)

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

{{ form_end(form, {'render_rest': false}) }}
Run Code Online (Sandbox Code Playgroud)

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

{{ form_widget(form._token) }}
Run Code Online (Sandbox Code Playgroud)