我有一个简单的
FormType
附加到一个名为media
的实体,我在我的视图中渲染了它。
我有一个 newAction
可以让我创建对象,还有一个 editAction
可以让我在控制器中使用相同的表单对其进行编辑。
但是我不希望某些字段出现在我的 edit
view` 中,因为我在创建它时已经输入了它们。
但即使我使用
form_row
专门逐行渲染我的表单,当我在末尾添加 form_end
时,它会渲染我的所有字段,甚至是我没有调用的字段。
我的表单类型
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', FileType::class, array(
'data_class' => null,
'label' => "Add an image"
))
->add('context', ChoiceType::class, array(
'label' => 'image section',
'choices' => array(
'header' => 'header',
'middle' => 'middle',
)
))
->add('save', SubmitType::class, array(
'label' => "Add"
));
}
我的看法
{{ form_start(editForm) }}
{{ form_row(editForm.name) }}
{{ form_row(editForm.save) }}
{{ form_end(editForm) }}
但即使我使用表单行,它实际上会在视图中显示我的
context
字段,这是我没有调用的。
所以我尝试了一些技巧来解决它。
这个有效,但是当我单击
submit
表单时,它向我显示一个错误,即 context
字段不能为空,所以这不起作用
{% do editForm.context.setRendered %}
我找到了一种使用 jQuery 隐藏表单的方法
<script>
$(document).ready(function () {
$("#media_context").parent().hide();
});
</script>
jQuery 可以工作并隐藏表单中的行。但我想知道我是否可以在不使用 jQuery 的情况下做到这一点,并且能够在我的视图中仅呈现表单的特定字段?
在 Symfony 2 中,您可以在编辑实体时从构建器中删除一些字段。您的编辑表单必须
extends
您在 Symfony 2 中的创建表单。
我认为你可以在 Symfony 3 中做同样的事情,尝试类似的东西:
class EditType extends CreateType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
$builder
->remove('context') //remove the fields that no longer needed
}
public function configureOptions(OptionsResolver $resolver)
{
/...
}
}
你不需要改变
CreateType
class Createtype extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', FileType::class, array(
'data_class' => null,
'label' => "Add an image"
))
->add('context', ChoiceType::class, array(
'label' => 'image section',
'choices' => array(
'header' => 'header',
'middle' => 'middle',
)
))
->add('save', SubmitType::class, array(
'label' => "Add"
));
}
}
来自 symfony 文档:
这个助手 (form_end) 也会输出 form_rest() 除非你将 render_rest 设置为 false。
form_rest(视图,变量)
这将呈现给定表单尚未呈现的所有字段。
{# don't render unrendered fields #}
{{ form_end(form, {'render_rest': false}) }}
试试这个
{{ form_start(editForm) }}
{{ form_row(editForm.name) }}
{{ form_row(editForm.save) }}
{{ form_end(editForm, {'render_rest': false}) }}