可以使用 form_theme
详细参考 How to Customize Form Rendering
可以渲染自己的form_div_layout.html.twig
考虑到你的前台和后台css主题不一样 给你一种方案 使用 compass 来修改不同bundle内的 form_div_layout.html.twig:
比如AcmeDemoBundle 在你的Acme\Bundle\DemoBundle\DependencyInjection\Compiler ( 创建目录 Compiler )目录下创建 TwigFormPass.php :
namespace Acme\Bundle\DemoBundle\DependencyInjection\Compiler;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class TwigFormPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
$resources = $container->getParameter('twig.form.resources');
$resources[] = 'StoreBackendBundle::form/form_div_layouts.html.twig';
$container->setParameter( 'twig.form.resources' , $resources );
}
}
$resources[] = 'AcmeDemoBundle::form/form_div_layouts.html.twig';
这一行给你的TwigExtension更新了form_div_layout.html.twig
这样你在bundle中渲染的form_widget都会来自于
Acme\Bundle\DemoBundle\Resources\views\form\form_div_layouts.html.twig
然后添加CompilerPass :
在你的
Acme\Bundle\DemoBundle\AcmeDemoBundle.php中加入 build(ContainerBuilder $builder)方法使compiler生效:
namespace Acme\Bundle\DemoBundle;
use Acme\Bundle\DemoBundle\DependencyInjection\Compiler\MenuRenderPass;
use Acme\Bundle\DemoBundle\DependencyInjection\Compiler\TwigFormPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class StoreBackendBundle extends Bundle
{
public function build( ContainerBuilder $container)
{
$container->addCompilerPass( new TwigFormPass() );
//add more compiler ...
}
}
最后创建form_theme:
Acme\Bundle\DemoBundle\Resources\views\form\form_div_layouts.html.twig 里面包含了一些form_widget跟form_row , widget attribute视情况加 :
{% block form_row -%}
{{- form_errors(form) -}}
{{- form_label(form) -}}
{{- form_widget(form) -}}
{%- endblock form_row %}
{% block submit_widget -%}
{% set type = type|default('submit') %}
{{- block('button_widget') -}}
{%- endblock submit_widget %}
{% block button_widget -%}
{% if label is empty -%}
{% set label = name|humanize %}
{%- endif -%}
{{ label|trans({}, translation_domain) }}
{%- endblock button_widget %}
{% block form_widget_simple -%}
{% set type = type|default('text') -%}
{%- endblock form_widget_simple %}
{% block textarea_widget -%}
{{ value }}
{%- endblock textarea_widget %}
最后在Twig中试试你的 {% form( form ) %}