ninsuo/jordan-tree

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

该软件包的官方仓库似乎已消失,因此该软件包已被冻结。

v1.0.0 2016-05-13 19:22 UTC

This package is not auto-updated.

Last update: 2019-05-24 16:52:10 UTC


README

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

警告

在Twig-1.22.0中生成的PHP标记已更改,并且从该版本开始,此扩展存在许多已知问题。如果您项目使用的Twig版本高于Twig-1.21.2(希望如此),请考虑不要使用此扩展。

要求

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

想法

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

此扩展称为 jordan-tree,以纪念 Jordan Lev,他向 Alain Tiemblo 提出了这个想法。

使用示例

在此示例中,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 %}

安装

composer require ninsuo/jordan-tree

用法

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

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

$twig->addExtension(new Fuz\Jordan\Twig\Extension\TreeExtension());

// (...)

许可证

MIT许可证(MIT)

请阅读LICENSE文件以获取更多详细信息。