Adresářová struktura a velikost písmenek

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8218
+
0
-

Pár pravidel pro zdárný používání velkých a malých písmenek:

  • Ve složce se šablonami je třeba, aby adresáře presenterů začínaly velkými písmeny (viz upravená adresářová struktura).
  • V definicích Route psát presentery a moduly stylem PascalCase.
  • Doporučuji, abyste i v odkazech psali názvy presenterů a modulů stylem PascalCase, view a signály stylem camelCaps.

Na rozboru životního cyklu se pokusím vysvětlit, jak funguje výchozí chování a jak jej lze upravit. Životní cyklus aplikace se dá rozdělit do těchto bodů:

  1. Router: z URL vytvoří objekt PresenterRequest (obsahuje jméno presenteru)
  2. PresenterLoader: ze jména presenteru odvodí třídu a případně název souboru
  3. Presenter volá metody podle akutálního view & action
  4. Presenter načítá šablony: ve hře je název presenteru a view
  5. Renderování: v tomto a předchozím bodě se obvykle vytváří odkazy na jiné presentery a view – to toho se zapojuje opět PresenterLoader a Router

ad 1)

Router Nette\Application\Route má statické pole $styles, které mimojiné určuje, že parametry module, presenter a view budou transformovány (filtrovány) pomocí určitých funkcí. To zajistí převody MyPresentermy-presenter atd. Už z routeru tedy vypadne název presenteru ve tvaru PascalCase. Modifikovat chování lze buď úpravou pole $styles pomocí metod addStyle() a setStyleProperty() a/nebo v definici routy použitím modifikátoru: <presenter #mymod>.

ad 2)

PresenterLoader (dříve PresenterFactory) má za úkol z názvu presenteru vytvořit název třídy a tuto načíst. Výchozí loader název transformuje takto:

  • Admin:Catalog:Default → třída Admin_Catalog_DefaultPresenter (Admin::Catalog::DefaultPresenter v PHP 5.3)
  • zkusí ji načíst nejprve autoloadingem
  • pokud se to nezdaří, tak ze souboru AdminModule/CatalogModule/DefaultPresenter.php (v tuto chvíli záleží na velikosti písmen).

PresenterLoader zároveň umí korigovat název presenteru, pokud nesedí velikost písmen (třída ale musí být načtena).

Chování lze změnit úpravou metod formatPresenterClass() a formatPresenterFile() v PresenterLoader nebo nahrazením loaderu za svůj.

ad 3)

Presenter z názvu view odvodí název patřičné metody z formatRenderMethod(). Pro view edit se bude volat metoda a renderEdit().

ad 4)

Presenter se pokusí podle svého názvu (nezaměňovat s názvem třídy) načíst šablonu layoutu (ta je nepovinná) a šablonu scény. Kde ji hledá určují metody formatTemplateLayoutFiles() & formatTemplateFiles(). Všimněte si množného čísla v názvu – metody vrací pole možných umístění seřazených podle priority. Layout pro zmíněný Admin:Catalog:Default bude hledat v souborech:

  • templates/AdminModule/CatalogModule/Default/@layout.phtml
  • templates/AdminModule/CatalogModule/Default.@layout.phtml
  • templates/AdminModule/CatalogModule/@layout.phtml
  • templates/@layout.phtml

Šablonu pro scénu edit v souborech:

  • templates/AdminModule/CatalogModule/Default/edit.phtml
  • templates/AdminModule/CatalogModule/Default.edit.phtml

Chování lze, jak jistě tušíte, změnit úpravou metod format.

ad 5)

Při odkazování na jiné presentry je vhodné dodržovat konvenci PascalCase, ačkoliv PresenterLoader umí název korigovat.

Nette\Application\Router při vytváření URL má k dispozici správně zapsaný název presenteru. Aby správně fungovalo vynechávání defaultních hodnot, je potřeba i defaultní hodnoty zapsat správně.

phx
Člen | 651
+
0
-

Ahoj Davide jen otazka pro ujasneni:

  • nazev presenteru je napriklad: Admin:MujPresenter:mojeView
  • nazev tridy je: Admin_MujPresenter

Je to tak? Ja jen ze u bodu 3 o nezamenovani nazvu mi to neni zcela jasne.

DIKY

David Grudl
Nette Core | 8218
+
0
-

phx napsal(a):

Ahoj Davide jen otazka pro ujasneni:

  • nazev presenteru je napriklad: Admin:MujPresenter:mojeView
  • nazev tridy je: Admin_MujPresenter

Je to tak? Ja jen ze u bodu 3 o nezamenovani nazvu mi to neni zcela jasne.

DIKY

Nazev presenteru by musel byt Admin:Muj, to Presenter se přilepí, až když se z názvu presenteru formátuje název třídy.