[英]Customize form field rendering
我想在sonata管理包中自定义编辑页面中表单字段的呈现,以包含使用字段文本内容的applet。
我知道我必须在admin类中编辑configureFormFields
函数,但我需要知道3件事:
找到了解决方案
我所做的是:
创建一个字段类型,让myfieldType叫它myCompany的\\ myBundle \\表格\\型号\\ myfieldType.php
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中注册了Type
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') ... }
和
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”访问表单字段值!
很容易......当你得到它。
除非块名称前缀与表单类型的名称匹配,否则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
模板中的管理服务。
在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个元素的列中,而不是在包含整个元素列表的一列中。
希望这对其他人有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.