router pro vycejazycne url
- vosy
- Člen | 532
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
$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,
));
- Jan Suchánek
- Člen | 404
@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
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
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
snazim se adresu
http://www.bt.loc/en/contacts/ a http://www.bt.loc/kontakty/
nasmerovat pomoci KdybyTranslation na ContactsPresenter.php
- vosy
- Člen | 532
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
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
@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
@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
@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
@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
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)