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表单(包含所有子表单的表单)都有一个共同的渲染方式,分段.每个部分都将包含在DIV中,其中class =“form-group”.您可能想要进行一些额外的渲染操作,但我将自己限制在此以保持简单.
您需要做的是创建一个特定的表单类型,并使所有的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'; } }
模板 – 主题明智(我甚至可以这么说吗?),如果没有为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 %}
我应该补充一点,这是我遇到并解决的问题.告诉我这对你有什么用.
编辑:
总结一下,你要做的是:
>创建TopType表单类型,>在表单主题中添加top_form_widget块,>对于所有根表单(即顶级表单,没有父表单的表单),添加一个getParent()方法,该方法将返回TopType表单的名称(“top_form”)