Komponenta pro vytvoření menu (diskuse)
- Endrju
- Člen | 147
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
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
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)