symfony2 twig形式主题为不同的子网站

时间:2015-09-07 07:20:03

标签: forms symfony twig

我有一个具有多种样式的symfony2应用程序。所有3都有自己的html + css进行渲染。 像“前台”,“用户仪表板”和“管理员后端”这样的东西。

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

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

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

{% form_theme form 'MyUberCoolBundle:Form:theme.html.twig' %}

但我并不是真的想为每种形式都这样做。 我可以在基本模板中设置它,但是我的表单总是需要被称为“表单”。

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

5 个答案:

答案 0 :(得分:1)

我一直在寻找类似的东西。使用FrontOffice的主题和后台使用的另一个主题。

我明白了。我在config.yml中使用正常配置,就像FrontOffice一样:

twig:
globals:
    frontend_form_theme:          'form/fields.html.twig'

然后我在主要的BackOffice模板中使用layout.html.twig:

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

因此,为所有名称为oForm的表单定义了bootstrap。

答案 1 :(得分:0)

为您的应用程序设置主题全局,您可以在配置

中设置它
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

查看完整的Twig配置参考here

答案 2 :(得分:0)

在寻找答案之后,我得出结论,只有在配置中才能做到这一点。

我们采用了以下解决方案

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

twig:
    globals:
        frontend_form_theme:          'MyUberCoolBundle:Form:theme.html.twig'

然后我们在使用全局变量渲染之前在表单上设置正确的主题。 这甚至允许我们在需要时使用不同的东西。

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

答案 3 :(得分:0)

这是可能的,而且效果很好。它假设您与命名根形式一致。

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

# 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 %}

答案 4 :(得分:0)

因此,当您的页面只有一种形式并且始终将其命名为常量时,例如form,此处的其他答案非常有用。但是,在我的场景中,我经常使用具有不同名称的多种形式,因此这种方法行不通。相反,我所做的是创建一个自定义的树枝函数,该函数将所需的表单主题应用于传递到视图的所有表单:

在您的WhateverTwigExtension.php中:(有关编写树枝扩展名的信息,请参见here

class WhateverTwigExtension extends AbstractExtension
{
    private $formRenderer;

    public function __construct(FormRendererInterface $formRenderer)
    {
        $this->formRenderer = $formRenderer;
    }

    public function getFunctions()
    {
        return [
            new TwigFunction('applyFormThemes', [$this, 'applyFormThemes']),
        ];
    }

    public function applyFormThemes(array $context, $themes)
    {
        foreach ($context as $variable) {
            if ($variable instanceof FormView) {
                $this->formRenderer->setTheme($variable, $themes);
            }
        }
    }
}

请注意,为了使symfony的自动装配功能能够将渲染器注入到此扩展程序中,您必须为其加上别名,因此将这样的内容放入您的services.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_theme

之后,您仍然可以使用普通的applyFormThemes标签覆盖特定形式。