Část routy, která !nesmí! obsahovat výraz (cs|en)
- maarlin
- Člen | 207
Mám v bootstrapu následující routu:
Route::addStyle('town', NULL);
Route::setStyleProperty('town', Route::PATTERN, '[A-Za-z0-9-/]+');
$router[] = new LanguageRouter('coffees/<town >/<lang>', array(
'lang' => $lang,
'presenter' => 'Coffees',
'action' => 'list'
));
<town > obsahuje občas i lomítka, proto ta úprava nahoře.
Přičemž dle RoutingDebuggeru se pro URL
/coffees/praha/en/
matchne následující:
Parameter | Value
---------------------
town | praha/en
lang | cs
Přirozeně nechci, aby se do town matchovalo /en
, protože to
už je ten jazyk, ale nevím, jak to zapsat regulárem do
<town >
, že má přijímat cokoliv, ale nesmí vyhovět
(cs|en)
.
Mám poslední verzi Nette 1.0 alpha z 1.7.2010.
Struktura LanguageRouteru:
<?php
class LanguageRouter extends Route
{
private $setLang;
public function match(IHttpRequest $httpRequest)
{
$appRequest = parent::match($httpRequest);
if ($this->setLang == '' && isset($appRequest->params['lang'])) {
$this->setLang = $appRequest->params['lang'];
}
return $appRequest;
}
public function constructUrl(PresenterRequest $appRequest, IHttpRequest $httpRequest)
{
$params = $appRequest->getParams();
if (!isset ($params['lang'])) {
$params['lang'] = $this->setLang;
}
$newRequest = new PresenterRequest($appRequest->getPresenterName(),
$appRequest->getMethod(), $params, $appRequest->getPost(),
$appRequest->getFiles());
return parent::constructUrl($newRequest, $httpRequest);
}
}
Editoval maarlin (14. 7. 2010 11:15)
- kravčo
- Člen | 721
Mohlo by pomôcť spraviť jazyk povinným (vyňať ho z výčtu predvolených hodnôt). Každopádne to ale nie je šťastný spôsob ako skladať url, keďže to nie je jednoznačné…
Route::addStyle('town', NULL);
Route::setStyleProperty('town', Route::PATTERN, '[A-Za-z0-9-/]+');
$router[] = new LanguageRouter('coffees/<town >/<lang>', array(
// 'lang' => $lang,
'presenter' => 'Coffees',
'action' => 'list'
));
Pritom by stačilo vymeniť poradie parametrov na to, aby to jednoznačné
bolo, napr.: <lang>/coffees/<town>
alebo coffees/<lang>/<town>
- maarlin
- Člen | 207
Tak jsem zase o kousek dále…
/coffees/praha/nove-mesto/
matchne správně vše jak má:
Parameter Value
town praha/nove-mesto
lang cs
/coffees/praha/nove-mesto/en
ovšem matchne toto:
Parameter Value
town praha/nove-mesto/en
lang cs
Možná by stačilo trošku hardcore úprava – v přetížené metodě
match()
:
public function match(IHttpRequest $httpRequest)
{
$appRequest = parent::match($httpRequest);
$appRequest->setParams($appRequest->getParams());
return $appRequest;
}
Standardně ve třídě Route
metoda match()
vrací
klasický PresenterRequest
:
https://api.nette.org/…ute.php.html#221
Ovšem nad touto instancí nejde zavolat žádný getter a standardním
způsobem nezískám $appRequest->name
(čili název Presenteru)
a $appRequest->flags
, protože je evidentně freezed
Čili i kdybych chtěl vrátit vlastní, novou instanci
PresenterRequest
, nedokážu nijak získat název presenteru,
který tam potřebuji.
Sám bych to rád řešil jazykem na začátku, ale klient je klient… :-(