Jedna routa pro různý tvar URL

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

Zdravím

Tak trošku si lámu hlavu s následující routou, která by měla číst pouze ID a vše směřovat na jeden presenter a action.

URL by měl mít tvar:

kategorie(/televize-)78
kategorie(/televize/crt-)44
kategorie(/televize/lcd-)58
kategorie(/televize/lcd/philips-457-)23

Jediné co chci aby to bylo pokud možno jednou routou, to co je v příkladu v závorkách,
tak to mě nezajímá. Potřebuji pouze ty čísla na konci. A vše aby se směřovalo na
Category:view

Hledal jsem zde na fóru a nic dle mých představ jsem nenašel.

Dík za každou radu.

Editoval webdata (4. 1. 2011 21:33)

Aurielle
Člen | 1281
+
0
-
Route::addStyle('#slug');
Route::setStyleProperty('#slug', Route::PATTERN, '.+');

$router[] = new Route('kategorie/[<#slug>-]<id>', array(...));

Netestováno

Editoval gmvasek (4. 1. 2011 21:43)

webdata
Člen | 153
+
0
-

Takže při http://localhost/…/televize-58

Je hodnota ID = televize-58 místo 58.

a při http://localhost/…evize/lcd-58

nastane chyba „No route for HTTP request.“

bojovyletoun
Člen | 667
+
0
-

Pozor, u patternu si dej pozor na dovolené znaky, omez to třeba na [^/-]*

protože dám příklad ( není vyloučen separátor separátor čárka protože pokud se nedefinuje patter, tak se použije default [^/])
...(<i>[,<j >]) a url ...(12,50) a ono to požere ten duhý parameter, takže to vytvoří i=„12,50“ a j=null

dakota
Člen | 148
+
0
-

Je nutné aby bol slug nepovinný? Nedá sa použiť toto:

$router[] = new Route('kategorie/<slug>-<id>', array(
	....
	'slug' => array(
		Route::PATTERN => '.+',
	),
	'id' => array (
		Route::PATTERN => '[0-9]+',
	),
));

alebo zjednodušene:

$router[] = new Route('kategorie/<slug .+>-<id [0-9]+>', array( ... ));

Netestoval som dúfam že to pomože.

Filip Procházka
Moderator | 4668
+
0
-

dakotovo řešení je lepší a na první pohled si myslím že bude fungovat.

Route::addStyle();
Route::setStyleProperty();

jsou zastaralé a budou označeny za deprecated, lepší je

$router[] = new Route('kategorie/<slug>-<id>', array(
        ....
        'slug' => array(
                Route::PATTERN => '.+',
		Route::FILTER_IN => callback(),
		Route::FILTER_OUT => callback(),
		// ...
        )
));

a pokud využíváš jenom pattern je ještě lepší použít

$router[] = new Route('kategorie/<slug .+>-<id [0-9]+>', array( ... ));
Aurielle
Člen | 1281
+
0
-

HosipLan napsal(a):

dakotovo řešení je lepší a na první pohled si myslím že bude fungovat.

Route::addStyle();
Route::setStyleProperty();

jsou zastaralé a budou označeny za deprecated…

To sice ano, ale pořád je Route::setStyleProperty() lepší na navázání filtrů na určité styly zvenku, přičemž se o to nemusím starat při definici rout. (Tohle jsem říkal už na jabberu, ale když mám vlastní modifikaci Route tak mi to ani tak moc nevadí :P)

Editoval gmvasek (5. 1. 2011 14:00)

webdata
Člen | 153
+
0
-

Dik za rady, už jsem se stím popral ale nastal problem na serveru. Na lokalu vše v pohodě. O co jde.

Přes routu:

$router[] = new NRoute('kategorie/<slug .+>-<id [0-9]+>', array(
				'presenter' => 'Category',
				'action' => 'default',));

se dostanu na Category:default kde je:

final class CategoryPresenter extends BasePresenter {
	public function renderDefault($id) {
		$this->idCategory = $id;
		$this->setView('../Default.default');

	}

}

A zde je kámen urazu. Na lokalu se zobrazi šablona Default.default.latte kdežto na ostrem serveru (station.cz) vypadne chyba

NBadRequestException #404
Page not found. Missing template ‚…/templates/Category/../Default.default.latte‘.

Jaxi taxi nechci aby se mi zobrazil nejaky category/default.defaul.latte. Chci aby mi presenter Category zobrazil templates/default.default.latte

Filip Procházka
Moderator | 4668
+
0
-

setView nepatří do render, pokud chceš měnit view musíš to udělat v akci actionDefault a když už máš v té routě povinné dva parametry, proč si je nepředat do akce oba

public function actionDefault($id, $slug) {
	// ...
}

public function renderDefault($id, $slug) {
	// ...
}

a co se týče tohohle

$this->setView('../Default.default');

tak tohle je fujfuj! setView se používá pouze na změnu pohledu aktuální presenteru

public function actionJedna()
{
	$this->setView('default');
}

public function actionDva()
{
	$this->setView('default');
}

public function renderDefault()
{

}

templates/NejakyPresenter/default.latte

{block #content}
...

pokud chceš měnit šablonu na nějakou konkrétnější použíj

public function renderDefault()
{
	$this->template->file = __DIR__ . '/../templates/@moje.sablona.latte';
}

Editoval HosipLan (6. 1. 2011 8:03)