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

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

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)

yuni
Člen | 8
+
0
-

petr.pavel napsal(a):

works like magic :) Díky moc, moc

Patrik Votoček
Člen | 2221
+
+1
-

@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>