Renderovanie stromoveho menu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
srigi
Nette Blogger | 558
+
0
-

Hi, na zaklade tohto prispevku som si spravil sablonu na stromove menu. Funguje to vyborne ale trocha mi vadi aky HTML kod to generuje:

<ul>
  <li>Lorem</li>
  <ul>
    <li>Lorem's child</li>
    <li>Dolor</li>
    <ul>
      <li>Dolor's child</li>
      <li>Sit amet</li>
    </ul>
  </ul>
  <li>Etiam</li>
</ul>

Takto to nie je moc koser. Som nauceny, ze ak nasleduje submenu, LIcko sa neuzavrie ale do neho na vlozi cele ULko a uzavrie sa az za nim.

<ul>
  <li>
    Lorem
    <ul>
      <li>Lorem's child</li>
      <li>
        Dolor
        <ul>
          <li>Dolor's child</li>
          <li>Sit amet</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Etiam</li>
</ul>

Snazim sa vseliako sachovat s tou sablonou od Davida, ale nedari sa mi taketo vyrenderovanie dosiahnut. Any ideas?

srigi
Nette Blogger | 558
+
0
-

Takisto by som rad vyriesil taku vec, ze kcem dat najvyssiemu UL nejaku class, tak bohuzial s ta rekurzivna sablona tu class rozkopiruje po celom strome.

Jakub Lédl
Člen | 55
+
0
-
{block #menu}
<ul>
        {foreach $menu as $item}
        <li>{if is_array($item)} {include #menu, 'menu' => $item} {else}{$item}{/if}</li>
        {/foreach}
</ul>
{/block}

David uvádí v příspěvku #31 tohle. To by mělo generovat správný výstup, ne?

Ondřej Mirtes
Člen | 1536
+
0
-

HTML kód v tamtom threadu mi přijde OK, měl by generovat validní výstup. Ukaž svoji šablonu, co to takto špatně generuje.

S aplikováním class jen na nejvyšší úrovni mě napadá např. si v controlu/presenteru do šablony předat proměnnou $level nastavenou na 0 a v šabloně vypisovat tu class jen pokud $level == 0. Je možné, že se ani nepředá dál při tom includování, pokud ji vysloveně neuvedu v {include} (nevím, je potřeba otestovat), tak by stačilo testovat nějakou takovou proměnnou na isset($var).

nAS
Člen | 277
+
0
-

Tu kořenovou třídu můžeš vyřešit třeba takhle (netestováno):

{block #menu}
<ul{if $root} class="root"{/if}>
  {foreach $menu as $item}
  <li>{if is_array($item)} {include #menu, 'menu' => $item, 'root' => FALSE} {else}{$item}{/if}</li>
  {/foreach}
</ul>
{/block}

a v render() metodě nastavíš:

$template->root = TRUE;

Edit: Ha, Ondra mě předběhl…

Editoval nAS (22. 1. 2010 0:32)

srigi
Nette Blogger | 558
+
0
-

No, mal som drobnu chybku v sablone, takze som postol naozaj divny HTML kod. Napriek tomu, aj ked mam sablonu presne ako v Davidovom poste, vznika takyto kod:

<ul>
  <li>Lorem</li>

  <li><!-- obaluje sub UL -->
    <ul>
      <li>Lorem's child</li>

      <li>Dolor</li>
      <li><!-- obaluje sub UL -->
        <ul>
          <li>Dolor's child</li>
          <li>Sit amet</li>
        </ul>
      </li>

    </ul>
  </li>

  <li>Etiam</li>
</ul>

cize sub UL-ko je obalene dodatocnym LI-ckom tej istej urovne. To nie je az take zle, ale ako pisem, som zvyknuty sub UL-ko v rovnakom LI. Ale uvidim ako sa s tym popasujem pri stylovani menu. Necham to tak ako to je (asi je pre mna len tazke odhodit zvyk).

Pridanie class na najvyssom UL a jej nasledne zablokovanie som vyriesil presne ako postol nAS (najskor true, potom predat dalej false).

Editoval srigi (22. 1. 2010 0:47)

iguana007
Člen | 970
+
0
-

Já toto řešil minulý týden a využil jsem k tomu addon od joda TreeView verzi 0.5.2 + jsem upravil šablonu tak, aby se generovala validně dle pravidel XHTML 1.0 Strict:
https://forum.nette.org/…353-treeview
na konci vlákna je ta upravená šablona.

igi

Editoval iguana007 (22. 1. 2010 9:44)