【发布时间】:2012-12-21 01:49:23
【问题描述】:
我想从sonata admin bundle 自定义编辑页面中表单字段的呈现,以包含一个使用字段文本内容的小程序。
我知道我必须在 admin 类中编辑configureFormFields 函数,但我需要知道 3 件事:
- 提供字段表单模板的语法是什么
- 模板文件放在哪里(哪个目录)
- 模板的外观。
【问题讨论】:
标签: forms symfony-2.1 sonata-admin
我想从sonata admin bundle 自定义编辑页面中表单字段的呈现,以包含一个使用字段文本内容的小程序。
我知道我必须在 admin 类中编辑configureFormFields 函数,但我需要知道 3 件事:
【问题讨论】:
标签: forms symfony-2.1 sonata-admin
找到解决办法
我所做的是:
创建了一个字段类型,我们在 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 中注册了 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”访问表单字段值!
如此简单......当你得到它时。
【讨论】:
getName() 方法;您可以忽略服务声明中的alias;您在 $formMapper->add() 方法(第二个参数)中直接使用类名(而不是别名)
除非块名称前缀与表单类型的名称匹配,否则 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 模板中的管理服务。
【讨论】:
在您的 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 个元素的列中,而不是在包含整个元素列表的一列中。
希望这对其他人有帮助。
【讨论】: