包含一个树枝文件并从单独的文件传递变量?

2024-05-03

我有container.twig,包括component.twig并传递一个名为“mock”的对象。

在container.twig中:

{% set mock = {
    title : "This is my title"
}
%}

{% include 'component.twig' with mock %}

这工作正常,但我想将模拟数据移动到它自己的文件中。这不起作用:

容器.twig

{% include 'component.twig' with 'mock.twig' %}

在模拟树枝中

{% set mock = {
    title : "This is my title"
}
%}

我使用的是 gulp-twig,但它在大多数方面都像标准树枝一样工作。https://github.com/zimmen/gulp-twig https://github.com/zimmen/gulp-twig


问题

Twig 上下文永远不会存储在模板对象中,因此很难找到一种干净的方法来实现这一点。例如,以下 Twig 代码:

{% set test = 'Hello, world' %}

将编译为:

<?php

class __TwigTemplate_20df0122e7c88760565e671dea7b7d68c33516f833acc39288f926e234b08380 extends Twig_Template
{
    /* ... */

    protected function doDisplay(array $context, array $blocks = array())
    {
        // line 1
        $context["test"] = "Hello, world";
    }

    /* ... */
}

正如您所看到的,继承的上下文不会通过引用传递给 doDisplay 方法,并且永远不会存储在对象本身中(例如$this->context = $context)。这种设计允许模板可重复使用,并且内存友好。

解决方案1:使用全局变量

不知道你是否知道全局变量 http://twig.sensiolabs.org/doc/advanced.html#globals在树枝中。你可以用它们做很多黑客活动。

最简单的用法是将所有全局变量加载到 twig 环境中。

$loader = new Twig_Loader_Filesystem(__DIR__.'/view');
$env = new Twig_Environment($loader);
$env->addGlobal('foo', 'bar');
$env->addGlobal('Hello', 'world!');

然后,您可以使用{{ foo }} and {{ Hello }}在你的整个应用程序中。

但这里有两个问题:

  • 当您尝试从树枝文件加载变量时,我假设您有很多变量需要根据您的功能进行初始化,并且不想一直加载所有内容。

  • 您正在从 PHP 脚本而不是从 Twig 加载变量,并且您的问题想要从 twig 文件导入变量。

解决方案 2:使用 Twig 扩展

您还可以创建一个存储扩展来提供save函数将某些模板的上下文保留在某处,并且restore函数将此存储的上下文合并到另一个存储的上下文中。

proof_of_concept.php

<?php

require __DIR__.'/vendor/autoload.php';

class StorageTwigExtension extends Twig_Extension
{
    protected $storage = [];

    public function getFunctions() {
        return [
            new Twig_SimpleFunction('save', [$this, 'save'], ['needs_context' => true]),
            new Twig_SimpleFunction('restore', [$this, 'restore'], ['needs_context' => true]),
        ];
    }

    public function save($context, $name) {
        $this->storage = array_merge($this->storage, $context);
    }

    public function restore(&$context, $name) {
        $context = array_merge($context, $this->storage);
    }

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

/* usage example */

$loader = new Twig_Loader_Filesystem(__DIR__.'/view');
$env = new Twig_Environment($loader);

$env->addExtension(new StorageTwigExtension());

echo $env->render('test.twig'), PHP_EOL;

twig/variables.twig

{% set foo = 'bar' %}
{% set Hello = 'world!' %}
{{ save('test') }}

twig/test.twig

{% include 'variables.twig' %}
{{ restore('test') }}
{{ foo }}

Note: if you only want to import variables without actually rendering what's inside twig/variables.twig, you can also use:

{% set tmp = include('variables.twig') %}
{{ restore('test') }}
{{ foo }}

最后说明

我不习惯 JavaScript twig 端口,但看起来你仍然可以扩展它,那就是你的了:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

包含一个树枝文件并从单独的文件传递变量? 的相关文章

随机推荐

  • 具有自定义计数标准的 RxJava 缓冲区/窗口

    我有一个 Observable 它发出许多对象 我想使用以下方法对这些对象进行分组 window or buffer运营 但是 不是指定count用于确定窗口中应有多少对象的参数我希望能够使用自定义标准 例如 假设可观察对象正在发出 a 的
  • 这是我尝试安装 pip3 时得到的结果

    这是我尝试安装 pip3 时得到的结果 sudo apt get install python3 pip Reading package lists Done Building dependency tree Reading state i
  • 将 cmake 与自定义文件生成器结合使用

    我想使用 CMake 生成混淆的 lua 文件以供交付 在我的一生中 我无法让 add custom command add custom target 为我构建这些文件 我缺少一些东西 ADD CUSTOM TARGET LUABIND
  • 使用 DropWizard Hibernate 进行单元测试时显示“当前没有会话绑定到执行上下文”

