Menu pro všechny kategorie (latte)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
dog.big
Člen | 49
+
0
-

Zdravím,
generuji si menu (statické) pro zobrazení v latte, vše funguje ok, i označení aktivní „sekce“. Avšak já potřebuji, abych měl označenou sekci (v menu class=„current“) i když navštíví uživatel nějakou podsekci. Dejme tomu Distribution:test1. Jak na to?

Generované menu pomocí kódu:

public function beforeRender()
    {

        // Dynamicaly created menu along with user permissions
        ...
        if ($this->user->isAllowed('distribution', 'access')) {
            $this->template->menuItems['Distribuce produktů'] = 'Distribution:';
        }

        ...
        }
    }

v základním latte zobrazené pak jako:

...
<div n:inner-foreach="$menuItems as $item => $link">
        <a {ifCurrent $link}class="current"{/ifCurrent} n:href="$link">{$item}</a>
</div>
...

Editoval dog.big (27. 2. 2012 12:45)

Jan Endel
Člen | 1016
+
0
-

Tyhle podkategorie se používá wildcard. Navíc ifCurrent je deprecated, používá se místo toho:

<a n:href="Distribution:test1" n:class="$presenter->isLinkCurrent('Distribution:*')">Test 1</a>
dog.big
Člen | 49
+
0
-

Děkuji, nevím však jak to napasovat na ten můj kód g latte i s těmi proměnýmy.

Ot@s
Backer | 476
+
0
-

Netestováno…

...
<div n:inner-foreach="$menuItems as $item => $link">
	{var mylink = preg_replace('/:([a-z0-9]+.*)$/i',':*',$link)}
	<a n:href="$link" n:class="$presenter->isLinkCurrent($mylink)?current">{$item}</a>
</div>
...
Etch
Člen | 403
+
0
-

@Ot@s:

K čemu tohle:

{var mylink = preg_replace('/:([a-z0-9]+.*)$/i',':*',$link)}

??

Proč prostě do toho beforeRender() nedat toto:

$this->template->menuItems['Distribuce produktů'] = 'Distribution:*';
Jan Endel
Člen | 1016
+
0
-

A jak pak wildcard nacpeš do makra link?

Etch
Člen | 403
+
0
-

@pilec:

Vidíš. Píši rychleji, než mi to myslí. :) V šabloně bych to normálně otrimoval, než abych tam měl nějaký „složitý“ regex.

Ono teda obojí je dost naprd, ale dle mého názoru kodér spíše dá trim($link. ':*') než preg_replace('/:([a-z0-9]+.*)$/i',':*',$link).

Pokud je to navíc takhle jednoduché, tak bych se nebál ani

$this->template->menuItems['Distribuce produktů'] = 'Distribution:';
<div n:inner-foreach="$menuItems as $item => $link">
        <a n:href="$link" n:class="$presenter->isLinkCurrent($link.'*')?current">{$item}</a>
</div>

Popřípadě bych klidně posílal oba linky. Něco ve smyslu:

$items[] = array('title' => 'Distribuce produktů', 'link' => 'Distribution:')

foreach($items as $key => $val){
	$items[$key]['current_link'] = $val['link'].'*';
}
$this->template->menuItems = $items;
<div n:inner-foreach="$menuItems as $item">
        <a n:href="$item['link']" n:class="$presenter->isLinkCurrent($item['current_link'])?current">{$item['title']}</a>
</div>

Editoval Etch (28. 2. 2012 6:01)

Jan Endel
Člen | 1016
+
0
-

Průser ale je ten, že takhle uděláš link vždy jen na defaultní view a co kdybych ho chtěl právě na ten zmíněný test1? Potom jsou dle mého jen 2 cesty:

  1. regulár
  2. Dvě různá pole, jedno s wildcardy druhé s linky
Etch
Člen | 403
+
0
-

@pilec:

Ano tohle je samozřejmě pravda, ale marně v paměti pátrám potom, kdy jsem naposled potřeboval použít $presenter->isLinkCurrent('Foo:*') a přitom jsem chtěl odkazovat na jiné než defaultní view. Teď mě ani moc nenapadá, k čemu bych to v praxi nějak využil. Nemáš nějaký příklad, kdy by se tohle dalo nějak „více“ prakticky využít??

PS:
Co jsem koukal na ten regulár tady, tak když bude link absolutní ':Distribution:' tak pravděpodobně vrátí jenom ':*'. (netestováno)

Jan Endel
Člen | 1016
+
0
-

Maximálně mě napadá možnost, kdybych měl rozbalovací menu a chtěl podbarvit i položku co je rozbalená. (Poněkud divoká představa, ale proč ne)

Ot@s
Backer | 476
+
0
-

@Etch – vycházelo se z toho, co měl tazatel k dispozici a chtěl konkrétně řešit. Nebavili jsme se o best practices (samozřejmě, $menuItems by měl být objekt, nebo v případě nenenáročnosti helper). Důležité bycho pochopit princip.

22
Člen | 1478
+
0
-

@pilec: při složitejší navigaci, celkem užitečná věc, mít zvýrazněnou i sekci, pokud jsem v nějaké podsekci.

dog.big
Člen | 49
+
0
-

Děkuji za rady,
mě nejvíce vyhovuje:

<div n:inner-foreach="$menuItems as $item => $link">
        <a n:href="$link" n:class="$presenter->isLinkCurrent($link.'*')?current">{$item}</a>
</div>

Vyřešeno.