Routa pro GET parametry

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

Jak se má správně napsat routa pro parametry, které se předávají přes GET?

Zkoušel jsem toto, ale předá se jenom první část.

$router[] = new Route('/hledat/?find=<find [A-Za-z0-9]*>&param=<parm \d{1,3}>', array(
    'presenter' => 'Front:Search',
    'action' => 'find',
    'param' => 0,
));
LM
Člen | 206
+
0
-

Tuším že se tam dávají mezery navíc:

<?php
$router[] = new Route('/hledat/ ? find=<find [A-Za-z0-9]*> & param=<param \d{1,3}>', array(
    'presenter' => 'Front:Search',
    'action' => 'find',
    'param' => 0,
));
?>
deric
Člen | 93
+
0
-

Ne, mezerama to nebude, je to pořád to samé. Problém je ten &

PetrP
Člen | 587
+
0
-

Do routy se get (to za ?) nepředává. Sám jsem to potřeboval a tak jsem si to připsal v routě. Jestli chceš můžu to sem hodit.

deric
Člen | 93
+
0
-

Jo tak, takže část za ? je rezervována pro persistentní parametry?

PetrP napsal(a):

Do routy se get (to za ?) nepředává. Sám jsem to potřeboval a tak jsem si to připsal v routě. Jestli chceš můžu to sem hodit.

To by mi dost pomohlo, diky moc.

David Grudl
Nette Core | 8218
+
0
-

Kolem otazníku musí být skutečně mezery, protože by to jinak kolidovalo se zápisem např.

$router[] = new Route('/<id [a-z]-?[0-9]>', ...);

Přesněji řečeno, i tohle by se dalo řešit, ale pro jednoduchost to teď vyžaduje mezery.

Parametry se pak zapisují takto:

$route = new Route('<action> ? test=<presenter>', ...);

// nebo zjednodušeně presenter=<presenter>
$route = new Route('<action> ? <presenter>', ...);

Jako oddělovač více parametrů lze použít zase mezeru, ampersand tam nevadí. Takže zápis:

new Route('/hledat/ ? find=<find [A-Za-z0-9]*> & param=<param \d{1,3}>', ...)

je správně. Jen ty podmínky [A-Za-z0-9]* se (zatím) ignorují.

David Grudl
Nette Core | 8218
+
0
-

PetrP napsal(a):

Do routy se get (to za ?) nepředává. Sám jsem to potřeboval a tak jsem si to připsal v routě. Jestli chceš můžu to sem hodit.

To bude problém někde jinde, třeba na webu nette.org to normálně funguje.

deric
Člen | 93
+
0
-

Díky za rady. Potíže nastaly, pokud jsem přes parametr předal stejnou hodnotu jako je default value – tj. v tomto případě nevyplněný formulář. Nette se snaží přeskakovat přebytečné parametry v uri a potom nenašlo routu.

PetrP
Člen | 587
+
0
-

David Grudl napsal(a):

PetrP napsal(a):

Do routy se get (to za ?) nepředává. Sám jsem to potřeboval a tak jsem si to připsal v routě. Jestli chceš můžu to sem hodit.

To bude problém někde jinde, třeba na webu nette.org to normálně funguje.

U mě $context->getUri()->path v Route::match() neobsahuje query.

A kde přesně se má přidávat?

<?php
// HttpRequest::detectUri()
$uri->path = $origUri->path = (string) strtok($_SERVER['REQUEST_URI'], '?');
// se o vše za ? ořízne

Debug::dump($_SERVER['REQUEST_URI']);			   //string(19) "index.php?neco=neco"
Debug::dump(strtok($_SERVER['REQUEST_URI'], '?'));	   //string(9) "index.php"
Debug::dump((string) strtok($_SERVER['REQUEST_URI'],'?')); //string(9) "index.php" (proč se to vlastně přetypovává; string už to vracet má)
Debug::dump(strtok('?neco=neco', '?'));			   //string(9) "neco=neco"
// podle dokumentace to vypadá že strtok se chová tak jak má

?>

PHP 5.2.3
Apache/2.2.4 (Unix)
Nette Framework 0.8 (revision 111 released on 2008/11/12 19:34:09)

Editoval PetrP (13. 11. 2008 12:36)

David Grudl
Nette Core | 8218
+
0
-

To je v pořádku, v path by měla být jen cesta. Možná přesně nerozumím, v čem je problém.

PetrP
Člen | 587
+
0
-

David Grudl napsal(a):

To je v pořádku, v path by měla být jen cesta. Možná přesně nerozumím, v čem je problém.

Omlouvám se za zmatky, jen přesně nerozumím jak to funguje. Problém asi mám v tom že:

<?php
$router[] = new Route('test.php ? auth=login & view=<action>', array(
  'presenter' => 'Test',
  'action' => 'default',
));
// test.php?auth=login&action=test 	=> Test:test (správně)
// test.php?auth=login 			=> Test:default (správně)
// test.php 				=> Test:default (špatně)
// test.php?auth=logout 		=> Test:default (mělo by odkázat na Test2)

$router[] = new Route('test.php ? auth=logout', array(
  'presenter' => 'Test2',
  'action' => 'default',
));

?>

V první řadě to nebere vůbec v úvahu parametry kde není <něco>, ani do url negeneruje.

A pak první routa použije #test\.php/?$#Ai a tudíž přijme i všechny ostatní a vůbec jí nevadí že má jiné parametry.

Třeba je to standardní (správné) chování a já to celé špatně používám.