    我将 DW 与 Hibernate 结合使用 并尝试为我的 DAO 编写单元测试 我的代码基于这个例子 https github com dropwizard dropwizard blob 1310d7c981581b4e1be97104
  • 是否可以更改 WPF 控件的父级

    是否可以更改 WPF 控件的父控件 这是一个例子 StackPanel堆栈1有Buttonbtn1 在里面 还有一个空的StackPanel堆栈2 我想以编程方式将 btn1 移动到 stack2 谢谢您的帮助 您可以通过以下方式执行此操作
  • 将尾部输出重定向到程序中

    我想使用 tail 作为标准输入向程序发送文本文件中的最新行 首先 我向程序回显一些每次都相同的输入 然后从输入文件发送尾部输入 该输入文件应首先通过 sed 处理 以下是我期望工作的命令行 但是当程序运行时 它只接收回显输入 而不接收尾部
  • 混淆 bash 中存储的密码

    我有一个 bash 脚本 我需要编写密码才能运行程序 其他人可以看到它 有没有办法把密码写得不太明显 即使他可以在 bash 中执行相同的命令并获取密码 他也无法读取文本形式的密码 今天我这样做 PASSWORD 1234567 progr
  • TypeScript 中类似字典的对象应使用什么类型?

    在 TypeScript 中 我有时会使用期望 或返回 对象的函数 其中这些对象被视为字典 基本上我的问题是 这里使用的正确类型是什么 我可以用 Record
  • 使用 asyncore 读取网站

    我想异步阅读一个网站 据我所知 这是不可能的 urllib 现在我尝试使用普通套接字进行阅读 但是 HTTP 给我带来了麻烦 我遇到了各种时髦的编码 例如传输编码 分块 必须手动解析所有这些东西 我现在想编码 C 而不是 python 难道
  • C++ 析构函数和函数调用顺序

    假设我有以下代码片段 Foo foo return bar 现在 C 标准是否保证 bar 将在 foo Foo 之前调用 或者这是编译器 实现的选择 Thanks 这是有保证的行为 实际执行过程如下 0 enter block scope
  • C++ 令人头疼的命名空间

    好吧 这个问题已经发生了一些变化 我想尝试从我正在追求的基本目标开始 重新 创建在 C 资源获取和初始化中包装遗留 C 语言实体的库代码 并提供基本或更好的异常保证 使此代码的客户端能够以非常自然的 C 方式使用它 而不会为现有代码创建大量
  • JS 是否支持使用键函数而不是比较器进行排序?

    JavaScript 的array sort https developer mozilla org en US docs Web JavaScript Reference Global Objects Array sort Syntax方
  • 在 R 闪亮应用程序中评级星星

    我正在尝试向我闪亮的应用程序添加一些元素 以使其看起来更好 因此 我正在使用新的shiny semantic包允许以简单的方式添加语义 UI 元素 人们可以在这里找到闪亮的语义元素的示例 http demo appsilondatascie
  • 从服务(IntentService)和活动执行的AsyncTask - 有区别吗?

    从 Activity 或 IntentService 启动 AsyncSync 之间有什么区别吗 我正在构建一个通过 http 下载和上传文件的应用程序 我为每次传输使用带有进度条的自定义通知布局 我选择并行传输或将它们放入队列 您会推荐哪
  • AWS CloudFront 重定向到 S3 存储桶

    我创建了一个 CloudFront 发行版来为静态网站提供服务 S3是源服务器 现在 如果我们访问 CloudFront URL 它会重定向到 S3 位置 d2s18t7gwlicql cloudfront net or test tele
  • 计算 QR 码对齐图案的位置

    我需要知道如何计算 QR 码对齐图案的位置 如中定义ISO IEC 18004 2000 附录 E 表 http www arscreatio com repositorio images n 23 SC031 N 1915 18004Te
  • Chrome DevTools 脚本黑盒不起作用

    我正在尝试使用 chrome devtools 的新功能 黑盒脚本 这篇 Chrome Devtools 文章列出了脚本黑盒功能 https developer chrome com devtools docs blackboxing wh
  • C++ win32设置光标位置

    我知道要使用哪个功能 但我无法让它正常工作 我用了SetCursorPos 唯一的问题是它将光标设置为屏幕坐标而不是窗口坐标 我也尝试过ScreenToClient 但它并没有起作用 这是我的代码 pt x 113 pt y 280 Scr
  • 本地通知替代周重复

    我有两个通知 我想隔周重复一次 例如 在第一周的星期一设置一个通知 并应在第三周的星期一重复 第二次通知设置在第二周的星期二 并且应在第四周的星期二重复 为此我该怎么办 获取周数 并根据周数做出决定
  • 包含一个树枝文件并从单独的文件传递变量?

    我有container twig 包括component twig并传递一个名为 mock 的对象 在container twig中 set mock title This is my title include component twi