gpt4 book ai didi

php - 在 Twig 中延迟执行/完成

转载 作者:行者123 更新时间:2023-12-02 22:02:43 24 4
gpt4 key购买 nike

我将 Twig 与 Symfony2 框架分开使用,将其变成更小的东西以更好地满足我的(感知的)需求。我的框架的一部分是一个管理 js/css 依赖关系的 Assets 管理库,在预处理、组合、缩小、gzip 压缩之后,输出适当的 <link>。和 <script>要放置在 <head> 中的标签或者在 <body> 的底部.

Assets 助手只有三个公共(public)函数:require_asset($asset) , render_head()render_bottom() .第一个在不同的模板部分中很少使用(我想将 Assets 的加载保持在应用程序逻辑之外,因此在 twig 模板内)。在需要所有 Assets 之后需要调用另外两个,并且(在 Assets 管理器完成它的工作之后)返回适当的和要放置在模板中的标签。

所有普通模板都扩展了基本模板:

基础 Twig :

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{{ title }}</title>
<!--[if lt IE 9]><script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
{{ Assets.headAssets }}
</head>
</body>
{% block body %}
{% endblock %}
{{ Assets.bottomAssets }}
<body>
</html>

在这里{{ Assets.headAssets }}{{ Assets.bottomAssets }}是通过先前声明的 Twig 全局变量 Assets 调用的上述render_head()render_bottom()方法;

在我的例子中,这个基本模板是从 test.twig 扩展而来的:

{% extends "base.twig" %}
{% import "forms.twig" as forms %}

{% block body %}
{{ Assets.requires('formtest.css') }}
{{ Assets.requires('testscript.js') }}
<form method="post">

{{ forms.form(form) }}

<input type="submit"/>
</form>

{% endblock %}

在这里,{{ Assets.requires('formtest.css') }}{{ Assets.requires('testscript.js') }}通过调用 require_asset($asset) 指示 Assets 助手包含此模板所需的 css 和 js .

通常,如果在 twig 之外完成,输出函数将在所有需要的 Assets 都被要求之后最后调用。这按预期工作。

我遇到的问题与 twig 模板中这些函数的执行顺序有关。由于 base.twig 首先被调用,并且包含对输出函数的调用,因此在扩展模板或包含的 block /宏提出任何要求之前调用这些函数。因此,结果为空且未考虑这些新要求。

我想到的解决此问题的一种方法是在 Twig 返回渲染后计算输出,并在返回的结果中替换它们。这行得通,但我觉得不够优雅。

我想知道是否有办法推迟 {{ Assets.headAssets }} 的执行和 {{ Assets.bottomAssets }}直到 twig 完成所有其他操作。我有什么办法可以实现这一目标吗?

最佳答案

对于那些仍在寻找答案的人,我写了一个 Twig extension允许延迟 block 渲染。

关于php - 在 Twig 中延迟执行/完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16626995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com