Stránka / Page

Pojmy báze a stránka jsme si vysvětlili zde. Také jsme si objasnili jak funguje báze. A nyní je čas kouknout jak funguje stránka.

Stránku představují tyto třídy:

Třída Význam
Jet\MVC_Page Hlavní třída reprezentující stránku. Jedná se o poměrně komplexní třídu. V praxi se skládá z několika traitů (kvůli přehlednosti)
Jet\MVC_Page_Content Tato třída reprezentuje obsah na stránce. 
Jet\MVC_Page_MetaTag Stejně jako báze má i samotná stránka možnost mít výchozí meta tagy. Ty reprezentuje tato třída.

Přehled všech vlastností a metod najdete u popisu jednotlivých tříd. Tato kapitola bude věnována vysvětlení jak stránka funguje.

Poznámka: Stejně jako v případě báze máte možnost i tyto třídy nahradit svými třídami pomocí systému továren a implementací příslušných rozhraní (interface). Máte tedy možnost si vytvořit vlastní a vám vyhovující implementaci stránek. Zároveň to znamená, že se stránka nikdy neinstancuje přímo, ale vždy přes příslušnou továrnu.

Kde a jak jsou stránky uložené?

Z minulých kapitol už víte, kde jsou uložené báze. Tedy že je to v adresáři ~/application/bases/. Dále víte, že samotná báze je podadresář tohoto adresáře, jehož název odpovídá ID báze. Tedy báze "web" je v adresáři ~/application/bases/web/, "admin" v ~/application/bases/admin/ a tak dále.

Taktéž již víte, že jeden z podadresářů báze je adresář pages. V tomto adresáři pak naleznete další podadresáře, jejichž název odpovídá kódu lokalizace. Tedy ~/application/bases/web/cs_CZ/ obsahuje stránky báze "web" lokalizace "cs_CZ" - čeština (Česká republika).

V tomto adresáři najdete řadu podadresářů a také soubory page_data.php. Význam těch podadresářů je již jiný než u báze. Stánka již nemá žádné své view, žádné layouty a podobně. Tyto podadresáře a další jejich podadresáře, jsou již stránky. Název adresářů odpovídá URL stránek.

Ukážeme si to na příkladu: Koukněte na ukázkovou aplikaci. Je tam například tajná oblast (část webu, kam se návštěvník bez přihlášení a potřebných práv nedostane). A tato "zaheslovaná" stránka má nějaké podstránky. URL jedné z nich je: http://somewhere.universe/tajna-oblast/tajna-informace-1/ a tato URL tedy odpovídá definici stránky v adresáři ~/application/bases/web/cs_CZ/tajna-oblast/tajna-informace-1/

V adresáři stránky najdete soubor page_data.php - což už je definice samotná.

Tedy ...

  • Co stránka to adresář - co adresář to stránka.
  • Název adresáře odpovídá URL stránky.
  • Když chcete přidat stránku, tak prostě vytvoříte adresář a její definici. Nic víc. A v praxi to pravděpodobně budete víc používat Jet Studio, které na správu stránek má potřebný nástroj.
  • Pokud potřebujete URL stránky změnit (ať už pozměnit část URL, nebo zásadněji změnit strukturu), tak prostě uděláte potřebné změny v adresářích - přejmenujete, nebo přesunete příslušné adresáře. Stačí ponechat původní ID stránek (ID stránek je v jejich definici, s názvem adresáře nemá nic společného). Pokud v aplikaci generujete URL tak jak se má (tedy přes instance stránek), tak se již o nic nemusíte starat - maximálně promažete keš, pokud je aktivní.
  • Pokud chcete, tak pro názvy adresářů můžete používat diakritiku. Jet si s tím poradí. Nejsem si jistý, zda je to úplně nejlepší cesta, ale tu možnost máte a v ukázkové aplikaci stránka v jejíž URL je diakritika existuje (kvůli testování a demonstraci možností).

A teď je čas kouknout na samotnou definici stránky, která je uložena v souboru page_data.php

~/application/bases/BASE-ID/pages/LOCALE/**/**/page_data.php

Princip je zcela totožný jako u báze. Tedy dané soubory jsou samotná definice stránek a jsou to opět PHP soubor. Zde již nebudu uvádět ukázku obsahu definičního souboru. Stránka je vlastně o dost rozsáhlejší a komplexnější entita než báze, ovšem princip stále zůstává.

