filhocodes/twig-stack-extension

将内容栈集成到Twig模板中。

v2.0.0 2021-12-31 14:31 UTC

This package is auto-updated.

Last update: 2024-09-16 18:28:06 UTC


README

Composer Package Composer Package Downloads Build Status Coverage Status

此扩展允许您定义一个“基础模板”的某个部分,该部分将接收来自所有其他页面的内容,无论是通过includeembed还是extends

此包背后的原因是phive/twig-extensions-deferred并没有我想要的特性。对于那些不了解的人,这个扩展允许您指定模板中的某个区块将在模板解析结束时而不是解析时进行评估。它也是一个学习项目,因为这是我第一个Twig扩展。

此项目也与包aygon/twig-stack密切相关。它有点像将他们的代码重构到Twig 2.*中,带有我的个人观点。

CHANGELOG v2.0.0

版本2.0.0支持PHP 8.0和PHP 8.1,同时移除了对PHP 7.3及以下版本的支持。如果您仍在使用这些旧版本的PHP,您将需要安装此包的1.0.0版本。

安装

您可以通过composer安装此包

composer require filhocodes/twig-stack-extension

如果您正在使用Symfony,您应该能够通过在services.yaml中添加条目来配置它

services:
    FilhoCodes\TwigStackExtension\TwigStackExtension:
        class: 'FilhoCodes\TwigStackExtension\TwigStackExtension'
        tags: ['twig.extension']

无论如何,您都可以直接将扩展添加到您的Twig环境中

use FilhoCodes\TwigStackExtension\TwigStackExtension;

/** @var $twig \Twig\Environment */
$twig->addExtension(new TwigStackExtension());

用法

在您的基模板中,使用{% stack %}定义一个栈

<html lang="en">
<head>
  <title>My template</title>
  {% stack styles %}
</head>
<body>
  {% stack scripts %}
</body>
</body>
</html>

然后,在扩展您的模板或被其他文件包含的文件中,您可以使用{% push %}{% prepend %}来分别向栈的末尾和开头添加内容。

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

{% push scripts %}
<script></script>
{% endpush %}
{# include 'partial.twig.html' #}

{% push styles %}
<link />
{% endpush %}

为了防止代码重复,例如在包含或嵌入多次的文件中,您可以向区块声明中添加一个“id”,以便扩展将其识别为唯一的。但请记住,我们不会验证该区块的内容,也不会检查它是push还是prepend。因此,请注意可能出现的命名冲突错误。

{# embed 'component.twig.html' #}

{# The following contents will be rendered only once #}
{% push scripts component_definition_script %}
<script>
  MyPlugin = { /* ... */ }
</script>
{% endpush %}

{# The following contents will be rendered as many times as this file is embed,
   probably each with some different initialization logic... #}
{% push scripts %}
<script>
  MyPlugin.init();
</script>
{% endpush %}