Část routy, která !nesmí! obsahovat výraz (cs|en)

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

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

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>

na1k
Člen | 288
+
0
-

Jestli dobře chápu, jde jenom o to zapsat regulár tak, aby matchoval všechno kromě XY.
Řešil jsem to taky, zde

maarlin
Člen | 207
+
0
-

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… :-(

maarlin
Člen | 207
+
0
-

Tak jsem ještě narazil na Route::getTargetPresenter();. :-)

Ola
Člen | 385
+
0
-

Měl by fungovat regulár [A-Za-z0-9-/]+(?<!(cs|en)) (tedy tvrzení o předcházejícím)

Editoval Ola (19. 7. 2010 14:52)