Slevomat like routa : IdZaznamu-nejaky-textovy-popis
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- yuni
- Člen | 8
Zdravím, nesetkal se někdo z vás s požadavkem na tvar url jako na slevomatu ? konkrétně
sleva/455887–1–5-hodiny-zabavy-na-adventure-golfu-pro-1-osobu
potřeboval bych něco podobného, jmeno a mesto jsou dva ruzne sloupce z db
autosalon-hodnoceni/{IdAutosalonuZDb}-jmeno-toho-autosalonu-a-mesto-kde-sidli
přičemž současná url vypadá takto
homepage/profil-hodnoceni/{IdAutosalonuZDb}
Editoval yuni (28. 1. 2014 10:23)
- petr.pavel
- Člen | 535
Nette 2.0.8 s prefixy:
Presenter:
public function renderHodnoceni($id, $nazevSlug, $adresaSlug) {
}
Router:
NRoute::addStyle('slug');
NRoute::setStyleProperty('slug', NRoute::FILTER_OUT, function($url) {
return NStrings::webalize($url);
});
NRoute::setStyleProperty('slug', NRoute::FILTER_IN, function($url) {
return NStrings::webalize($url);
});
NRoute::addStyle('nazevSlug', 'slug');
NRoute::addStyle('adresaSlug', 'slug');
$router[] = new NRoute('autosalon-hodnoceni/<id [0-9]+>/<nazevSlug>-<adresaSlug>', 'Salon:hodnoceni');
Šablona:
<a n:href="Salon:hodnoceni $salon['id'], $salon['jmeno'], $salon['adresa']">klikni</a>
EDIT: Bral jsem to z dokumentace a až teď mi došlo, že FILTER_IN je tam zbytečně.
Editoval petr.pavel (28. 1. 2014 18:42)
- Patrik Votoček
- Člen | 2221
@petr.pavel: fuj fuj fuj static
Internal slevomat: :-) (zjednodušená verze)
/**
* @property-read string $ident
*/
class ProductEntity extends \Nette\Object
{
public $id;
public $slug;
// ...
public function getIdent()
{
return sprintf('%s-%s', $id, $slug);
}
}
$router[] = new Route('/sleva/<ident ([0-9]+)(-[a-z0-9-]+)?>', 'Product:default');
class ProductPresenter extends BasePresenter
{
public function actionDefault($ident)
{
$product = $this->loadProduct($ident);
// ...
}
/**
* @param string
* @return \ProductEntity
*/
private function loadProduct($ident)
{
$data = \Nette\Utils\Strings($ident, '~^(\d+)(-[a-z0-9-]+)?$~i');
if ($data) {
$product = $this->model->getProduct($match[1]);
}
if ($product === NULL) { // neexistujici sleva
$this->error(); // 404
} elseif ($product->ident !== $ident) { // ID souhlasí ale zbytek identu ne
$this->redirect(\Nette\Http\IResponse::S301_MOVED_PERMANENTLY, 'this', array(
'ident' => $product->ident,
)); // přesměrujeme na aktuální ident
}
return $product;
}
}
<a n:href=":Product:default ident => $product->ident">{$product->name}</a>