我有一个具有多种样式的symfony2应用程序。所有3都有自己的html + css进行渲染。 像“前台”,“用户仪表板”和“管理员后端”这样的东西。
现在所有3个子网站中使用的表单主题都有所不同,因此所有这些主题都有一个(稍微)不同的主题。
因此我可以在symfony配置中设置主题,但是对于3个子站点中的2个,它将是错误的。
我可以使用以下方式手动设置主题:
{% form_theme form 'MyUberCoolBundle:Form:theme.html.twig' %}
但我并不是真的想为每种形式都这样做。 我可以在基本模板中设置它,但是我的表单总是需要被称为“表单”。
有没有办法设置要在基本模板中使用的主题,以便它将用于所有表单?
答案 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
标签覆盖特定形式。