application request z RouterFactory

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

ahoj v mam tuto routu

$frontRouter[] = new Route('[<locale cs|en|de>/]<presenter>/<action>/<id>',
				array(
					'presenter'=>array(
						Route::FILTER_IN => function($params) use($httpRequest)
						{
							$appRequest = $this->match($httpRequest);

							$r = $this->UrlTransform->uriToPresenter($params, $appRequest);

						    return $r;
						}
					),
					'action'=>'default',
					'locale'=>'cs',
					'id'=>NULL
					));

potreboval bych se nejak dostat k \Nette\Application\Request
dix

David Matějka
Moderator | 6445
+
0
-

ceho chces dosahnout ze tam volas uvnitr match? to jako volas na nejakym routeru nebo co?

http request si samozrejme muzes injectnout

ale nebude pro tebe vhodnejsi nejak pouzit univerzalni filter NULL?

new Route(..., array(

NULL => Route::FILTER_IN =>function($params) {
	//v $params jsou vsechny matchnuty parametry
	return $params;
}));
vosy
Člen | 532
+
0
-

kdyz pouziju

NULL => Route::FILTER_IN =>function($params) {

tak dostanu:

Array
(
    [locale] => en
    [presenter] => MapaStrankyen
    [action] => default
    [id] =>
)

potreboval bych se dostat k URI „mapa-strankyen“

ale v parametrech to mam prevedene na nazev presenteru

a kdyz pouziju

'presenter' => Route::FILTER_IN =>function($params) {

tak dostanu „mapa-strankyen“

ale nedostanuse k parametru LOCALE :(

David Matějka
Moderator | 6445
+
0
-

a chces vubec aby ten parametr byl „presenter“? ten se totiz prevadi prave z toho jednoho tvaru s pomlckama na ten druhy.
Mozna bude vhodnejsi, kdyz ten parametr pojmenujes treba „slug“ a v tom filtru si dle potreby unsetnes neco, neco pridas atd.

vosy
Člen | 532
+
0
-

mel jsem:

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

		$route->addFilter('presenterUri', array($this->UrlTransform, 'uriToPresenter'), array($this->UrlTransform, 'presenterToUri'));

a

function uriToPresenter($slug, \Nette\Application\Request $request)
    {

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

        $tab = \App\Glb::$TABS['uris'];

        $r = $this->db->table($tab)
                    ->WHERE('uri_'.$locale, $slug)
                    ->fetch();

        $p = $r->presenter;

        if($p!='')
        {
            return $p;
        }else
        {
            return 'Error';
        }

    }

vracena hodnota ze mi nevraci jako nazev presenteru tam je furt Homepage

David Matějka
Moderator | 6445
+
0
-
  1. nevim o jakou implementaci FilterRoute se jedna, ale pravdepodobne kdyz vracis jen string na filtru pro presenterUri, tak to presenter fakt neupravi
  2. pouzij ten univerzalni NULL filtr, zhruba takhle:
$frontRouter[] = $route = new Route('[<locale cs|en|de>/]<slug>/<action>/<id>',
                array(
                    'presenter'=>'Homepage',
                    'action'=>'default',
                    'locale'=>'cs',
                    'id'=>NULL,
NULL => array(
	Route::FILTER_IN = function($params) {
		$params['presenter'] = ziskej_presenter_dle_slugu_a_locale($params['slug'], $params['locale']);
		//mozna budes muset unsetnout ten slug

		return $params;
	},
	//a mozna budes muset vytvorit nejakou FILTER_OUT
)
                    ));

3. hledej a trochu se snaz, tohle se tu resilo asi stokrat

Editoval matej21 (2. 6. 2014 23:45)

vosy
Člen | 532
+
0
-

FILTER OUT jsem udelal takto

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

					NULL => array(
					    Route::FILTER_IN => function($params) {
// print_r($params);
					        $params['presenter'] = $this->UrlTransform->uriToPresenter($params['presenterUri'], $params['locale']);
					        //mozna budes muset unsetnout ten slug

					        return $params;
					    },
					    Route::FILTER_OUT => function($params) {

					        $params['presenterUri'] = $this->UrlTransform->presenterToUri($params['presenter'], $params['locale']);

					        return $params;
					    }
					)
					));

ale to mi vyhodi URL: „http://www.bt.loc/de/mapa-stranky/?presenterUri=mapa-strankyde“

David Matějka
Moderator | 6445
+
0
-

zkus ve filter_out unsetnout (nebo nastavit na defaultni Homepage) ten presenter..

vosy
Člen | 532
+
0
-

Dix, jen nemohu najit co je mysleno tim unsetnutim

udelal jsem

Route::FILTER_OUT => function($params) {

							unset($params['presenterUri']);
							unset($params['presenter']);

					        $params['presenterUri'] = $this->UrlTransform->presenterToUri($params['presenter'], $params['locale']);


					        return $params;
					    }

ale bez uspechu

Editoval vosy (3. 6. 2014 8:40)