router pro vycejazycne url

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

ahoj, je nekdo konkretni funkcni priklad a vytvaret vycejazycne urls???

nejakou praxy k
https://pla.nette.org/…ru-ve-filtru

Jan Suchánek
Člen | 404
+
0
-
$route = new Route('[<lang [cs|en|de]{2} >/]<presenter>[/<action>][/<id [0-9]+>]', array(
    NULL => array( // všechny parametry
        Route::FILTER_IN => array($this->model, 'filterIn'),
        Route::FILTER_OUT => array($this->model, 'filterOut'),
    ),
    'lang' => 'cs',
    'presenter' => NULL, // jen parametr presenter
    'action' => 'default',
    'id' => NULL,

));
vosy
Člen | 532
+
0
-

super dekuji jen se chci zeptat co znamena
$this->model
a
filterIn

Jan Suchánek
Člen | 404
+
0
-
	$this->model->filterIn($params)
vosy
Člen | 532
+
0
-

jsem tupec, furt to nejak nechapu.

Kam treba dat ci ktera prevrati cs/kontakty na ContactsPresenter

:( omlouvam se

Jan Suchánek
Člen | 404
+
0
-

@vosy: Je to jednoduché viz překlady.

NULL => array(
		// metoda dostane parametry a převede je na aplikační parametry.
    Route::FILTER_IN => $this->model->filterIn,
		// metoda dostane parametry aplikační a převede je na prezentační.
		Route::FILTER_OUT => $this->model->filterOut,
),

viz: Kde filterInFunc a filterOutFunc jsou funkce či metody, jenž převádí mezi parametrem v URL a tvarem, který se předává do presenteru. Každá z nich zajišťuje převod opačným směrem.

Nejlepší bude aby ses podíval třeba na Pandovu přednášku

Editoval jenicek (9. 4. 2014 17:01)

vosy
Člen | 532
+
0
-

dix, uz se tim nejak prodiram jen kdyz si udelam fce pro preklady tam mi nette nechce najit Kdyby Translator

$router[] = $frontRouter = new RouteList('Front');
		$frontRouter[] =  $route = new FilterRoute('[<locale cs|en|de>/]<presenter>/<action>/<id>',
				array(
					'presenter'=>'Homepage',
					'action'=>'default',
					'locale'=>'cs',
					'id'=>NULL
					));
		$route->addFilter('presenter', 'PageModule::uriToId', 'PageModule::idToUrl');
<?php

class PageModule
{

    static function uriToId()
    {
        $translator = Nette\Environment::getService('Kdyby\Translation\Translator');
        $locale = $request->params['locale'];

vysledek

Nette\DI\MissingServiceException

Service ‚Kdyby\Translation\Translator‘ not found.

Jan Suchánek
Člen | 404
+
0
-

Nevím přesně o co se snažíš ale pokud mu chceš předat nějakou službu tak musíš přez DI v neonu.

Rozhodně nevím proč by si měl využívat:

$translator = Nette\Environment::getService('Kdyby\Translation\Translator');

Pokud potřebuju v servise nějakou závislost, předávám ji přez konstruktor.

vosy
Člen | 532
+
0
-

snazim se adresu

http://www.bt.loc/en/contacts/ a http://www.bt.loc/kontakty/
nasmerovat pomoci KdybyTranslation na ContactsPresenter.php

vosy
Člen | 532
+
0
-

navic kdy se to snazim dle
https://pla.nette.org/…ru-ve-filtru

$router[] = $frontRouter = new RouteList('Front');

		$frontRouter[] =  $route = new FilterRoute('[<locale cs|en|de>/]<presenter>/<action>/<id>',
				array(
					'presenter'=>'Homepage',
					'action'=>'default',
					'locale'=>'cs',
					'id'=>NULL
					));

		$route->addFilter('presenter', 'PageModule::uriToId', 'PageModule::idToUrl');
class PageModule
{

    static function uriToId($slug, \Nette\Application\PresenterRequest $request)
    {
        // $translator = $this->translator;

        $locale = $request->params['locale'];

        echo $locale;

tak dostanu hlasku

Argument 2 passed to PageModule::uriToId() must be an instance of Nette\Application\PresenterRequest, instance of Nette\Application\Request given

llsm
Člen | 121
+
0
-

Bohužel Nette se za běhu mění a občas člověk na podobné neaktuálnosti narazí, ale zkus se trochu zamyslet, než sem něco píšeš. Píše se tam: Druhý parametr v fci uriToId ocekava podle tveho predpisu objekt tridy \Nette\Application\PresenterRequest a misto toho dostava Nette\Application\Request. Protoze ten predpis je tebou zkopirovany z navodu pro starsi verze nette, kdy se ta trida jmenovala jinak. Jedine, co musis udelat je upravit ten predpis

<?php
class PageModule
{

    static function uriToId($slug, \Nette\Application\Request $request)
    {
        // $translator = $this->translator;

        $locale = $request->params['locale'];

        echo $locale;
}
?>
Jan Suchánek
Člen | 404
+
0
-

@llsm: Ptám se asi blbě, takže sorry, ale ta statika tam asi nebude to pravé ořechové pokud by se chtelo používat nějaká další servisa?

Neřeší to samé co se řešilo už jinde?

Editoval jenicek (10. 4. 2014 13:27)

llsm
Člen | 121
+
0
-

@jenicek: To zalezi na navrhu, statickou funkci zavolas odkudkoliv, aniz bys potreboval instanci tridy, ve ktere se nachazi, tj. je callable. Je to jako globalni promenna, kdokoliv muze zavolat PageModule::uriToId(...). Navod, ktery se snazi reprodukovat je uz out-of-date v teto veci.
Ja si dneska delam vetsinou routery podle presenteru (nebo malych modulu) a do nich si v configu predam modely, ktere potrebuji. A na filtry staci pak anonymni fce (to ale driv v PHP5.2 neslo bezne se delalo to, ze filtr byl v modelu, ktereho se to tykalo, viz. ten stary navod na planette).

Jan Suchánek
Člen | 404
+
0
-

@llsm: Přesně, já to řeším takto. A samozřejmě mohu použít i anonymní funkci. Já si routy zjišťuju ve fasádce, která komunikuje s cache a db, přez samostatné repozitáře, mám jen dvě routy, víc jich není potřeba.

vosy
Člen | 532
+
0
-

@jenicek: me se ten tvuj pristup libi, ale proste nevim co s

Route::FILTER_IN => array($this->model, 'filterIn'),
Route::FILTER_OUT => array($this->model, 'filterOut'),

kde mam nadefinovat $this->model

to je nejaky Repository? a v tom funkce filterIn?

dostanu se tam pak k

$request->parameters[];

Editoval vosy (10. 4. 2014 17:35)

Jan Suchánek
Člen | 404
+
0
-

vosy: $params dostaneš, když použeješ NULL místo „presenter atp.“

NULL => array(
    // metoda dostane parametry a převede je na aplikační parametry.
    Route::FILTER_IN => $this->model->filterIn, // dostane $params
    // metoda dostane parametry aplikační a převede je na prezentační.
    Route::FILTER_OUT => $this->model->filterOut, //dostane $params
),

Jinak naštuduj si tu web addons portal.

Je tam dost příkladu jak co přibližně provést a je pěkně ukázané cachování url.

Editoval jenicek (23. 4. 2014 11:10)