Problém s routováním na blogu
- Martin Mates
- Člen | 179
Zdravím, píšu komponentu (jmenuje se toadPress), která vypisuje články z blogu a sama si vytváří routy pro jednotlivé články a kategorie.
Vypadá to asi takhle:
<?php
// Routy pro kategorie + pagination
foreach ($categories as $category) {
$router[] = new Route('koutek-muzikantu/' . $category['slug'] . '/<toadPress-vp-page>/', array(
'presenter' => 'Blog',
'action' => 'queenieBlog',
'do' => 'toadPress-Category',
'toadPress-category' => $category['term_id'],
'toadPress-vp-page' => 1,
));
}
// Routy pro články
foreach ($posts as $post) {
$router[] = new Route('koutek-muzikantu/' . $post['post_id'] . '/' . $post['post_name'] . '/', array(
'presenter' => 'Blog',
'action' => 'queenieBlog',
'do' => 'toadPress-Article',
'toadPress-id' => $post['post_id'],
));
}
?>
Tohle funguje v pořádku. Mám routy jako:
- koutek-muzikantu/nezarazene/<toadPress-vp-page>/
- koutek-muzikantu/novinky/<toadPress-vp-page>/
- koutek-muzikantu/odkazy/<toadPress-vp-page>/
- koutek-muzikantu/32/proc-to-pred-koncertem-nekdy-trva/
- atd…
Tak, teď bych rád vytvořil routu pro home page blogu. Adresa jen „koutek-muzikantu/“, kde se vypíšou všechny články. Když nad všechno přidám routu:
<?php
$router[] = new Route('koutek-muzikantu/<toadPress-vp-page>/', array(
'presenter' => 'Blog',
'action' => 'queenieBlog',
'do' => 'toadPress-Category',
'toadPress-category' => null,
'toadPress-vp-page' => 1,
));
?>
Tak tahle routa najednou chytá úplně všechno. Adresa je „koutek-muzikantu/novinky/“, ale chytla to ta routa, takže mam category pořád null. Nechápu, jak to může ta routa chytnout. Když jí zkusím dát pod ten cyklus s kategoriemi, tak tu home page zase chytne první routa a dostanu se na „koutek-muzikantu/nezarazene/“.
Moc tomu nerozumím. Budu vděčný za jakékoli nakopnutí.
- Martin Mates
- Člen | 179
gmvasek napsal(a):
Proč vůbec přidáváš tolik rout? Nestačily by ty dvě co máš na začátku bez těch foreachů?
Nevím, jak jinak bych udělal adresu „/koutek-muzikantu/novinky/“ která bude znamenat category-id 4. To samé s názvem článku v url.
- Vyki
- Člen | 388
Mrkni se na https://forum.nette.org/…leho-routeru?…. Je to příklad jak použít překladový slovník pro překlad permalinku na id a opačně. Čím více rout tím více zabiješ rychlost skriptu.
Edit: Překladový slovník se dá úplně suprové propojit s databází – pak je dobré data z něch cachovat.
Editoval Vyki (26. 7. 2010 14:42)
- Martin Mates
- Člen | 179
Vyki napsal(a):
Mrkni se na https://forum.nette.org/…leho-routeru?…. Je to příklad jak použít překladový slovník pro překlad permalinku na id a opačně. Čím více rout tím více zabiješ rychlost skriptu.
Edit: Překladový slovník se dá úplně suprové propojit s databází – pak je dobré data z něch cachovat.
Díky moc! Prozkoumal jsem ty překladové slovníky a povedlo se mi udělat, více méně, co jsem potřeboval pomocí jedné routy.
Narazil jsem ale na další problém, který nevím, jak řešit. Chtěl bych
mít ID i název článku v URL. Takže článek s id 21 bude mít URL
/21/nazev-clanku/
. To je docela problém. Nejprve jsem zkusil
napsat překladový slovník, který bude ID překládat na /id/nazev-clanku/,
ale to nejde. Překladový slovník asi nemůže vracet nic s lomítkem.
Povedlo se mi to s pomlčkou.
Potřeboval bych tedy něco jako
<?php
$router[] = new Route('koutek-muzikantu/' . '<toadPress-id>/<toadPress-id #clanek>', array(...
?>
aby bylo v URL id jednou normalne a podruhe prelozene. Ale pochopitelně to takto nefunguje.
Jak byste na to šli?
- Martin Mates
- Člen | 179
Ola napsal(a):
Jak přidáváš styl (addStyle), dej mu druhý param jako
NULL
Teď jsem se na to díval. Chová se to dost zvláštně.
<?php
Route::addStyle('#clanky');
Route::setStyleProperty('#clanky', Route::FILTER_OUT, callback('ToadPress::postGetName'));
// Routy pro články
$router[] = new Route($prefix . '<toadPress-id #clanky>/', array(
'presenter' => 'Blog',
'action' => 'queenieBlog',
'do' => 'toadPress-Article',
));
?>
To funguje v pohodě, nahrazuje to id názvem článku. Když ale zkusím cvičně do addStyle přidat ten druhý parametr NULL, routa přestane úplně fungovat.
EDIT: Podle mě to ani nepůjde, protože tím druhým parametrem NULL akorát přepíšu nějaký default styleProperty. Ten ale stejně přepíšu tím vlastním. Když tam zkouším pracovat třeba se zavináčem, tak přes rawurlencode rozhodně neprojde a normálně se zobrazí v url.
Editoval Martin Mates (26. 7. 2010 21:14)
- Martin Mates
- Člen | 179
Ola napsal(a):
Fungovat to musí :-), v kódu to nedělá žádnou magii. Mimochodem, nechybí Ti tam FILTER_IN?
Já sleduju zatím jenom jestli se vůbec vytvoří správná URL, proto IN zatím neřeším. Když tam není parametr NULL, tak se vytvoří správně. Když ho tam přidám, tak se aplikuje až poslední default routa <presenter>/<action>/<id>. Já už to řeším celej den a celkem uz me to SE.. .
- Vyki
- Člen | 388
Martin Mates napsal(a):
Potřeboval bych tedy něco jako<?php $router[] = new Route('koutek-muzikantu/' . '<toadPress-id>/<toadPress-id #clanek>', array(... ?>
aby bylo v URL id jednou normalne a podruhe prelozene. Ale pochopitelně to takto nefunguje.
Řekl bych, že se ty parametry nesmějí jmenovat stejně. Co kdyby jsi ten jeden přejmenoval?
<?php
$router[] = new Route('koutek-muzikantu/' . '<toadPress-id>/<toadPress-id-trans #clanek>', array(...
?>
- Martin Mates
- Člen | 179
Uh? Jak přejmenoval? Ten parametr se jmenuje tak, jak vypadá v normálním getu. Tj /koutek-muzikantu/?toadPress-id=32. Nazev komponenty pomlčka parametr. Když tam přidám další, který se bude jmenovat jinak, tak se ta routa nematchne. Am I missing something? :-)
- Ola
- Člen | 385
Mně přijde, že je chyba přímo v Nette – na řádku 512.
Imho má být podmíněna na „když $pattern
není
''
“. Potom to začne fungovat, otázka ale jsou případné
zpětné nekompatibility :)
EDIT: můžeš to lokálně vyřešit pomocí doplnění onoho výrazu – do té masky před #styl přidat „.*“ – tím podvrhneš hodnotu, jejíž neprázdnost se nyní nekontroluje na výraz, který projde vždy (tedy nasimuluješ stejné podmínky). Ale je to spíš takový hack/workaround.
Editoval Ola (26. 7. 2010 23:32)
- Vyki
- Člen | 388
Je pravda, že přidávat kvůli tomu parametr do obslužné metody by bylo
opruz. Nevím jestli Nette myslím na to když potřebuješ v jedné routě
použít 2× stejný parametr. Možná by šlo ten druhý parametr udělat jako
falešný. Pojmenovat ho úplně jinak třeba
<sugar #clanek>
. Ve slovníku by jsi zajistil aby IN vracel
id a OUT název článku, ale nikdy jsem nezkoušel do routy vkládat pareamery,
které nejsou nutné pro kompletaci requestu. Ten tvar s pomlčkou
2-nazev-clanku
by byl možná lepší.