A i zde, nebo lépe řečeno hlavně zde, platí, že máte k dispozici Jet Studio. Dělat definice stránek ručně tedy není nutné. Máte pro to "klikátko".

Když budete chtít provádět něco tak banálního jako třeba úpravu statického obsahu, nebo tvorbu nové statické stránky, tak si dost možná na zdrojáky ani nesáhnete ... Cílem je právě mít čas na pořádnou práci a neřešit banality.

Stránky definované moduly

Ve skutečnosti toto není jediné místo, kde mohou být definice stránek. Stránky mohou definovat jednotlivé moduly v jejich adresáři pages. V praxi tento postup používám pro administraci, kdy jednotlivé moduly tvoří části administrace a každý si sebou nese své stránky právě pro administraci určené. Pro to co vidí návštěvník používám tento standardní přístup. (To je pouze příklad - ne dogma.)

Rozdíl je pouze v tom, kde se definice nachází - kde je fakticky uložena. Dále (z pohledu aplikace) se se stránkami pracuje vždy stejně.

Použití stránek v aplikaci

Stránky toho umí hodně. Nesou důležité informace (např. jaký je titulek, jaké budou na stránce meta tagy, jestli je vůbec stránka aktivní a celou řadu dalších) a umí se prostě "vyrendrovat" - tedy vytvořit na základě všech těchto informací výstup. Pro poznání co vše stránka umí si prosím projděte jednotlivé třídy.

Ovšem nejčastější a nejběžnější věc co bude v rámci aplikace samotné se stránkou dělat je například tvorba URL. A na tomto typickém příkladu si ukažme jak se se stránkou pracuje.

Pro získání instance stránky slouží metoda Jet\MVC::getPage( ?string $page_id=null, ?Locale $locale = null, ?string $base_id = null ): static|null;

Význam parametrů je asi zřejmý. Metoda zkrátka vrací konkrétní stránku, patřící ke konkrétní lokalizaci konkrétní báze (nebo null, pokud stránka neexistuje). Ani jeden parametr není povinný. To znamená, že když například nespecifikujete $locale a $base_id, tak jsou použity aktuální údaje (aktuální báze a aktuální lokalizace). Což je vlastně asi nejčastější použití.

Tedy dejme tomu, že máte stránky s nějakými kontaktními informacemi, která má ID "contacts" a chcete na ní vytvořit odkaz (v rámci aktuální lokalizace aktuální báze). Uděláte toto:

MVC::getPage('contacts')->getURL()

Nebo potřebujete zjistit, jaký má stránka titulek určený pro menu? Pak provedete toto:

MVC::getPage('contacts')->getMenuTitle()

A je to ... Máte zajištěnou konzistenci. Až někdo rozhodne o tom, že se změní URL stránky, tak prostě přejmenujete adresář (a promažete MVC keš). Až se změní titulek stránky, tak to uděláte na jednom místě - v definici stránky. Vše jednoduše a přímočaře.

Mimochodem ... U báze jsem se zmínil, že získání instance báze zapouzdřuji do tříd jako je JetApplication\Application_Web a nepoužívám ID báze přímo. Ano, to samé by mělo platit pro stránky. Ovšem zde nemám žádný univerzální způsob, který by byl vhodný na vše. Opravdu není úplně ideální používat ID stránky ve formě řetězce. Zde se již nabízí použít minimálně nějaké konstanty. Ostatně Jet jednu takovou konstantu má a to Jet\MVC::HOMEPAGE_ID. Protože kořenová stránka - tzv. homepage, vždy musí mít toto ID. Tedy pro ID stránek můžete používat vámi definované konstanty. Nebo klidně také zapouzdření do nějakých metod (pokud to již v tomto případě není kanón na vrabce). Dobré je mít nějakou snadnou možnost jak dohledat kde se daná stránka používá (např. pro případ jejího odstranění). 

Samozřejmě je možné dělat se stránkami spoustu dalších věcí. Co třeba zjistit jaké má aktuální stránka podstránky? Není problém:

MVC::getPage()->getChildren()

Potřebujete naopak nadřazenou stránky? Zde je

MVC::getPage()->getParent()

A tak dále ... Ale to už je lepší kouknout na to co všechno umí příslušné třídy.

Předchozí kapitola
Jet\MVC_Base_LocalizedData_MetaTag
Další kapitola
Jet\MVC_Page