SeoRouter
- Foowie
- Člen | 269
Trošku jsem experimentoval se SimpleSeoRouterem, ale potřeboval jsem jich
celkem hodně.
Nakonec jsem se rozhodl udělat potomka od Route a do něj to „Seo“
zakomponovat. Původně jsem do Route.php nechtěl vůbec šahat, ale nakonec,
po uvážení, že by většina věcí měla proběhnout 2×, jsem vložil do
Route uživatelsky definovatelný callback.
Do konstruktoru přibyl čtvrtý parametr, pole, obsahující seznam
parametrů, které mají projet user-friendly-url překladem. Každá položka
může nabývat buď hodnoty null (nebude se cachovat), nebo pole závislostí
na ostatních parametrech. (Například pokud má parametr ID v každém
presenteru jiný význam, vypadá čtvrtý parametr konstrukotru takto:
array( "id" => array("presenter") )
(Pokud je ve čtvrtém
parametru konstruktoru více parametrů, musí být tyto parametry závislé jen
na parametrech co jsou od něj na levé straně … zatím to nevyhazuje
výjimku ale až bude zase chuť tak bude :p)
Dále se, jako u SimpleSeoRouteru, musí SeoRouter podědit a překrýt
abstraktní metody getId($parameterName, array $params)
a
getUrl($parameterName, array $params)
. $parameterName
je jméno parametru, který se má přeložit a $params
obsahuje
seznam parametrů a jejich hodnot, včetně modulu a presenteru, je-li
v prvním parametru konstruktoru definován.
SeoRouter využívá cache a defaultně je nastavená expirace jeden den, od
vložení prvního záznamu…
- Například v galerii co těďka dělám, je presenter Images
- actions: tag, author, section, gallery
- parameters:
- id = tag, author, section, gallery
- imageId = aktuálně zobrazovaný obrázek
Zde je význam parametru id
závislý na action. Parametr
imageId
je v téhle routě nezávislý.
Příklady výsledných url:
http://www.domena.cz/tag-skala/clovek-padajici-ze-skaly
http://www.domena.cz/section-lide/dav-900-lidi
http://www.domena.cz/gallery-nocni-obloha/zarici-hevzdy
bootstrap.php
ImagesSeoRouter (ty sql dotazy jsou původně v modelu)
Věřím, že je tam bugů do aleluja, ale pro tenhle relativně jednoduchý příklad to funguje =)
… Zatím, pokud se překlad nenajde, tak se nepřekládá. Ale přemýšlím, jestli by spíše neměl router vyhodit null…
- Foowie
- Člen | 269
Trošku jsem to upravil, aby se nemuselo dědit. (Avšak stále funguje postup výše uvedeným způsobem)
V konstruktoru přibyl ještě jeden parametr (defaultně null). Jeho struktura je následující:
Kde nazev-parametru
je jméno parametru které se bude
překládat a $model
je objekt, který musí implementovat
rozhraní IUrlTranslatable
.
Upravený příklad z minulého postu:
bootstrap.php
Např. model Sections: