Různé názvy ID pro různé presentery
- one-two
- Člen | 80
Zdravim, mam router takovýto:
<?php
Route::addStyle('#cs-presenter', 'presenter');
Route::setStyleProperty('#cs-presenter', Route::FILTER_TABLE, array(
'' => 'Homepage',
'registrace' => 'Register',
'produkty' => 'Product',
'kategorie' => 'Category',
));
$router[] = new Route('index.php', 'Front:Homepage:default', Route::ONE_WAY);
$router[] = $adminRouter = new MultiRouter('Admin');
$adminRouter[] = new Route('admin/<presenter>/<action>', 'Homepage:default');
$router[] = $frontRouter = new MultiRouter('Front');
$frontRouter[] = new Route('<presenter #cs-presenter>/<action>[/<id>]', 'Homepage:default');
?>
jde mi to jestli jde nějak zařídit, abych na presenter Category mohl
posílat parametr s názvem „category_id“ a na třeba Productu
„product_id“ a zároveň mít oba odkazy „odlomítkované“ ve tvaru
/presenter/action/id, jde toto? Dostal jsem se akorát k /?product_id=neco.
Potřeboval bych něco jako /<product_id
A ještě další dotaz, lze v případě kombinace default akce a parametru ono slovo default vynechat? Místo /category/default/sport bych chtěl /category/sport
používám nette 2.0 php 5.3
- Jan Tvrdík
- Nette guru | 2595
Buď si napiš vlastní router (to dělám já a je to návykové) nebo zkus
<presenter>/<action>[/<product_id>][/<category_id>]
.
- Ondřej Mirtes
- Člen | 1536
Proč chceš mít ty různě nazvané parametry? To pak zabraňuje jakékoli optimalizaci počtu rout (když jedna routa obsluhuje více presenterů).
- Jan Tvrdík
- Nette guru | 2595
Osobně nesnáším parametr s názvem ID
(jak v URL, tak
v DB), protože IDček jsou v celé aplikaci stovky a tak nemusí být vždy
na první pohled jasné k čemu dané ID patří.
- one-two
- Člen | 80
Jan Tvrdík napsal(a):
… zkus
<presenter>/<action>[/<product_id>][/<category_id>]
.
Tohle právě bohužel nefunguje, plní to jen product_id ikdyž předávám v linku parametr s názvem category_id
Ondřej Mirtes: přesně ze stejného důvodu jako píše Jan Tvrdík, všude hromada idček a chtěl bych v tom mít trochu pořádek
No přinejhoršim můžu udělat co presenter to vlastní routa, ale tam zas neudělám přeložení na ty český názvy presenteru.
- Jan Tvrdík
- Nette guru | 2595
one-two wrote: (…) plní to jen product_id ikdyž předávám v linku parametr s názvem category_id
Nevěřím ti, ale nemám teď čas to zkoušet. Zkus to prosím ještě
jednou zkontrolovat :)
{plink :Category:view, category_id => 123}
→ category/view/123{plink :Product:view, product_id => 123}
→ product/view/123
Ty odkazy to imho musí vygenerovat správně, problém ale je, že při
„matchování URL“ na PresenterRequest
to nemá jak poznat, jak
se ten parametr má jmenovat.
Řešením je tedy vlastní router (může dědit od Route
) nebo
2× Route
.
Něco takové by mohlo stačit
class FooRouter extends N\A\Route
{
public function match(...)
{
$res = parent::match(...);
if ($res === NULL) return NULL;
if ($res->presName === 'category' && isset($res->params->id)) {
rename(params->id, params->category_id);
} elseif ...
return $res;
}
}
Editoval Jan Tvrdík (17. 3. 2011 16:59)
- one-two
- Člen | 80
Díky za odpovědi. Tak sem se konečně dostal k nějakému testování a
implementaci toho co mi Honza radil. Ten rename
sice fungoval, ale
stejně jsem dostal pak url ve tvaru /category/?category_id=5
místo vytouženého /category/5/
. Předpokládám, že bych měl
upravit nějak toto:
$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
Věděl by někdo? Zkoušel sem kde co, ale né a né se k tomu dostat.