ifCurrent na celý modul

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
stpnkcrk
Generous Backer | 190
+
0
-

Používám v aplikaci moduly (pět modulů) a u jejich výpisu chci zvýrazňovat aktuální pomocí ifCurrent.

Pokud potřebuji, aby bylo ifCurrent TRUE pro všechny pohledy jednoho presenteru, jde to pomocí :Module:Presenter:*.

Když se o něco podobného ale snažím u modulů, nedaří se. :Module:* ani :Module:*:* nefunguje.

Ví někdo jak na to? :)

stpnkcrk
Generous Backer | 190
+
0
-

Před dvěma měsíci jsem se ptal na výše uvedený dotaz, nicméně bez odpovědi. Zkusím to tedy ještě jednou a trochu lépe zformulovat.

Vezměme v úvahu třeba následující strukturu aplikace:

FirstModule
	HomepagePresenter
	SomePresenter
SecondModule
	HomepagePresenter
	SomeOtherPresenter

V rámci každého modulu je navigace, ve které chci zvýraznit aktuální Presenter. Jasně, to není problém, nepříklad pomocí {ifCurrent :Admin:Homepage:* (pro všechny pohledy pod Homepage).

Navíc je navigace pro přecházení mezi moduly. A zde bych také chtěl využít {ifCurrent ...}. Ovšem jak na to, aby se tak dělo při všech pohledech všech presenterů v modulu? Zkoušel jsem následující možnosti,

{ifCurrent :First:*}
{ifCurrent :First:*:*}

ale ani jedna z nich nefunguje.

Napadá někoho nějaké řešení? Umí vůbec ifCurrent to, co já potřebuji. Myslím, že je to celkem užitečná věc.

Díky

resit. dg

Editoval skocourek (25. 4. 2009 22:48)

pmg
Člen | 372
+
0
-

Aby sis tu nemusel povídat pro sebe, řeknu alespoň tolik, že David se tím nejspíš hodlá zabývat. Nebo jsi na Sobotě? Kdo psal ten poslední post? :-)

Edit: Koukám, že budu zase muset použít tlačítko Smazat. :-(

Editoval pmg (25. 4. 2009 21:23)

stpnkcrk
Generous Backer | 190
+
0
-

Poslední post jsem psal já na příkaz Davida – ze soboty. :)

pmg: sloučil jsem předposlední a poslední příspěvek. :)

Editoval skocourek (25. 4. 2009 22:48)

pmg
Člen | 372
+
0
-

Objevil jsi snad tlačítko Smazat? Hádej, jaké je moje oblíbené tlačítko… Tak pozdravuj ostatní. :-)

ji_ri_k
Člen | 44
+
0
-

Jak to vypadá s tím ifCurrent u těch modulů? Už se to nějak vyřešilo? Prohledával jsem fórum, ale nikde jsem zatím nenašel zmínku o tom, zda to už nějakým způsobem funguje. Aplikaci stavím také na několika modulech a rád bych ifCurrent využil. Případně existuje nějaké jiné elegantní řešení?

David Grudl
Nette Core | 8218
+
0
-

Bude to, ale jiné věci mají vyšší priority.

Milhauz
Člen | 26
+
0
-

ifCurrent na celý modul řešim tak, že mám něco jako BasePresenter pro daný modul. V něm nastavim pro šablonu direktivitu isWantedModule = TRUE; a v šabloně následně otestuju, zda se jedná o daný modul.

Čiže něco jako:

<?php
class Admin_AdminPresenter extends BasePresenter {

  protected function startup() {
    parent::startup();
    $this->template->isAdminModule = TRUE;
  }
}
?>

A v šabloně:

<?php
{if isset($isAdminModule) && $isAdminModule}class="current"{/if}
?>

Přijde mi to docela elegantní a hlavně jednoduchý :-)

Endrju
Člen | 147
+
0
-

David Grudl napsal(a):

Bude to, ale jiné věci mají vyšší priority.

Pohnulo se to nejak Davide?

