Symfony 全局切换html验证

Symfony 全局切换html验证,symfony,twig,Symfony,Twig,我做了几次树枝的延伸,但这一次我被难住了 我有下面的模板逻辑,我想把它做成一个扩展 class HTML5Validation extends \Twig_Extension { public function getFunctions() { return array( new \Twig_SimpleFunction('html5validation', array($this, 'setValidation')), )

我做了几次树枝的延伸,但这一次我被难住了

我有下面的模板逻辑,我想把它做成一个扩展

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';
    }
}
我需要将此逻辑重用到许多不同的形式中,而不是到处复制和粘贴以下代码:

{% 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';
    }
}

简而言之,答案是否定的——你不能用树枝来做这件事,这不是它们的本意

看看你的模板片段,我想说你需要定制表单开始块。要做到这一点,请查看和

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

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';
    }
}
例如,要全局覆盖form_start,请在中找到form_start块的默认定义,将其复制到您自己的表单主题文件中,例如YourBundle/form/fields.html.twig,根据需要对其进行修改,并更新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'

如果没有更优雅的解决方案,您可以将问题中给出的细枝片段放入单独的文件中,并从各种表单中使用。包含的片段可以访问周围上下文中的变量:

{# 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' %}
如果您通常将一个“form”变量传递到控制器中的render中,那么您可以在form\u开始片段中使用该变量。否则,您可以将适当的表单作为变量传入:

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

事实上,我找到了一个更好的方法来做我想做的事

另外,它可以在全球范围内工作,而不必在控制器中填充更多字段

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

然后,如果您想关闭整个网站的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)
可重复使用且无创,完全符合我的要求:

我从以下方面得到了提示:


啊,我知道出了什么事。使用主题覆盖完全超出了我的头脑!:D谢谢。看起来我不能把它和form_主题一起使用?我得到的错误是HTML5验证变量不存在。嗯,对不起,我没有意识到只有全局细枝变量可以用于表单主题化。对于特定的字段类型,可以使用FormExtension将变量传递到表单主题中。然而,我尝试了“表单”类型,但无法使其工作。我建议您更新您的问题,说您试图使用主题覆盖,但它不起作用,因为HTML5验证不是一个全局变量。然后我可以删除这个答案,我认为应该扣分。顺便说一句,不要删除你的答案,留着让我可以参考,或者其他人可以:尽管留下一张便条,我们认为这是不可能的:可能会节省其他人的时间。谢谢你为我指出了正确的方向,找到了答案!:哦,我的天啊,这个关键词太棒了!我也真的在找。非常感谢。你真是一箭双雕:我能建议你以后的问题不要那么具体,也就是说,更多的是关于你想达到什么目标,而不是如何以一种特定的方式来完成某件事吗。如果我早知道你到底想做什么,我就可以更快地给你这个答案,而且我的努力更少!我其实不知道这是我自己想要的。我只是想让它更容易使用。然后我想,为什么不在我想的时候随时关掉和打开它呢?这是所有找出答案的过程,你也是其中的一部分,感谢你的时间我真的很感激:而且你的努力没有一点白费,你的其他答案将帮助一些可怜的灵魂找出类似但与我打赌的答案不完全相同的东西。回头看,你是对的,我已经做了一段时间了,所以我觉得我的大脑有点烧坏了。对不起!警告:如果您也使用其他表单主题,则上述代码中的{%extends'form_div_layout.html.twig“%”行将覆盖它们。解决方案:1在config.yml中全局加载主题。2将{%extends'form_div_layout.html.twig%}放入主题中。3在validation.toggle.html.twig中改为使用:{%extends'您的_theme.html.twig%}