自定义表单域渲染

时间:2013-01-07 10:36:31

标签: forms symfony-2.1 sonata-admin

我想在sonata admin bundle的编辑页面中自定义表单字段的呈现,以包含使用字段文本内容的applet。

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

  • 提供字段表单模板的语法是什么
  • 放置模板文件(目录)的位置
  • 模板的外观如何。

3 个答案:

答案 0 :(得分:23)

找到解决方案

我所做的是:

  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 %}
    
  4. 现在我可以通过twig变量“value”访问表单字段值了!

    如此轻松......当你得到它时。

答案 1 :(得分:8)

除非块名称前缀与表单类型的名称匹配,否则

user1254498的解决方案将无法运行。至少使用最新版本的sonata admin bundle(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模板中的管理服务

答案 2 :(得分:4)

在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个元素的列中,而不是包含整个元素列表的一列中。

希望这对其他人有帮助。