Pomoc s Routama pro friendly URL s id parametrem
- Toby91
- Člen | 9
Ahoj, chtěl bych vás poprosit o radu, snažím se o friendly URL, pomocí rout. Pokud chápu routy správně, tak vezmou současnou URL s parametry posílaná GETem, a polde pravidel ji přenastaví. Já odesílám parametr id pro přepnutí stránky. Předpokládám že pokud chci použít routy tak jak jsou musím zároveň i poslat parametr url. Takže localhost/nette?url=Home&id=1 Oba parametry tahám z db. Jde pak nastavit router tak aby generoval URL pouze z parametru url a nějak maskoval parametr id? Nebo toho samého dosáhnout nějak jinak? Děkuji.
EDIT: Uvědomuju si že kvůli zpětnému překladu je id nepraktické, ale odkazovat se v db na url mi přijde taky nepraktické. Nebráním se jakkoliv složitému způsobu, pokud by to šlo tak jak bych chtěl. Děkuji ještě jednou :)
Editoval Toby91 (17. 5. 2011 15:47)
- srigi
- Nette Blogger | 558
Ide ti o pekne URL bez ID. Musis si uvedomit ako bude vypadat najdenie
(povedzme) clanku v DB. Ked zadas URL napr.
www.example.com/moj-super-blogpost
, musis mat nejaku techniku ako
clanok podla tohoto parametra najst v databaze. Uplne prirodzene je, ze si
spravis v tabulke s clankami stlpec url
a pri nejakom clanku bude
stlpec obsahovat presne retazec moj-super-blogpost
. Dalsi dolezity
fakt je, ze vsetky taketo HTTP poziadavky (vsetky URL s takymto formatom URL)
musia smerovat na jednu destinaciu (Presenter:akcia)!!!
Routovanie potom nakonfigurujes takto:
$router[] = new Route('<slug [A-Za-z0-9]{3,}>', 'Article:show');
$router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
Ten prvy parameter je maska. Ak URL zapadne do masky, request obsluzi
nastavena destinacia. Na to aby to padlo do Article:show
musi URL pozostavat iba zo znakov A-Z, a-z, 0-9
, dlzka
3 a viac.
V inom pripade, pri URL www.example.com/news/approve/12234
, to
zase vyhovie najspodnejsej route, lebo retazec news/approve/12234
nevyhovuje najvrchnejsej maske. Na toto treba stale mysliet. Keby si masku
v prvej route neobmedzil reularnym vyrazom, padalo by ti do prvej
routy uplne vsetko – nesmies dat hore taku masku, ktora „pozerie“
(vyhovie) aj spodne masky, inak sa nikdy nebude dat zavolat napr.
Homepage:default
!
No a tento priklad je aj odpovedou na tvoju otazku. Mapis si Presenter:
class ArticlePresenter extends BasePresenter
{
public function actionShow($slug)
{
$article = ArticleModel::findByUrl($slug);
}
}
a mas to hotove.