Jedna routa pro různý tvar URL
- webdata
- Člen | 153
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)
- webdata
- Člen | 153
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
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
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
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
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
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
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)