Problém s routováním na blogu

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

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í.

Aurielle
Člen | 1281
+
0
-

Proč vůbec přidáváš tolik rout? Nestačily by ty dvě co máš na začátku bez těch foreachů?

Martin Mates
Člen | 179
+
0
-

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

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

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?

Ola
Člen | 385
+
0
-

Jak přidáváš styl (addStyle), dej mu druhý param jako NULL

Martin Mates
Člen | 179
+
0
-

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)

Ola
Člen | 385
+
0
-

Fungovat to musí :-), v kódu to nedělá žádnou magii. Mimochodem, nechybí Ti tam FILTER_IN?

Editoval Ola (26. 7. 2010 20:57)

Martin Mates
Člen | 179
+
0
-

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

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

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

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

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ší.