Komponenta Navigation – aktivní menu
- mrataja
- Člen | 57
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
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
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);
}
}
}