routa, 2 perzistentni nepovinne parametry

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

mam takovouhle routu pro eshop

$router[] = new Route('eshop/<action>[/<page>][/<slug>]', array(
            'module' => 'Front',
            'presenter' => 'Eshop',
            'action' => 'default',
            'page' => 1,
            'slug' => NULL
        ));

v prezenteru 2 perzistetni promenne:

/** @persistent */
public $slug;

/** @persistent */
public $page;

na strance s produkty ve strankovani nastavuji promennou page ({link 'this', page=>2})(adresa eshop/test/2)

z na te strance delam take odkazy na produkt slug ({link 'this', slug=>"riditka-na-kolo"}) (adresa eshop/test/riditka-na-kolo)

avsak na te adrese s produktem (riditka-na-kolo) se te hodnote rovna promenna $presenter->page a ne $presenter->slug

jak je to mozny? vytvarim odkaz pres slug=>"riditka-na-kolo" a ne pres page=>"riditka-na-kolo"

diky

Editoval simPod (6. 5. 2012 20:48)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Routa eshop/<action>[/<page>][/<slug>] staví oba nepovinné parametry na stejnou úroveň. Abys docílil správné pozice slugu (jak ji dozajista zamýšlíš), tak musíš uvést parametry oba. Aby tě na to Nette upozornilo, může routu přepsat následovně: eshop/<action>[/<page>[/<slug>]].

simPod
Člen | 383
+
0
-

aha… a jde to nejak, aby pak nebyla videt page? neco ve stylu eshop/<action>[/<page>||/<slug>]? protoze takhle mi to vyrabi eshop/test/1/riditka-na-kolo

nebo musim udelat novy $router[]?

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Je to o návrhu té URL. Přijdou ti dva požadavky zvenčí:

  1. eshop/test/1
  2. eshop/test/riditka-na-kolo

Jak rozeznáš, jestli je to $page nebo $slug?

Řešením by bylo rozhodovat to podle té hodnoty, třeba že vše je $slug, ale pokud je to číslo, tak je to $page. Nevím, jestli to jde udělat pomocí objektu Route (možná ano, opravdu nevím), každopádně by to šlo řešit pomocí vlastního routeru.

simPod
Člen | 383
+
0
-

no, to je pravda…
ok, asi necham jen slug a page pujde pres GET

diky

nanuqcz
Člen | 822
+
0
-

Řešením by bylo rozhodovat to podle té hodnoty, třeba že vše je $slug, ale pokud je to číslo, tak je to $page. Nevím, jestli to jde udělat pomocí objektu Route (možná ano, opravdu nevím)

$router[] = new Route('eshop/<action>[/<page [0-9]+>][/<slug [a-z][^/]*>]', ...);
simPod
Člen | 383
+
0
-

to me nenapadlo. zkusil jsem to, funguje vyborne. dekuji prevelice

nanuqcz
Člen | 822
+
0
-

Jen pozor na to, že slug musí začínat písmenem. Předtím mě to nenapadlo, ale lepší je to takhle (stačí když písmeno obsahuje):

$router[] = new Route('eshop/<action>[/<page [0-9]+>][/<slug [^/]*[a-z][^/]*>]', ...);