Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Forms 自定义表单字段渲染_Forms_Symfony 2.1_Sonata Admin - Fatal编程技术网

Forms 自定义表单字段渲染

Forms 自定义表单字段渲染,forms,symfony-2.1,sonata-admin,Forms,Symfony 2.1,Sonata Admin,我想从中自定义编辑页面中表单字段的呈现,以包括使用字段文本内容的小程序 我知道我必须编辑admin类中的configureFormFields函数,但我需要知道3件事: 提供字段表单模板的语法是什么 模板文件的放置位置(哪个目录) 模板必须是什么样子的 找到了解决方案 我所做的是: 创建了一个字段类型,让我们在myCompany\myBundle\Form\type\myfieldType.php中将其称为myfieldType namespace myCompany\myBundle\For

我想从中自定义编辑页面中表单字段的呈现,以包括使用字段文本内容的小程序

我知道我必须编辑admin类中的
configureFormFields
函数,但我需要知道3件事:

  • 提供字段表单模板的语法是什么
  • 模板文件的放置位置(哪个目录)
  • 模板必须是什么样子的
    • 找到了解决方案

      我所做的是:

    • 创建了一个字段类型,让我们在myCompany\myBundle\Form\type\myfieldType.php中将其称为myfieldType

      namespace myCompany\myBundle\Form\Type;
      
      use Symfony\Component\Form\AbstractType;
      use Symfony\Component\Form\FormBuilder;
      
      class myfieldType extends AbstractType
      {
      
          public function getParent()
          {
              return 'text';
          }
      
          public function getName()
          {
              return 'myfield';
          }
      }
      
    • 在app/config/services.yml中注册了该类型

      myCompany.myBundle.form.type.myfield:
          class: myCompany\myBundle\Form\Type\myfieldType
          tags:
              - { name: form.type, alias: myfield }
      
    • 在我的myentityAdmin课程中

       protected function configureFormFields(FormMapper $formMapper)
       {
           $formMapper
           ->add('myfieldname', 'myfield')
           ...
       }
      

      以及模板:

      {# src/mycompany/myBundle/Resources/views/Form/myfield_edit.html.twig #}
      {% block myfield_widget %}
          {% spaceless %}
              {{ block('textarea_widget') }}
          {% endspaceless %}
      {% endblock %}
      
    • 现在我可以通过细枝变量“value”访问表单字段值了


      这么简单。。。当您得到它时。

      user1254498的解决方案将无法工作,除非块名称前缀与表单类型的名称匹配。至少是最新版本的sonata管理包(2.2.12)。在这种情况下:

      {# src/mycompany/myBundle/Resources/views/Form/myfield_edit.html.twig #}
      {% block myfield_widget %}
          {% spaceless %}
              {{ block('textarea_widget') }}
          {% endspaceless %}
      {% endblock %}
      
      而且,关于
      getFormTheme()
      ,您还应该返回父主题,否则可能会破坏整个样式

      public function getFormTheme()
      {
          return array_merge(
                  parent::getFormTheme(), array(
                'mycompanyBundle:Form:myfield_edit.html.twig')
          );        
      }
      

      此外,您还可以使用services.yml文件中的变量
      sonata_admin.admim

      访问twig模板中的管理服务。您可以为编辑操作定义模板:

      app.admin.product:
          class: AppBundle\Admin\ProductAdmin
          arguments: [~, AppBundle\Entity\Product, AppBundle:Admin\Product]
          tags:
              - {name: sonata.admin, manager_type: orm, group: Products, label: Products}
          calls:
              - [ setTemplate, [edit, AppBundle:Product:edit.html.twig]]
      
      在该模板中,您可以覆盖表单中字段的模板:

      {% extends 'SonataAdminBundle:CRUD:base_edit.html.twig' %}
      
      {% form_theme form.selectall 'AppBundle:Form:selectall.html.twig' %}
      {% form_theme form.Country 'AppBundle:Form:country.html.twig' %}
      
      然后,我的模板如下所示:

      {% block form_row %}
      <div class="form-group">
      {{ form_label(form) }}
      {% set c = 0 %}
      {% for i in form %}
          {% set c = c+1 %}
          {% if (c == 1) %}
              <div style="float: left; width: 20%;">
          {% endif%}
          {{ form_row(i) }}
          {% if ((c == 60) or (form|length == loop.index)) %}
              </div>
              {% set c = 0 %}
          {% endif%}
      {% endfor %}
      </div>
      {% endblock form_row %}
      
      {%block form_row%}
      {{form_标签(form)}
      {%set c=0%}
      {表格%中的i为%1}
      {%set c=c+1%}
      {%if(c==1)%}
      {%endif%}
      {{表_行(i)}
      {%if((c==60)或(form | length==loop.index))%}
      {%set c=0%}
      {%endif%}
      {%endfor%}
      {%endblock form_row%}
      
      在本例中,“我的国家”复选框显示在包含60个元素的列中,而不是包含整个元素列表的一列中


      希望这对其他人有帮助。

      在Sonata 3.1上不起作用:“属性“myfieldname”和方法“getMyfieldname()”、“myfieldname()”、“isMyfieldname()”、“hasMyfieldname()”、“uu get()”都不存在,并且在类中具有公共访问权……”anwser的日期是2013年,因此版本类似于SonataAdminBundle 2.xx……是的,我只是在陈述这个事实。对于那些使用索纳塔3+和SF 2.8+的人,它已经改变了:你必须删除
      getName()
      方法;您可以忽略服务声明中的
      别名
      ;在
      $formMapper->add()
      方法(第二个参数)中直接使用类名(而不是别名)
      {% block form_row %}
      <div class="form-group">
      {{ form_label(form) }}
      {% set c = 0 %}
      {% for i in form %}
          {% set c = c+1 %}
          {% if (c == 1) %}
              <div style="float: left; width: 20%;">
          {% endif%}
          {{ form_row(i) }}
          {% if ((c == 60) or (form|length == loop.index)) %}
              </div>
              {% set c = 0 %}
          {% endif%}
      {% endfor %}
      </div>
      {% endblock form_row %}