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>