Nevim, zda to ma ifCurrent take zvladnout, ale pokud chci zvyraznovat menu pro vsechny pohledy aktualne zobrazeneho prezenteru , tak to nejde..
zkousel jsem

$this->template->menuItems = array(
	'Presenter1:' => 'Domu',
	'Presenter2:' => 'O nás',
);

v sablone pak

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

Funguje to pouze pokud zobrazim akci default, pro akce jako napr.: edit, add, … se aktualni polozka menu nezvyrazni.

norbe
Backer | 405
+
0
-

Pokud chceš zvýraznit pro všechny akce daného presenteru, musíš použít Presenter1:*

Endrju
Člen | 147
+
0
-

norbe napsal(a):

Pokud chceš zvýraznit pro všechny akce daného presenteru, musíš použít Presenter1:*

tohle prave nefunguje. Mam jedno takove funkcni reseni, ale je neni to moc hezke :/. Sepisu to a postnu…

Mejme Admin modul. V metode beforeRender si nastavime polozky menu a pak jeste zjistime jaky presenter je zrovna (v prohlizeci) zobrazny

class Admin_BasePresenter extends BasePresenter
{

	protected function beforeRender()
	{
		parent::beforeRender();

		$this->template->menuItems = array(
			'Homepage:' => 'Domu',
			'AboutUs:' => 'O nás',
			'Employees:team' =>  'Tym',
			'Contact:' => 'Kontakt',
		);

		/**
		* Zjisteni aktivni polozky v menu pro Admin modul:
		*
		* Menu mame definovano jako pole, kde KEY je nazev presenteru a hodnota je nazev polozky menu, ktery se zobrazi v sablone.
		* $this->getName() nam vrati retezec "Admin:Presenter:", ktery musime upravit tak, aby se shodoval s polozkou v poli.
		* Tedy aby obsahoval jen "Presenter:".
		*
		* To provedeme nahrazenim retzce "Admin:" prazdnym retezcem.
		* Vysledek pak posleme sablone.
		*/
		$this->template->menuActive = str_replace('Admin:', '', $this->getName()) . ':';

		// tohle vraci stejny vysledek, ale bude asi narocnejsi na zpracovani
		// $this->template->menuActive = str_replace(':Admin:', '', str_replace($this->getAction(FALSE), '', $this->getAction(TRUE)));

	}

}

V sablone pak menu projdeme foreachem a vypiseme jednotlive polozky menu. Porad to ale neni to co potrebujeme, takze musime polozky ziskane z pole upravit.

<li n:foreach="$menuItems as $id => $item" {if str_replace(substr($id, strpos($id, ':') + 1, strlen($id)), '', $id)===$menuActive}class="current"{/if}>
	<a href="{plink //$id}">{$item}</a>
</li>

Co se tedy v kodu sablony stalo? Promenna $id obsahuje hodnotu klice z pole $menuItems, coz je vlastne nazev presenteru popripade jeste s nazvem akce (tedy Presnter: nebo Presenter:Akce). A protoze tak jak mame menu definovano, muze obsahovat i nazev akce a my potrebujeme porovnavat pouze nazev presenteru (chceme zvyraznit polozku menu pro vsechny pohledy daneho presenteru). Takze hodnotu $id upravime tak, aby obsahovala pouze nazev presenteru, abychom ji mohli porovnat s hodnotou $menuActive, ktera jiz obsahuje pouze nazev presenteru.

Takze pokud $id obsahuje napriklad retezec „Employees:team“, tak najdeme znak dvojecku a vsechno za ni z retezce odstranime. Tohle udelame takto:

str_replace(substr($id, strpos($id, ':') + 1, strlen($id)), '', $id)

Vysledkem je tedy nazev presenteru a ten uz muzeme porovnat s promennou $menuActive (tu jsme nastavili v presenteru)


Ano vim, ze je dost nehezke, ale nenapadlo me jine reseni, ktere by fungovalo. Pokud na neco prijdete, budu jedine rad.

Editoval Endrju (29. 3. 2010 21:31)