Komponenta Navigation – aktivní menu

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

Prosím o radu, nedaří se mi nastavit aktivní node

V basePresenteru mam tohle:

protected function createComponentNavigation($name) {
    $nav = new \Navigation\Navigation($this, $name);
    $nav->setupHomepage("Úvod", $this->link("Homepage:"));

    $navigace = array(
        'Správa obsahu' => array(
            'Kategorie' => 'Kategorie',
            'Globální texty' => 'Texty',
            'Správa obsahu' => 'Filemanager',
        ),
        'Moduly' => array(
            'Novinky' => 'Novinky',
            'Články' => 'Clanky',
        )
    );
    foreach ($navigace as $k => $v) {
        $sec = $nav->add($k, $this->link($v . ":"));
        foreach ($v as $nazev => $link) {
            $article = $sec->add($nazev, $this->link($link . ":"));
            if ($this->template->presenterName == $link) {
                //$nav->setCurrent($sec);
                $nav->setCurrent($article);
            }
        }
    }
}

Menu pak vypisuji takhle:

{block #menu}
<li n:foreach="$children as $item" {if $item->isCurrent} class="current"{/if}>
    <a href="{$item->url}">{$item->label}</a>
    {if $renderChildren && count($item->getComponents()) > 0}
    <ul>
        {include #menu, children => $item->getComponents()}
    </ul>
    {/if}
</li>
{/block}

Chtěl bych, když jsem v sekci Články, aby byl zároveň aktivní i link Moduly, ale nevím jak na to. Nevím jak poslat soukr. zprávu J.Markovi :( tak to dávám sem.

Editoval mrataja (17. 8. 2011 18:28)

Jan Voráček
Člen | 90
+
0
-

Budeš si muset upravit třídu Navigation. Předpokládám, že chceš mít jako current označenou celou cestu až ke koncovému prvku – odkazu. Musíš tedy přepsat metodu setCurrent(), kde místo jednoduchého nastavení property uzlu isCurrent na true/false budeš procházet všechny nadřazené prvky a postupně nastavovat jejich isCurrent. Inspiraci pro procházení si můžeš vzít v metodě renderBreadcrumbs().

Editoval Jan Voráček (17. 8. 2011 23:45)

bojovyletoun
Člen | 667
+
0
-

používám upravenou komponentu navigator, jinak si napiš svou funkci add, která sebe volá rekurzivně…

// nameto params() vrací  pole node=>webalize($name)
  if($this->presenter->isLinkCurrent('this', $this->nameToParams($i))) //mark current
		$this->b()->setCurrent($item);

celé, není to dokonalé, ale funguje to. odkaz – ukázka tam nejde
srdcem je metoda setTree

<?php

use Nette\Application\UI\Control, Nette\Utils\Strings;

/**
 * bojovyletoun
 *  @property array $tree
 */
class Navigator extends Control{
    /*
     * @var array Navigation tree
     */
    private $tree;
    public $uriParam='node'; //todo ! set before adding? name?

    public function setTree($tree){
	$this->tree = $tree;
	$this->removeComponent($this->b());
	$this->add($tree, $this->b());
    }

    private function add($child, $parent){
	foreach($child as $i => $j){
	    if(!is_array($j)) // normalize
		$i = $j; //todo ! use rather keys?
	    $item = $parent->add($i, $this->presenter->link("this", $this->nameToParams($i))); // add item
	    if(is_array($j)) //recursive tree build
		$this->add($j, $item);
	    if($this->presenter->isLinkCurrent('this', $this->nameToParams($i))) //mark current
		$this->b()->setCurrent($item);
	}
    }

    protected function nameToParams($s){ //todo user handler?
	$s = Strings::webalize($s);
	return array($this->uriParam => $s);
    }

    /* backend */

    function createComponentBackend($name){
	return new Navigation;
    }

    /** @return Navigation */
    protected function b(){
	return $this->getComponent('backend');
    }

    /* frontend */

    public function __call($name, $args){
	if(substr($name, 0, 6) == "render"){
	    call_user_func_array(array($this->b(), $name), $args);
	}
    }

}