树枝:从包含的模板中将项目添加到数组 [英] Twig: Add item to array from within an included template

查看:81
本文介绍了树枝:从包含的模板中将项目添加到数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当在主文件中定义数组时,如何在include标记内的数组中添加项目?

How can you add an item to an array within an include tag when the array is defined in the main file?

请注意,这个问题与Twig中的其他数组问题明显不同,因为我正在尝试从主文件中包含的模板中修改值.

Please note this question is distinctly different from other array questions in Twig because I'm trying to modify the value from within an included template in the main file.

例如:

main.twig

{% set includes = ["test1"] %}
{% include "test.twig" %}
{{includes|json_encode}} {# "How do I make this `includes` contain the "test2" array item?" #}

test.twig

{% set includes = includes|merge(["test2"]) %}
{{includes|json_encode}}

目前,main.twig的输出仅给我提供了初始的test1项,而没有给我提供test.twig试图修改的两者的组合.

Currently the output from main.twig gives me only the initial test1 item, and not the combination of the two which test.twig is trying to modify.

我可能不得不利用增加的功能.此处的目标基本上是允许include d模板能够在HTML文件中添加其他CSS,JS等,而无需修改父模板.

I may have to utilize an added function. The goal here is basically to allow included templates the ability to add other CSS, JS, etc, in HTML files without having to modify the parent templates.

这是一个 Twig Fiddle ,供您播放,并显示输出.

Here is a Twig Fiddle for you to play with which shows the output.

请注意,其他人正在寻找该问题的答案,我试图实现的目标可能是利用Twig扩展名,该扩展名具有向数组添加项目的功能,以及用于访问该数组的第二个功能.请查看下面的我的答案(未标记为正确答案),以查看可能的方法.如上所述,我的问题是不可能的,如DarkBee所示.

Please note for other people looking for an answer to this question, what I was attempting to accomplish is possible utilizing a Twig extension with a function that adds items to the array, and a second function to access it. Please view my answer below, that is not marked as correct, to see a way to potentially do this. My question, as stated, is impossible, as shown by DarkBee.

推荐答案

这不能在Twig中完成,正如在模板的编译源中所看到的那样,每个包含的模板都具有自己的私有范围,因为上下文数组是基于价值而非依据

This can't be done in Twig, as seen in the compiled source of the templates each included templats get his own private scope as the context array is based by value and not by reference

$this->loadTemplate("bar.twig", "main.twig", 2)->display($context);

然后在包含的模板中调用doDisplay

which then calls doDisplay in the included template

protected function doDisplay(array $context, array $blocks = array())

注释

可以通过创建自己的Twig_EnvironmentTwig_Template来更改此行为,但是快速浏览会发现有很多功能需要覆盖.

You could alter this behaviour by creating your own Twig_Environment and Twig_Template but a quick look shows me that there are quite some functions you'd need to override.

main.twig

{% set foo = 'bar' %}
{% include 'bar.twig' %}

Foo in foo: {{ foo }}

bar.twig

{% set foo = 'foo' %}
Foo in bar: {{ foo }}

源main.twig

/* main.twig */
class __TwigTemplate_4ba23e628289532331bb5889dca1a4ec57774924d21a760ca6fe6f575a3978b5 extends Twig_Template
{
    public function __construct(Twig_Environment $env)
    {
        parent::__construct($env);

        $this->parent = false;

        $this->blocks = array(
        );
    }

    protected function doDisplay(array $context, array $blocks = array())
    {
        // line 1
        $context["foo"] = "bar";
        // line 2
        $this->loadTemplate("bar.twig", "main.twig", 2)->display($context);
        // line 3
        echo "
Foo in foo: ";
        // line 4
        echo twig_escape_filter($this->env, ($context["foo"] ?? null), "html", null, true);
    }

    public function getTemplateName()
    {
        return "main.twig";
    }

    public function isTraitable()
    {
        return false;
    }

    public function getDebugInfo()
    {
        return array (  26 => 4,  23 => 3,  21 => 2,  19 => 1,);
    }

    public function getSourceContext()
    {
        return new Twig_Source("", "main.twig", "/fuz/twigfiddle.com/files/environment/k85WDdymIFgSoXLc/twig/main.twig");
    }
}

源bar.twig

<?php

/* bar.twig */
class __TwigTemplate_16789decfbb837d4631acf2e648380c0658722c50a0b53184b3f3c5f68f9b0ae extends Twig_Template
{
    public function __construct(Twig_Environment $env)
    {
        parent::__construct($env);

        $this->parent = false;

        $this->blocks = array(
        );
    }

    protected function doDisplay(array $context, array $blocks = array())
    {
        // line 1
        $context["foo"] = "foo";
        // line 2
        echo "Foo in bar: ";
        echo twig_escape_filter($this->env, ($context["foo"] ?? null), "html", null, true);
    }

    public function getTemplateName()
    {
        return "bar.twig";
    }

    public function isTraitable()
    {
        return false;
    }

    public function getDebugInfo()
    {
        return array (  21 => 2,  19 => 1,);
    }

    public function getSourceContext()
    {
        return new Twig_Source("", "bar.twig", "/fuz/twigfiddle.com/files/environment/k85WDdymIFgSoXLc/twig/bar.twig");
    }
}

这篇关于树枝:从包含的模板中将项目添加到数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