qeep-pro/twig-tree-tag

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

v2.0.0 2018-01-26 08:51 UTC

This package is auto-updated.

Last update: 2024-09-21 20:36:07 UTC


README

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

要求

需要PHP 5.4或更高版本(由于在编译模板的匿名函数中使用$this,不幸的是这是实现块调用自身的递归的唯一方法)。

想法

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

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

使用示例

在此示例中,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 %}标签内的作用与在{% for %}标签内的loop变量相同。它被命名为不同,以便您仍然可以在{% 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还包含2个额外的变量,告诉您关于当前嵌套级别的信息

  • level:当前嵌套级别(1索引 - 因此树的根级别是1,2级是2等)
  • level0:当前嵌套级别(0索引 - 因此树的根级别是0,2级是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 %}

安装

composer require qeep-pro/twig-tree-tag

使用

独立

$loader = require __DIR__.'/vendor/autoload.php';

$twig = new \Twig_Environment(
    new \Twig_Loader_Filesystem(__DIR__.'/view/')
);

$twig->addExtension(new QEEP\TwigTreeTag\Twig\Extension\TreeExtension());

// (...)

Symfony 3

将以下行添加到services.yml

app.twig.tree_extension:
  class: QEEP\TwigTreeTag\Twig\Extension\TreeExtension
  tags:
    - { name: twig.extension }

许可协议

MIT 许可协议 (MIT)

请阅读许可协议文件以获取更多信息。