Pomoc s Routama pro friendly URL s id parametrem

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

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
+
0
-

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.