UserType形式:
class UserType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('email', 'email', ['label' => 'EMail']);
// various other fields....
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'validation_groups' => array('registration'),
'data_class' => 'Vendor\Model\Entity\User',
));
}
public function getName()
{
return 'form_user';
}
}
TutorType形式:
class TutorType extends Translate
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('user', new UserType(), ['label' => false]);
$builder->add('school', 'entity', [
'class' => 'Model:School',
'property' => 'name',
'label' => 'Label'
]);
// Various other fields
$builder->add('save', 'Submit');
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
//'validation_groups' => array('registration'),
'data_class' => 'Vendor\Model\Entity\Tutor',
'cascade_validation' => true,
));
}
public function getName()
{
return 'form_tutor';
}
}
[渲染时,UserType
渲染在div中,我找不到解决此问题的方法。
表单呈现为
<form name="form_tutor"
method="post"
action=""
novalidate="novalidate"
class="form-horizontal form-horizontal"
id="form_tutor">
<div id="form_tutor"
novalidate="novalidate"
class="form-horizontal">
<div class="form-group">
<div class="col-lg-10">
<div id="form_tutor_user">
<div class="form-group">
<label class="col-lg-2 control-label aaaa required"
for="form_tutor_user_email">EMail</label>
<div class="col-lg-10">
<input type="email"
id="form_tutor_user_email"
name="form_tutor[user][email]"
required="required"
class="form-control" />
</div>
</div>
</div>
</div>
</div>
<div class="form-group">
<label class="col-lg-2 control-label aaaa required"
for="form_tutor_tutorType">Type</label>
<div class="col-lg-10">
<select id="form_tutor_tutorType"
name="form_tutor[tutorType]"
class="form-control">
</select>
</div>
</div>
<div class="form-group">
<div class="col-lg-offset-2 col-lg-10">
<button type="submit"
id="form_tutor_save"
name="form_tutor[save]"
class="btn btn-default">Speichern</button>
</div>
</div><input type="hidden"
id="form_tutor__token"
name="form_tutor[_token]"
class="form-control"
value="s6i6zPxJs7KU5CiEe8i6Ahg_ca8rc2t5CnSk5yAsUhk" />
</div>
</form>
form_tutor_user
包装在自己的表格组div中。我试图覆盖form_tutor_user_widget,但这是一个很深的层次。 (并且只有一个快速修复,它应该全局应用于所有表单类型-类)
我如何更改主题,以便所有自定义类型都不会被默认的form_row模板包装?
或者我怎么知道在何时渲染“子窗体”?因此我可以决定在子节点不是子窗体时打印<div class="form-group">
,或者在这种情况下跳过它。
TIA
默认情况下,在基本表单主题中:
{% block form_row %}
{% spaceless %}
<div>
{{ form_label(form) }}
{{ form_errors(form) }}
{{ form_widget(form) }}
</div>
{% endspaceless %}
{% endblock form_row %}
并且,对于自定义复合形式:
{% block form_widget_compound %}
{% spaceless %}
<div {{ block('widget_container_attributes') }}>
{% if form.parent is empty %}
{{ form_errors(form) }}
{% endif %}
{{ block('form_rows') }}
{{ form_rest(form) }}
</div>
{% endspaceless %}
{% endblock form_widget_compound %}
除非您在此处进行了更改,否则您看到的DIV应该来自模板的一个或另一位。
但是,在您的特定示例中,如果定义了form_tutor_user_row,则从不使用第一位,而如果定义了form_tutor_user_widget,则将不使用最后一位。
返回您的问题。您的问题是:“我如何更改主题,以便所有自定义类型都不会被默认的form_row模板包装?”
这是我所看到的问题:您希望您的TOP表单(包括所有子表单的表单)在部分中都具有通用的呈现方式。每个部分都将包含在类为“ form-group”的DIV中。您可能想添加一些其他的渲染操作,但为了简化操作,我将局限于此。
然后,您需要创建一个特定的表单类型,并使所有TOP表单都从该新表单类型继承。例如:
class TopType extends AbstractType
{
public function getName()
{
return 'top_form';
}
}
...和继承的形式:
class MyFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
...
}
public function getName()
{
return 'my_form';
}
public function getParent()
{
return 'top_form';
}
}
正如您所看到的,无需进行PHP继承即可使表单主题继承起作用。
Template-theming-wise(我什至可以说吗?),如果没有为my_form设置特定的表单主题,Symfony将理解此处使用的默认表单主题是top_form] >,您可以这样定义:
{% block top_form_widget %} {% spaceless %} {% for child in form %} <div class="form-group"> {{ form_widget(child) }} </div> {% endfor %} {{ form_rest(form) }} {% endspaceless %} {% endblock top_form_widget %}
我应该补充一点,这是我已经遇到并解决的问题。告诉我这对您如何工作。
编辑:
总结起来,您要做的是:
理论上,如果您以这种方式覆盖全局表单主题中的form_widget_compound
块,则它应该可以根据需要运行:
我通常通过手动呈现嵌套表单的字段来解决此问题:
也许这不是一个很好的解决方案,但是对我有用,因为我也在努力寻找解决方案。
Bootstrap 3.3.4我最终这样做了。
尝试使用form_themes。