全局切换html验证

时间:2014-07-15 19:33:11

标签: symfony twig

我做了几个枝条延伸,但是我很难接受这个。

我想将以下模板逻辑添加到扩展程序中。

我需要将这种逻辑重用于许多不同的形式,而不是在任何地方复制和粘贴以下代码:

{% if html5validation is not defined %}
    {{ form_start(some_form) }}
{% else %}
    {% if html5validation %}
        {{ form_start(some_form) }}
    {% else %}
        {{ form_start
            (
                company, {'attr': {'novalidate': 'novalidate'}}
            ) 
        }}
    {% endif %}
{% endif %}

使用控制器的上述代码,我可以执行以下操作来打开和关闭html5验证器:

$this->render(..., array(html5validation => false));

我想把模板逻辑放到下面的树枝扩展中......

我只是不知道是否可以在枝条扩展中实现我上面所做的。

class HTML5Validation extends \Twig_Extension
{
    public function getFunctions()
    {
        return array(
            new \Twig_SimpleFunction('html5validation', array($this, 'setValidation')),
        );
    }

    public function setValidation($boolean)
    {
        //Implement the same logic as the twig template.
    }

    public function getName()
    {
        return 'html5validator';
    }
}

3 个答案:

答案 0 :(得分:1)

简短的回答是否定的 - 你不能使用树枝延伸来做到这一点,这不是它们的意思。

查看模板片段我会说你需要自定义form_start块。为此,请参阅Symfony Form ThemingHow to customise form rendering

编辑:如果您的自定义代码需要本地树枝变量,则此解决方案不起作用 - 只有全局树枝变量可用于表单主题。您可以在config.yml或twig扩展名中定义自己的twig globals。

例如,要全局覆盖form_start,您可以在form_div_layout.html.twig中找到form_start块的默认定义,将其复制到您自己的表单主题文件中,例如YourBundle / Form / fields.html.twig,根据需要进行修改,并更新树枝配置以应用表单主题文件。像这样:

{# src/YourBundle/Form/fields.html.twig #}
{% extends 'form_div_layout.html.twig' %}

{% block form_start -%}
    {% if html5validation is not defined %}
        {{ parent() }}
    {% else %}
        {% if html5validation %}
            {{ parent() }}
        {% else %}
            {{ parent
                (
                    company, {'attr': {'novalidate': 'novalidate'}}
                ) 
            }}
        {% endif %}
    {% endif %}
{%- endblock form_start %}

配置:

# app/config/config.yml
twig:
    form:
        resources:
            - 'YourBundle:Form:fields.html.twig'

答案 1 :(得分:1)

我实际上找到了一种更好的方法来做我想做的事。

作为一个优点,它可以全局工作,而不必在控制器中填充更多字段!

YourBundle / Resources / views / validation.toggle.html.twig

{% extends 'form_div_layout.html.twig' %}

{% block form_start -%}
    {% if html5validation is defined and html5validation == false %}
        {% set attr = attr|merge({'novalidate': 'novalidate'}) %}
    {% endif %}
    {{ parent() }}
{%- endblock form_start %}

然后,如果你想在整个网站上关闭html5验证:

# app/config/config.yml
twig:
    global:
        html5validation: false

如果您希望在生产模式下默认启用验证但是能够在启用模式下打开和关闭验证,那么最好只在dev_config.yml中使用它。

# app/config/dev_config.yml
twig:
    global:
        html5validation: false
    resources:
        - 'YourBundle::validation.toggle.html.twig'

最后通常在你的树枝模板中使用它:

{% form_theme your_form 'YourBundle::validation.toggle.html.twig' %}

form_start(your_form)

可重复使用且非侵入性,完全像我想要的那样。 :)

我得到了提示:

https://github.com/symfony/symfony/issues/11409#issuecomment-49358377

答案 2 :(得分:0)

如果没有更优雅的解决方案,您可以随时将问题中给出的树枝片段放入单独的文件中,并使用各种形式的twig include。包含的片段可以访问周围环境中的变量:

{# YourBundle/Resources/views/form_start.html.twig #}
{% if html5validation is not defined %}
    {{ form_start(some_form) }}
{% else %}
    {% if html5validation %}
        {{ form_start(some_form) }}
    {% else %}
        {{ form_start
            (
                company, {'attr': {'novalidate': 'novalidate'}}
            ) 
        }}
    {% endif %}
{% endif %}

然后在表格的树枝文件中:

{% include 'YourBundle::form_start.html.twig' %}

如果您通常会传递“表格”。变量到控制器中的render(),然后你可以在form_start片段中使用它。否则,您可以将相应的表单作为变量传递:

{% include 'YourBundle::form_start.html.twig' with {'form': localForm} %}