Autor Zpráva
SleepingMouse
Profil *
Ahoj,

řeším následující případ:

Mám class, která zajišťuje vygenerování nějakého stromu, který je do sebe zanořený. Rád bych ale oddělil classnu od HTML a měl šablonu bokem. Nechci v šabloně ale volat nějaké funkce a podobně, ta by měla pouze vypisovat stringy, max. tak užití foreach.

Potřebuji docílit rozbalovacích nabídek, do sebe vnořených:

<div class="level-0">
    <div>nejaka data o polozce</div>
    <div class="potomci">
        <div class="level-1">
            <div>nejaka data o polozce</div>
            <div class="potomci">
                <div class="level-2>
                    <div>nejaka data o polozce</div>
                    <div class="potomci">
                        <div class="level-3">
                            <div>nejaka data o polozce</div>
                            <div class="potomci">
                            </div>
                        </div>                        
                    </div>
                </div>                
            </div>
        </div>        
    </div>
</div>

Měl by někdo nápad na takovou realizaci? HTML potřebuji mít oddělené z toho důvodu, že se tato funkce bude používat na více místech a šablonu budu chtít pak přetěžovat.

díky
Alphard
Profil
SleepingMouse:
Nechci v šabloně ale volat nějaké funkce a podobně
Tento požadavek se mi zdá zbytečně tvrdý. V šablonách se běžně používají makra/blocky/... (každý systém tomu říká jinak), které v podstatě představují funkce a lze je volat rekurzivně.
Rekurzivní volání těchto bloků považuji za optimální způsob, jak vypisovat stromové struktury.
SleepingMouse
Profil *
Alphard:
To bych chtěl řešit v té class, šabloně pouze odevzdat šikovně data.
Alphard
Profil
Já se snažím vysvětlit, že váš záměr není rozumný. Jasně, každou rekurzi jde přepsat do cyklu, ale nebude to hezké. Data se samozřejmě připraví mimo šablonu, ale nevidím jediný důvod, proč je nevypsat rekurzivně.

Tady je příklad, jak k tomu lze přistoupit. Troufám si tvrdit, že nic hezčího nevymyslíte.
{% macro level(level_root_class) -%}
    <li>
        <div>
            <a href="...">
                <span>{{level_root_class.name|e}}</span>
            </a>            
        </div>
    
        {% if level_root_class.subclasses %}
        <ul>
        {% for class in level_root_class.subclasses|sort(attribute='name') %}
            {{level(class)}}
        {% endfor %}
        </ul>
        {% endif %}
    </li>
{%- endmacro %}

{% block content %}
<div id="content">
    <div class="tree">        
        <ul>
        {{level(root_class)}}
        </ul>        
    </div>    
</div>
{% endblock %}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: