Routy tahané z databáze

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

Zdravím,..
rozvéjím tedka myšlenku při tvorbě CMS a narazil sem naproblém.

V databázi budu mít kategorie (menu) celého webu:

id | id_parent | url | name | module | <popřípadě další sloupce>

menu se bude tvořit rekurzivně tak, že bude mít neomezeně podkategorií ( prostě klasický strom )

Strukturu adresy vyžaduji mít
http://www.adresa.cz/kategorie/pod-kategorie/pod-pod-kategorie/..<atd>..

každý řádek v tabulce je jedna položka menu a jeden modul (module=presenter:action) defaultně Pages:view, ale jinak se tam bude dát nastavit libovolný presenter v adminu,..

A ted tři otázky otázky:

  1. jak udělat routu aby vzala tenhle vzor adresy (libovolně dlouhý)
  2. napíšu metodu který se předá adresa a ona vrátí z DB presenter:action, a ten potřebuju předat routru, jak na to?
  3. jak udělat routu, abych {plink} předal pole obsahující jednotlivé části url, a on vyhodil správnou adresu podle vzoru nahoře,… (to něná tak duležitý, kdyžtak ji prostě vypíšu do hrej „sám“ :)

ad 2) bych na to šel asi tak že ze servrové proměné vezmu adresu přes funcki si vrátím presenter a action a teprv pak bych vytvořil routu,.. ale to asi není nejvhdonější řešení,..

Tharos
Člen | 1030
+
0
-

Toto se nejlépe řeší přes vlastní router (musí implementovat IRouter), je tu o tom několik vláken i s ukázky.

Doporučuji udělat ho tak, aby umožnil namapovat libovolný presenter:action i id do libovolné hloubky v URL adrese. Tím mám na mysli například to, aby na adrese: example.org/cs/kontakt mohl být například presenter:action Kontakt:default, na example.org/cs/kontakt/pobocky mohl být například Kontakt:pobocky, ale aby například na example.org/cs/prvni-produkt/fotogalerie/detail/1 mohl být presenter:action Fotogalerie:detail s id = 1.

Je to trochu složité, protože když si pak uživatel v adminu nastavuje vlastní url pro zakládané stránky, musí se hlídat, aby nedošlo ke kolizi s nějakými již existujícími adresami (to proto, protože když si na example.org/cs/fotogalerie umístí presenter Fotogalerie, musí se počítat s tím, že je automaticky obsazená i url example.org/cs/fotogalerie/prehled a podobně), ale když si s tím dá programátor v základu práci, tak se s tím systémem pak moc hezky a flexibilně pracuje.

Dopsal jsem teď nedávno takto fungující CMSko na Nette a zatím funguje velmi dobře – zatím se na něj až zázrakem podařilo napasovat snad všechna zadání, i když ještě ani jeden z těch webů není veřejně venku, protože se klienti flákají s podklady. :) Základem je dobrý router a vhodná struktura databáze. Rekurze je zapotřebí nejen kešovat, ale i omezit na minimum. Pro ukládání stromových struktur doporučuji preorder strom, který je sice náročnější na sestavení (to se ale dělá jen v momentě, kdy například admin přidá do systému nějakou stránku), ale získávání dat z něj je poté jedna báseň (například drobečkovou navigaci lze sestavit jedním dotazem do databáze).

Hodně zdaru a co nejméně slepých uliček při vývoji přeju :).