tacman/twig-tree-tag

一个用于简洁遍历嵌套列表(例如导航菜单)的 Twig 扩展,支持 Twig 3

3.1.7 2024-07-23 14:14 UTC

This package is auto-updated.

Last update: 2024-09-23 14:44:24 UTC


README

一个用于简洁遍历嵌套列表(例如导航菜单)的 Twig 扩展。基于 https://github.com/jordanlev/twig-tree-tag 开发,由 Tac Tacelosky 修改以适应 PHP 8 和 Twig 3。

要求

需要 PHP 8.1 或更高版本

安装

composer require tacman/twig-tree-tag

现在将其注册到 services.yaml 中

# services.yaml
services:
    twig.tree:
      class: JordanLev\TwigTreeTag\Twig\Extension\TreeExtension
      tags:
        - { name: twig.extension }

想法

{% tree %} 标签几乎与 {% for %} 一样工作,但在 {% tree %} 内部,您可以使用 {% subtree var %} 递归地运行带有给定 var{% tree %} 块。此标签的主要用例是嵌套导航菜单。

此扩展由 Alain Tiemblo 编写,(由 Jordan Lev 进行了一些非常小的修改)。

使用示例

在这个示例中,menu 是一个对象数组,每个对象包含 nameurlchildren 属性(children 是具有相同属性的对象数组等)。

{% tree item in menu %}
  {% if treeloop.first %}<ul>{% endif %}
    <li>
        <a href="{{ item.url }}">{{ item.name }}</a>
        {% subtree item.children %}
    </li>
  {% if treeloop.last %}</ul>{% endif %}
{% endtree %}

就像一个 {% for %} 循环一样,您可以访问列表项的键

{% tree key, item in menu %}
  <li>
    <b>Item {{ key }}</b>: {{ item.name }}
    {% subtree item.children %}
  </li>
{% endtree %}

有关更多示例,请参阅 示例目录

treeloop 变量是什么?

treeloop 变量在 {% tree %} 标签内部的作用与 loop 变量在 {% for %} 标签内部的作用相同。它被命名为不同,以便您可以在 {% tree %} 标签内部使用 loop(否则它们将冲突)。

treeloop 包含与 loop 相同的所有 特殊变量

  • treeloop.index:循环的当前迭代 在当前嵌套级别内。 (1 索引)
  • treeloop.index0:循环的当前迭代 在当前嵌套级别内。 (0 索引)
  • treeloop.revindex:从循环末尾到循环 在当前嵌套级别内 的迭代次数(1 索引)
  • treeloop.revindex0:从循环末尾到循环 在当前嵌套级别内 的迭代次数(0 索引)
  • treeloop.first:如果是当前嵌套级别的第一次迭代
  • treeloop.last:如果是当前嵌套级别的最后一次迭代
  • treeloop.length:序列 在当前嵌套级别内 的项目数量
  • treeloop.parent:父嵌套级别的上下文(或如果目前在树的根级别,则为 tree 标签本身的父上下文)。

此外,treeloop 还包含两个额外的变量,用于说明当前嵌套级别

  • level:当前嵌套级别(1 索引 - 因此树的根级别是 1,第二级是 2 等)
  • level0:当前嵌套级别(0 索引 - 因此树的根级别是 0,第二级是 1 等)

如果我想在另一个树标签内部使用树标签怎么办?

处理想要在另一棵树(即具有自己标记的新树根)内开始新树的边缘情况,请在您的 {% tree %} 标签中使用 as 将每棵树分配给一个变量名,然后通过 with 将其传递给 subtree。这允许Twig在遇到 {% subtree %} 标签时知道应该调用哪个 {% tree %}。例如...

{% tree item in menu as treeA %}
  {% if treeloop.first %}<ul>{% endif %}
    <li>
        {{ item.name }}
        {% subtree item.children with treeA %}
        
        <h2>Some other tree (that has its own "root", not a sub-tree of treeA):</h2>
        {% tree otherthing in item.otherthings as treeB %}
          {{ otherthings.name }}
          {% subtree otherthings.subitems with treeB %}
          {# We use "with treeB" above so Twig knows which parent tree tag to call #}
        {% endtree %}
    </li>
  {% if treeloop.last %}</ul>{% endif %}
{% endtree %}

许可证

MIT许可证(MIT)

请阅读更多详情的 LICENSE 文件。