menu - how - Menú de niveles múltiples con TWIG



twig variables (1)

Para generar un menú simple, puedo hacer:

<ul>
  {% for item in items %}
    <li>{{ item }}</li>
  {% endfor %}
</ul>

y entonces:

{% embed '...' with { items: ['Home', 'Articles'] %}

Pero, ¿cómo tengo que escribir el código TWIG, si quiero crear menús profundos sin fin como:

<ul>
  <li>Alpha</li>
  <li>Bravo</li>
    <ul>
      <li>Charlie</li>
      <li>Delta</li>
      <li>Echo</li>
        <ul>
          <li>Foxtrott</li>
        </ul>
      <li>Golf</ul>
    </ul>
  <li>Hotel</li>
  <li>India</li>
</ul>

Thx por ayuda!


Para llevar a cabo la recursión en twig , puede hacer uso de macro's

{% import _self as macro %}

{{ macro.multilevel(foo) }}

{% macro multilevel(array) %}
    {% import _self as macro %}
    <ul>
    {% for item in array %}
        <li>
            {% if item is iterable %}
                {{ macro.multilevel(item) }}
            {% else %}
                {{ item }}
            {% endif %}
        </li>
    {% endfor %}
    </ul>    
{% endmacro %}

twigfiddle

EDITAR Con una matriz simple no es posible anidar niños en el mismo <li> que el padre. Por lo tanto, tendrías que cambiar tu arreglo alrededor,

Matriz reformada

$data = [
    'links' => [
        [
            'title'     => 'alpha',
            'href'      => 'http://www.alpha.com',
            'children'  => [],
        ],
        [
            'title'     => 'beta',
            'href'      => 'http://www.beta.com',
            'children'  => [
                [
                    'title'     => 'charlie',
                    'href'      => 'http://www.charlie.com',
                    'children'  => [],
                ],
                [
                    'title'     => 'delta',
                    'href'      => 'http://www.delta.com',
                    'children'  => [],
                ],
                [
                    'title'     => 'echo',
                    'href'      => 'http://www.echo.com',
                    'children'  => [
                        [
                            'title'     => 'foxtrot',
                            'href'      => 'http://www.foxtrot.com',
                            'children'  => [],
                        ],                      
                    ],
                ],              
            ],
        ],      
    ]   
];

tiwg

{% macro menu(links) %}
    {% import _self as macro %}
    <ul>
    {% for link in links %}
        <li>
            <a href="{{ link['href'] }}">{{ link['title'] }}</a>
            {% if not link['children']|default([]) is empty %}
                {{ macro.menu(link['children']) }}
            {% endif %}
        </li>
    {% endfor %}
    </ul>     
{% endmacro %}

twigfiddle