首先,如果问题标题有点奇怪,我很抱歉,但我不知道还有什么可以称之为......
我有这个表格类,我无法改变:
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) }}
所以我现在有点困惑。这是正确的行为吗?如果是的话,我怎么做到我需要的?文档对此有些简要......
非常感谢!
答案 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))
)
);