Forms 不同子网站的symfony2细枝形式主题

Forms 不同子网站的symfony2细枝形式主题,forms,symfony,twig,Forms,Symfony,Twig,我有一个具有多种风格的symfony2应用程序。所有3个都有自己的html+css用于渲染。 类似于“frontsite”、“用户仪表板”和“管理后端” 现在,在所有3个子网站中使用的表单主题都有所不同,因此它们的主题都(稍微)不同 因此,我可以在symfony配置中设置主题,但对于3个子网站中的2个子网站,它将是错误的 我可以使用以下方法手动设置主题: {% form_theme form 'MyUberCoolBundle:Form:theme.html.twig' %} 但我并不是真的想

我有一个具有多种风格的symfony2应用程序。所有3个都有自己的html+css用于渲染。 类似于“frontsite”、“用户仪表板”和“管理后端”

现在,在所有3个子网站中使用的表单主题都有所不同,因此它们的主题都(稍微)不同

因此,我可以在symfony配置中设置主题,但对于3个子网站中的2个子网站,它将是错误的

我可以使用以下方法手动设置主题:

{% form_theme form 'MyUberCoolBundle:Form:theme.html.twig' %}
但我并不是真的想对每一种形式都这么做。 我可以在基本模板中设置,但是我的表单总是需要称为“表单”


有没有办法设置要在基本模板中使用的主题,以便它将用于所有表单?

要为应用程序设置全局主题,可以在配置中进行设置

twig:
    form_themes:

        # Default:
        - form_div_layout.html.twig

        # Bootstrap:
        - bootstrap_3_layout.html.twig
        - bootstrap_3_horizontal_layout.html.twig

        # Example:
        - MyBundle::form.html.twig

查看完整的细枝配置参考

在四处寻找答案后,我得出结论,仅在配置中不可能做到这一点

我们采取了以下解决办法

在config.yml中,我们配置了一个全局细枝变量:

twig:
    globals:
        frontend_form_theme:          'MyUberCoolBundle:Form:theme.html.twig'
然后,在使用全局变量进行渲染之前,我们在表单本身上设置了正确的主题。 这甚至允许我们在需要时使用不同的东西

{% form_theme form frontend_form_theme %}
{{ form_start(form) }}

我在找类似的东西。在前台使用一个主题,在后台使用另一个主题

我明白了。我在config.yml中使用普通配置作为FrontOffice的常规配置,如下所示:

twig:
globals:
    frontend_form_theme:          'form/fields.html.twig'
然后我在主后台使用类似layout.html.twig的模板:

{% if oForm is defined %} {% form_theme oForm 'bootstrap_3_layout.html.twig' %} {% endif %}

因此,为所有名为form的表单定义引导程序。

这是可能的,并且工作良好。但是,它假定您与根表单的命名一致

首先,设置一个默认的表单主题,如标准文档中所述

# twig.yaml
twig:
    form_themes: ['form.html.twig'] # Default theme and front-end
覆盖管理布局模板中主窗体的窗体主题

# admin/layout.html.twig

{% if form is defined %}
    {% form_theme form "admin/_form.html.twig" %}
{% endif %}

{% block content %}{% endblock %}
...
通过在表单块中设置表单主题,可以选择性地覆盖最终模板中的管理表单主题。如果在块之外定义表单主题,则它将不起作用。您的自定义表单主题可能也应该扩展管理表单主题

# admin/user/edit.html.twig

{% extends "admin/layout.html.twig" %}

{% block content %}
    {% form_theme form "admin/user/_form.html.twig" %}
    {{ form(form) }}
{% endblock %}

因此,当您的页面只有一个表单并且总是将其命名为常量时,这里的其他答案非常有用,例如
表单
。然而,在我的场景中,我经常有多个具有不同名称的表单,所以这种方法不起作用。相反,我所做的是创建一个自定义细枝函数,将所需的表单主题应用于传递到视图中的所有表单:

WhateverTwigExtension.php
中:(有关编写细枝扩展的信息,请参阅)

class WhateverTwigExtension扩展了AbstractExtension
{
私人(港币);;
公共函数构造(FormRenderInterface$formRenderer)
{
$this->formRenderer=$formRenderer;
}
公共函数getFunctions()
{
返回[
新TwigFunction('applyFormThemes',[$this,'applyFormThemes']),
];
}
公共函数应用程序主题(数组$context,$themes)
{
foreach($context作为$variable){
if($FormView的变量instanceof){
$this->formRenderer->setTheme($variable,$themes);
}
}
}
}
请注意,为了使symfony的自动连接能够将渲染器注入到该扩展中,您必须将其别名,因此在您的服务中添加类似的内容。yml:

services:
    Symfony\Component\Form\FormRendererInterface: '@twig.form.renderer'
最后,在子网站的基本分支中,只需添加:

{{ applyFormThemes(_context, 'my_form_theme.html.twig') }}
也适用于多个主题:

{{ applyFormThemes(_context, ['my_form_theme.html.twig', 'other_form_theme.html.twig']) }}
现在,所有传递到该视图的表单都将应用您的主题


您还可以使用普通的
form\u主题
标记覆盖特定的表单,只要它位于
applyFormThemes

我知道如何设置全局主题之后。但是如何为站点的不同部分设置不同的分区呢?另外,当您在配置中设置这4个时,实际使用的是哪一个?