tacman / twig-tree-tag
一个用于简洁遍历嵌套列表(例如导航菜单)的 Twig 扩展,支持 Twig 3
Requires
- php: ^8.1
- twig/twig: ^3|^4
Requires (Dev)
- phpstan/phpstan: ^1.11.7
- rector/rector: ^1.2
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
是一个对象数组,每个对象包含 name
、url
和 children
属性(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 文件。