Router pro cool url produktu a kategorii

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

Dělám ted na hezkych url pro kategorie a produkt na webu.
Momentálně to řeším takto:

$router[] = new Route('eshop/<id>', [
			'id'  => [
				Route::FILTER_IN => function($id) {
					if(is_numeric($id)) {
						return $id;
					} else {
						return substr($id, (strrpos($id, '-')+1) );
					}
				},
				Route::FILTER_OUT => function($id) use ($productsRepository) {
					if(!is_numeric($id)) {
						return $id;
					} else {
						$product = $productsRepository->getByID($id);
						if($product != null) {


							return Strings::webalize($product->name.' '.$product->year).'-'.$product->id;
						} else {
							return null;
						}
					}
				}
			],
			'presenter' => 'Detail',
			'action' => 'default'
		]);

Rad bych mel pred nazvem produktu jeste jejich kategorie: kategorie/podkategorie/nazevproduktu-id. S tím ž ale nazev produktu i kategorie se můze zmenit. Jak správne vytvaret tuto url, i pro pripad zmeny nazvu?
Zde: https://forum.nette.org/…-namiesto-id#… jsem našel ze to řeší přes uložení url k produktu
a na zaklade ty az v funkci action..(url) ziskam dany produkt/kategori?
A jestli to chapu, ta pak je potreba pri vytvaření odkazu misto id, davat toto url?

A jak vyřešit to když se budou moc menit url(při zmeně nazvu kategorie, produktu?)

Díky moc

David Matějka
Moderator | 6445
+
0
-

mrkni na globalni filtry, pripadne si rovnou napis vlastni router.

jestli budes mit v URL nadale i ID, tak je to jednoduche a nemusis do DB url ukladat.

kdyz budu vychazet v toho tveho soucasneho, tak bych to resit nejak takhle:

$router[] = new Route('kategorie/<category>/<product>-<id>', [
            NULL  => [
                Route::FILTER_IN => function(array $params) {
					unset($params['category']);
					unset($params['product']);
					//category name ani product name nas v application nezajimaji, staci nam ID
					return $params;
                },
                Route::FILTER_OUT => function(array $params) use ($productsRepository) {
					$product = $productsRepository->getByID($id);
					if ($product === NULL) {
						return NULL;
					}
					$params['category'] = Strings::webalize($product->category->name);
					$params['product'] = Strings::webalize($product->name);
					return $params;
                }
            ],
            'presenter' => 'Detail',
            'action' => 'default'
        ]);