Ziskani jmena aktualniho modulu

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

navazuji na toto toto vlakno.

Mam komponentu, ve ktere chci vykreslovat menu podle toho, jaky modul bude aktualni. Existuje nejaka snadna cesta ke jmenu modulu? Pokud pouziju $this->getName(), dostanu jen jmeno tridy pro komponentu.

Vlastne se cely den trapim s tim, jak vyresit menu podle modulu a jak resit komponenty. Nette by potrebovalo fakt lepsi dokumentaci. :(

Editoval Ajax (25. 4. 2011 22:18)

nanuqcz
Člen | 822
+
+1
-

Ahoj, nemám teď možnost to vyzkoušet, ale napadá mě toto:

V komponentě by mělo jít (podle api) napsat tohle:

$name = $this->getPresenter()->getName();   //získám Module:Presenter
$module = preg_replace("#:?[a-zA-Z_0-9]+$#", "", $name);   //odstranění ":Presenter" z názvu

Snad jsem tam neudělal nějakou chybku.

Ajax
Člen | 59
+
0
-

Diky moc! Funguje to.. :)

Muzu mit doplnujici dotaz, i kdyz mimo nazev? Kde je vhodne plnit komponentu daty? Kdy mam naplnit promennou v sablone, kdyz pracuji s komponentou? V tride komponenty? V presenteru? V tovarnicce? Pro me by bylo nejlepsi v presenteru, ale tam mi to hlasi chybu (Notice: promenna neexistuje)

Editoval Ajax (26. 4. 2011 7:36)

h4kuna
Backer | 740
+
0
-

V tom navazujícim vlákně se bavili o explode, který bude rychlejší než regulární výraz.

<?php
list($module) = explode(':', $this->getPresenter()->getName());
?>

PS: odzkoušeno

explode → 14ms

regular → 20ms

Editoval matata (26. 4. 2011 9:26)

nanuqcz
Člen | 822
+
0
-

Ajax napsal(a):

Kde je vhodne plnit komponentu daty? Kdy mam naplnit promennou v sablone, kdyz pracuji s komponentou? V tride komponenty? V presenteru? V tovarnicce?

To, si myslím, je případ od případu. Já většinou plním data ve třídě komponenty, ale třeba formuláře plním v presenteru, protože jinde to u formulářů prostě nejde :-) Komponenta by měla být od zbytku aplikace co nejvíc oddělená (kvůli znovupoužitelnosti), takže já bych to viděl takhle:

  1. Pokud to jde, nebo pokud to není vyloženě nelogické, plnit ve třídě komponenty
  2. Pokud ne, plnit v továrničce (např u formulářů vnořené selecty na jinou tabulku typu "Tento článek přiřadit ke kategorii: " – kategorie bych načítal v továrničce)
  3. Pokud nejde 1. ani 2., tak v presenteru.

V původním vlákně píšeš, že máš komponentu na vypisování menu. Tu bych asi plnil přímo v její třídě.

Editoval xxxObiWan (26. 4. 2011 11:17)

Aurielle
Člen | 1281
+
0
-

matata napsal(a):

V tom navazujícim vlákně se bavili o explode, který bude rychlejší než regulární výraz.

<?php
list($module) = explode(':', $this->getPresenter()->getName());
?>

PS: odzkoušeno

explode → 14ms

regular → 20ms

Tohle řešení není 100%, bere jen část do první dvojtečky. Taky můžeš mít víc zanořených modulů, což pokud vidím dobře ten regulár řeší.

h4kuna
Backer | 740
+
0
-

gmvasek napsal(a):

Tohle řešení není 100%, bere jen část do první dvojtečky. Taky můžeš mít víc zanořených modulů, což pokud vidím dobře ten regulár řeší.

Mas recht je to pro jeden modul. Ja se regularum vyhybam, ne ze bych je nezvladal, ale setrim s nimi.