Komponenta pro vytvoření menu (diskuse)

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

Zdravím,

Zkoušel jsem například komponentu od Honzy Marka Navigation, ale ta bohužel nezvýrazňuje aktuální položku menu (nenastavuje ji to SAMO).

Zkoušel jsem se s tím potrápit sám, ale vždycky jsem narazil na nějaký problem. Proto se chci zeptat vás zkušenějších, jak by jste na to šli?

O co tedy jde?
Potřebuju vytvořit menu, u kterého se budou zvýrazňovat aktivní položky a také bude umožňovat nastavit nějaké parametry.

Například bych chtěl nastavit u konktétní položky v menu (např Diskuse) parametr "paginator-page" => NULL


Důvody, které mě k tomu vedou:

Menu mám definováno tímto stylem (neumožňuje definovat paramerty):

$this->template->menuItems = array(
	'News:' => 'Aktuálně',
	'AboutUs:' => 'O nás',
	'Discussion:' => 'Diskuze',
);

V šabloně jej pak vypisuju takto:

<ul>
	<li n:foreach="$menuItems as $id => $item" {ifCurrent $id}class="current"{/if}><a href="{plink //$id}">{$item}</a></li>
</ul>

V menu mezi položkami mám „Diskusi“. Diskuse využivá VisualPaginator. V Diskusi je možno reagovat na příspěvky, takže když chci na nějaký reagovat, požaduji, abych se po zpracování formuláře vrátil zpět na stránku, na které jsem na příspěvek reagoval. To lze, pokud v presenteru definuji persistentni parametr @persistent paginator:

/**
 * @persistent paginator
 */
class Front_DiscussionPresenter extends Front_BasePresenter { ... }

V metodě, která zpracováná formulář, pak mohu díky persistentnímu parametru přesměrovat na původní stránku:

public function discussionFormSubmitted(AppForm $form)
{
	if ($form['save']->isSubmittedBy()) {
		...

		if ($id > 0) {
			...

		}

		$request = $this->getRequest();
		$params = $request->getParams();
		$page = $params['paginator-page']; // stranka na ktere jsme reagovali

		// presmerujeme na stranku, kde bylo reagovano
		$this->redirect('default', array('paginator-page' => $page));
	}
}

Bohužel to má pro mě i negatovní stránku. Číslo stránky z diskuse se totiž prenese i do odkazu v menu. Výchozí položka (pro diskusi) v menu generuje takovýto odkaz: http://domena.cz/discussion/ a takto by to mělo zůstat. Protože jsem ale nastavil persistentní parametr, tak při procházení stránek v diskusi se odkaz v menu mění (nežádoucí vlastnost) podle právě zobrazené stránky např.: http://domena.cz/discussion/?paginator-page=2.

Aby odkaz v menu zůstal ve výchozím tvraru, tak bych definoval pro tuto položku menu (např. „Discussion:“) parametr "paginator-page" => 1, kterým bych nastavil stránku, kerá se má zobrazit jako výchozí.


Byl bych strašně rád, kdyby jste zkusili nastínit nebo ideálně napsat konkrétní řešení.
Potřebuji tedy vytvořit menu, u kterého se budou zvýrazňovat aktivní položky a také bude umožňovat nastavit nějaké parametry.

Cifro
Člen | 245
+
0
-

Navigation od Honzy vie prijimať ďalšie parametre pomocou metódy add() v druhom parametri s metódou link()

// foreach $items as $item...
$menuItem = $nav->add($item->navTitle, $this->link($item->destination, array('id' => $item->id)));

// A aktuálny prvok môžeš zvýrazniť pomocou
if($this->getParam('id') == $item->id){
	$nav->setCurrent($menuItem);
}

// end foreach

kde $item->id obsahuje id stránky a $item->destination cieľový presenter a akciu.


A problém, ktorý maš s vlastným definovaným menu, by som poriešil tak, žeby som urobil viacrozmerné pole, kde ďalší rozmer by boli parametre…

$this->template->menuItems = array(
        'News:' => array('title' => 'Aktuálně', 'params' => array()),
        'AboutUs:' => array('title' => 'O nás', 'params' => array()),
        'Discussion:' => array('title' => 'Diskuze', 'params' => array('paginator-page' => null)),
);
Endrju
Člen | 147
+
0
-

Díky za „nakopnutí“ :).

Trochu jsem si s tím pohrál a dosáhl toho čeho potřebuju.


Komponenta v presenteru pro vytvoření menu (nic jiného v komponentě Honzy Marka Navigation jsem neměnil):

protected function createComponentNavigation($name) {

	// definice polozek v menu
	$items = array(
		'News:' => array('title' => 'Aktuálně', 'params' => array()),
		'AboutUs:' => array('title' => 'O nás', 'params' => array()),
		'Discussion:' => array('title' => 'Diskuze', 'params' => array('paginator-page' => NULL)),
		'Discussion:detail' => array('title' => 'Detail diskuze', 'params' => array('id' => 3)),
	);


	// zpracovani a vytvoreni menu

	$presenter = $this->presenter->getName(); // Module:Presenter (ale taky Presenter, poku nepoužíváme moduly)
	$pos = strpos($presenter, ':');

	if ($pos !== FALSE) {
		$presenter = substr($presenter, $pos + 1); // Presenter (chceme pouze název presenteru)
	}


	$nav = new Navigation($this, $name);

	foreach ($items AS $destination => $item) {
		$menuItem = $nav->add($item['title'], $this->link($destination, $item['params']));

		$pos = strrpos($destination, ':');

		if ($pos !== FALSE) {
			$destination = substr($destination, 0, $pos);
		}

		// Je prvek aktuálním (právě zobrazeným)?
		if($presenter == $destination) {
			$nav->setCurrent($menuItem);
		}
	}

}

Editoval Endrju (20. 6. 2010 0:57)

Cifro
Člen | 245
+
0
-

Som rád, že som pomohol ^_^