【问题标题】:Customize form field rendering自定义表单域渲染
【发布时间】:2012-12-21 01:49:23
【问题描述】:

我想从sonata admin bundle 自定义编辑页面中表单字段的呈现,以包含一个使用字段文本内容的小程序。

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

  • 提供字段表单模板的语法是什么
  • 模板文件放在哪里(哪个目录)
  • 模板的外观。

【问题讨论】:

    标签: forms symfony-2.1 sonata-admin


    【解决方案1】:

    找到解决办法

    我所做的是:

    1. 创建了一个字段类型,我们在 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';
          }
      }
      
    2. 在 app/config/services.yml 中注册了 Type

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

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

      public function getFormTheme() {
          return array('myCompanymyBundle:Admin:myfield_edit.html.twig');
      }
      

      和模板:

      {# src/mycompany/myBundle/Resources/views/Form/myfield_edit.html.twig #}
      {% block myfield_widget %}
          {% spaceless %}
              {{ block('textarea_widget') }}
          {% endspaceless %}
      {% endblock %}
      

    现在我可以通过 twig 变量“value”访问表单字段值!

    如此简单......当你得到它时。

    【讨论】:

    • 在 Sonata 3.1 上不起作用:“属性“myfieldname”和方法之一“getMyfieldname()”、“myfieldname()”、“isMyfieldname()”、“hasMyfieldname() ", "__get()" 存在并在类中具有公共访问权限..."
    • anwser的日期是2013年,所以版本类似于SonataAdminBundle 2.xx ...
    • 是的,我只是在陈述这个事实。对于使用 Sonata 3+ 和 SF 2.8+ 的,它已经改变:你必须删除 getName() 方法;您可以忽略服务声明中的alias;您在 $formMapper->add() 方法(第二个参数)中直接使用类名(而不是别名)
    【解决方案2】:

    除非块名称前缀与表单类型的名称匹配,否则 user1254498 的解决方案将不起作用。至少在最新版本的奏鸣曲管理包(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')
        );        
    }
    

    另外,您可以使用变量sonata_admin.admim 访问twig 模板中的管理服务。

    【讨论】:

      【解决方案3】:

      在您的 services.yml 文件中,您为编辑操作定义模板:

      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 %}
      

      在这种情况下,我的国家/地区复选框出现在 60 个元素的列中,而不是在包含整个元素列表的一列中。

      希望这对其他人有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多