Router pro cool url produktu a kategorii
- Domki
- Člen | 310
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
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'
]);