Forms 自定义表单字段渲染
我想从中自定义编辑页面中表单字段的呈现,以包括使用字段文本内容的小程序 我知道我必须编辑admin类中的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
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 %}