Různé názvy ID pro různé presentery

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

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

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

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

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

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

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

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.