Symfony:如何避免自动包装在div中的自定义表单类型?

前端之家收集整理的这篇文章主要介绍了Symfony:如何避免自动包装在div中的自定义表单类型?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
UserType表单:
  1. class UserType
  2. {
  3. public function buildForm(FormBuilderInterface $builder,array $options)
  4. {
  5. $builder->add('email','email',['label' => 'EMail']);
  6. // varIoUs other fields....
  7. }
  8.  
  9. public function setDefaultOptions(OptionsResolverInterface $resolver)
  10. {
  11. $resolver->setDefaults(array(
  12. 'validation_groups' => array('registration'),'data_class' => 'Vendor\Model\Entity\User',));
  13. }
  14.  
  15. public function getName()
  16. {
  17. return 'form_user';
  18. }
  19. }

TutorType表格:

  1. class TutorType extends Translate
  2. {
  3. public function buildForm(FormBuilderInterface $builder,array $options)
  4. {
  5. $builder->add('user',new UserType(),['label' => false]);
  6.  
  7. $builder->add('school','entity',[
  8. 'class' => 'Model:School','property' => 'name','label' => 'Label'
  9. ]);
  10.  
  11. // VarIoUs other fields
  12. $builder->add('save','Submit');
  13. }
  14.  
  15. public function setDefaultOptions(OptionsResolverInterface $resolver)
  16. {
  17. $resolver->setDefaults(array(
  18. //'validation_groups' => array('registration'),'data_class' => 'Vendor\Model\Entity\Tutor','cascade_validation' => true,));
  19. }
  20.  
  21. public function getName()
  22. {
  23. return 'form_tutor';
  24. }
  25. }

渲染时,UserType在div中呈现,我无法找到克服这个问题的方法.

表格呈现为

  1. <form name="form_tutor"
  2. method="post"
  3. action=""
  4. novalidate="novalidate"
  5. class="form-horizontal form-horizontal"
  6. id="form_tutor">
  7. <div id="form_tutor"
  8. novalidate="novalidate"
  9. class="form-horizontal">
  10. <div class="form-group">
  11. <div class="col-lg-10">
  12. <div id="form_tutor_user">
  13. <div class="form-group">
  14. <label class="col-lg-2 control-label aaaa required"
  15. for="form_tutor_user_email">EMail</label>
  16.  
  17. <div class="col-lg-10">
  18. <input type="email"
  19. id="form_tutor_user_email"
  20. name="form_tutor[user][email]"
  21. required="required"
  22. class="form-control" />
  23. </div>
  24. </div>
  25. </div>
  26. </div>
  27. </div>
  28.  
  29. <div class="form-group">
  30. <label class="col-lg-2 control-label aaaa required"
  31. for="form_tutor_tutorType">Type</label>
  32.  
  33. <div class="col-lg-10">
  34. <select id="form_tutor_tutorType"
  35. name="form_tutor[tutorType]"
  36. class="form-control">
  37. </select>
  38. </div>
  39. </div>
  40.  
  41. <div class="form-group">
  42. <div class="col-lg-offset-2 col-lg-10">
  43. <button type="submit"
  44. id="form_tutor_save"
  45. name="form_tutor[save]"
  46. class="btn btn-default">Speichern</button>
  47. </div>
  48. </div><input type="hidden"
  49. id="form_tutor__token"
  50. name="form_tutor[_token]"
  51. class="form-control"
  52. value="s6i6zPxJs7KU5CiEe8i6Ahg_ca8rc2t5CnSk5yAsUhk" />
  53. </div>
  54. </form>

form_tutor_user包含在自己的表单组div中.
我试图覆盖form_tutor_user_widget,但这是一个很深的层次. (只有快速修复,它应全局应用于所有表单类型 – 类)

如何更改主题,以便所有自定义类型都不使用默认的form_row模板包装?

或者在呈现“子表单”时如何知道?
所以我可以决定打印< div class =“form-group”>当子节点不是子表单时,或者跳过它,如果是这种情况.

TIA

解决方法

默认情况下,在基本表单主题中:
  1. {% block form_row %}
  2. {% spaceless %}
  3. <div>
  4. {{ form_label(form) }}
  5. {{ form_errors(form) }}
  6. {{ form_widget(form) }}
  7. </div>
  8. {% endspaceless %}
  9. {% endblock form_row %}

并且,对于自定义复合形式:

  1. {% block form_widget_compound %}
  2. {% spaceless %}
  3. <div {{ block('widget_container_attributes') }}>
  4. {% if form.parent is empty %}
  5. {{ form_errors(form) }}
  6. {% endif %}
  7. {{ block('form_rows') }}
  8. {{ form_rest(form) }}
  9. </div>
  10. {% endspaceless %}
  11. {% endblock form_widget_compound %}

除非你在这里改变了一些东西,否则你看到的DIV应该来自模板的一个或另一个.

但是,在您的特定示例中,如果定义了form_tutor_user_row,则从不使用第一个位,如果定义了form_tutor_user_widget,则永远不会使用最后一位.

回到你的问题.你的问题是:
“我如何更改主题,以便所有自定义类型都不会使用默认的form_row模板包装?”

这是我看到它的方式的问题:你希望你的TOP表单(包含所有子表单的表单)都有一个共同的渲染方式,分段.每个部分都将包含在DIV中,其中class =“form-group”.您可能想要进行一些额外的渲染操作,但我将自己限制在此以保持简单.

您需要做的是创建一个特定的表单类型,并使所有的TOP表单继承自这种新的表单类型.例如:

  1. class TopType extends AbstractType
  2. {
  3. public function getName()
  4. {
  5. return 'top_form';
  6. }
  7. }

……和一个继承的形式:

  1. class MyFormType extends AbstractType
  2. {
  3. public function buildForm(FormBuilderInterface $builder,array $options)
  4. {
  5. ...
  6. }
  7.  
  8. public function getName()
  9. {
  10. return 'my_form';
  11. }
  12.  
  13. public function getParent()
  14. {
  15. return 'top_form';
  16. }
  17. }

正如您所看到的,没有必要使PHP继承形成主题继承来工作.

模板 – 主题明智(我甚至可以这么说吗?),如果没有为my_form设置特定的表单主题,Symfony会理解这里使用的默认表单主题是top_form的表单主题,您可以这样定义:

  1. {% block top_form_widget %}
  2. {% spaceless %}
  3. {% for child in form %}
  4. <div class="form-group">
  5. {{ form_widget(child) }}
  6. </div>
  7. {% endfor %}
  8. {{ form_rest(form) }}
  9. {% endspaceless %}
  10. {% endblock top_form_widget %}

我应该补充一点,这是我遇到并解决的问题.告诉我这对你有什么用.

编辑:

总结一下,你要做的是:

>创建TopType表单类型,>在表单主题添加top_form_widget块,>对于所有根表单(即顶级表单,没有父表单的表单),添加一个getParent()方法,该方法将返回TopType表单的名称(“top_form”)

猜你在找的CSS相关文章