Cool route jednodše předání pole které se nahradí

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

Ahoj, existuje nějaká route kde předám pole hodnot a ta se prostě aplikuje, například:

array(
	'news.news' => 'novinky',
	'news.page/default/4133' => 'novinka-jedna',
	'news.page/default/4145' => 'novinka-dva',
)

Atd, koukal jsem na routy, ale moc moudrý z toho nejsem přitom mi přijde, že tohle musí řešit každý druhý. Díky

CZechBoY
Člen | 3608
+
0
-

Co tohle vlastně dělá?
Máš dvě coolurl a jak z toho má aplikace poznat, co se má provést?

Přečti si třeba tenhle návod jak v aplikaci udělat coolurl pro články:
http://zlml.cz/…te-prakticky#…

Editoval CZechBoY (12. 12. 2015 22:21)

joseff
Člen | 233
+
0
-

No prostě chci aby bylo v url toto: www.mojedomena.cz/novinka-jedna a teď tam mám toto: www.mojedomena.cz/…default/4145 ale ty řešení co jsem našel vždy řeší nějaké složitosti a takto jednoduchý případ jsem nikde nedohledal… i v tom odkazu :-(

F.Vesely
Člen | 369
+
0
-

Takhle (jak pises v prvnim prispevku) se to nedela. Do tabulky, kde mas ulozene novinky, si pridas dalsi sloupecek slug, ktery byl mel byt jedinecny a do nej si budes ukladat to novinka-jedna, novinka-dva, atd. Ja tam vetsinou ukladam nazev te novinky, ktery prozenu pres webalize + nejak si ohlidam, aby to bylo jedinecne.

Dalsi cast je ta, ze musis nejak prevest id novinky na slug a slug na id a to presne se resi v odkazovanem clanku od Martina Zlamala.

Pavel Janda
Člen | 977
+
+1
-

Tedy: zde je ukázková RouterFactory:

<?php

namespace App;

use Nette;
use Nette\Application\Routers\RouteList;
use Nette\Application\Routers\Route;


class RouterFactory
{

	private $urls = [
		'novinka-jedna' => [
			'presenter' => 'Homepage',
			'action' => 'detail',
			'id' => '4145',
		]
	];


	/**
	 * @return Nette\Application\IRouter
	 */
	public function createRouter()
	{
		$router = new RouteList;
		//$router[] = new Route('<url>', 'Homepage:default');

		$router[] = new Route('[<url [a-z-0-9\/]+?>]', [
			NULL => [
				Route::FILTER_IN => [$this, 'urlIn'],
				Route::FILTER_OUT => [$this, 'urlOut']
			]
		]);

		return $router;
	}


	public function urlIn($params)
	{
		$url = trim($params['url'], '/');

		if (isset($this->urls[$url])) {
			return $this->urls[$url];
		}

		return NULL;
	}


	public function urlOut($params)
	{
		foreach ($this->urls as $url => $url_params) {
			if ($params == $url_params) {
				return ['url' => $url];
			}
		}

		return NULL;
	}

}

A zde config.neon:

services:
	- App\RouterFactory
	router: @App\RouterFactory::createRouter

Ale jak psal F.Vesely, je vhodné ukládat si informace o slugu do databáze, nebo nějak stranou. Tahle RouterFactory ti to snad pomůže rozchodit.

Editoval Pavel Janda (13. 12. 2015 11:25)

joseff
Člen | 233
+
0
-

Paráda děkuji moc!

David Kudera
Člen | 455
+
0
-

Pokud potřebuješ jen takhle jednoduše vytvořit adresy, tak bude možná lepší a jednodušší použít static-router . Jako bonus je i o něco rychlejší, než defaultní nette router.

Edit: ale neumí pracovat s parametry ;-)

Editoval David Kudera (14. 12. 2015 0:04)