Routování – nejkratší možná cesta

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

Ahoj, pouzivam aktualni verzi Nette (2.0.6), php 5.3.

Pri pouziti routy:

<?php
$router[] = new Route($prefix . 'admin[/<lang [a-z]{2}>][/<module>[/<presenter>[/<action>[/<id>]]]]', array(
  'module' => 'Auth',
  'presenter' => 'Homepage',
  'action' => 'default',
  'lang' => 'cs'
));
?>

Se mi vsecky url adresy v jazyce ‚cs‘ automaticky redirectuji na tu samou url akorat bez parametru lang (tedy http://localhost/admin/cs/news na http://localhost/admin/news ). Toto chovani se mi libi, ale chtel bych ho i pri pouziti routy:

<?php
$router[] = new \Nette\Application\Routers\Route('[<lang [a-z]{2}>/][<path .*>]',array(
    'presenter'=>'Front',
    'action'=>'Default',
    'lang'=>'cs'
));
?>

To se vsak nedeje, v teto route k zadnemu presmerovani nedochazi a musim redirect provadet rucne. Je nejaky zpusob, jak vynutit redirect, pokud mam v url defaultni hodnoty?

Grelek
Člen | 233
+
0
-

Routování není moje silná stránka, ale nepomohlo by třeba přidání modulu do definice routy?

KingKoca
Člen | 25
+
0
-

On tam prave zadny modul neni. Prvni router je prevzaty z jine aplikace, kde to je strukturovane pres module/presenter/action, ale ve druhem pripade jde vsecko na jeden presenter a jednu akci, kde se podle url adresy (<path>) nacte z databaze, co se bude dit dal.

Felix
Nette Core | 1196
+
0
-

Zkusil bych toto:

<?php
$router[] = new \Nette\Application\Routers\Route('[<lang [a-z]{2}>/]<path .*>',array(
    'presenter'=>'Front',
    'action'=>'Default',
    'lang'=>'cs'
));
?>

Editoval Felix (14. 11. 2012 8:59)

KingKoca
Člen | 25
+
0
-

Felix napsal(a):

Zkusil bych toto:

<?php
$router[] = new \Nette\Application\Routers\Route('[<lang [a-z]{2}>/]<path .*>',array(
    'presenter'=>'Front',
    'action'=>'Default',
    'lang'=>'cs'
));
?>

Diky za radu, ale bohuzel, porad to v url nechava tu ‚cs‘ cast.

Felix
Nette Core | 1196
+
0
-

Hmmm, tak to me uz nic jinyho nenapada.. Nemas to lang jako @persistent v BasePresenteru? Tam bys mohl treba kontrolovat

if ($this->lang == 'cs')  $this->lang = null;

Ale nejsem si jisty..

h4kuna
Backer | 740
+
0
-

KingKoca napsal(a):

Felix napsal(a):

<?php
$router[] = new \Nette\Application\Routers\Route('[<lang [a-z]{2}>/]<path .*>',array(
    'presenter'=>'Front',
    'action'=>'Default',
    'lang'=>'cs'
));
?>

Diky za radu, ale bohuzel, porad to v url nechava tu ‚cs‘ cast.

Tohle za normálních okolností funguje já to tak používám, v hlavním presenteru by jsi měl mít: (a to snad není podmínka)

<?php
/** @persistent */
public $lang;
?>

Editoval h4kuna (14. 11. 2012 14:27)

KingKoca
Člen | 25
+
0
-

Diky za vsecky rady, ale ani jedna nefunguje. Automaticky redirect z ‚/cs/cokoliv‘ na /cokoliv/ neprobiha.

Ja si myslim, ze je to proto, ze routa neni v klasickem tvaru <presenter>/<action>, a tak to proste nefunguje :) Nebo za tim je nejaka jina zapeklitost? :)

pekelnik
Člen | 462
+
0
-

Ukaz definici parametru v presenteru.

Editoval pekelnik (14. 11. 2012 16:59)

KingKoca
Člen | 25
+
0
-

Je presne takova, jak psal h4kuna:

<?php
    /** @persistent */
    public $lang;
?>
Felix
Nette Core | 1196
+
0
-

A co odstranit defaultni cs hodnotu z routy a pridat do do @persistent $lang = 'cs'? Uz me fakt nic nenapada..

KingKoca
Člen | 25
+
0
-

Diky, ale nic nefunguje. Pravdepodobne jsou routery moc velka magie :) Nejspis to bude tou casti <path .*> – je to takova neurcita cesta, neni tak specifikovan zadny konkretni presenter, takze router neumi vygenerovat novou url adresu. To je podle meho nazoru duvod, proc to nejde.

Nechme to byt, to presmerovani udelam v presenteru (nebo filter_in funkci), je to jednoducha podminka.

Diky