Routa pro GET parametry
- deric
- Člen | 93
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]*>¶m=<parm \d{1,3}>', array(
'presenter' => 'Front:Search',
'action' => 'find',
'param' => 0,
));
- David Grudl
- Nette Core | 8218
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
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.
- PetrP
- Člen | 587
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
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
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.