Neznámý počet GET parametrů
- Oli
- Člen | 1215
Ahoj,
snažím se udělat hledání tak, že je jeden input box na kterej je
navěšenej selectize. Kde lidi můžou vyhledávat co je napadne, ale
i tagy. Všechno se to spojí pomocí nějakýho lepidla do jednoho stringu. No
a mě jde o to, jak to vypsat v url ve tvaru
example.com/search?tag1=cz&tag2=praha&tag3=brno...
když nevím kolik těch parametrů bude. Koukal jsem, že v PHP 5.6 bude krásný volání
actionDefault(...$tag){}
To ale v PHP 5.4 nemám. Jde to nějak vyřešit? Nebo si to musím poslat
s nějakým spojovačem a potom si to rozsekat podle něj až při
zpracování? Nejlepší by byl samozřejmě ampersand, ale ten mě to
vyescapuje. Stejně jako když si to předám jako pole, tak se to (aspoň se
mě zdálo) snaží zobrazit tag[0]=cz&tag[1]=praha
… Ale
escpapuje to na tag%5B0%5D=
.
- Michal Vyšinský
- Člen | 608
Ahoj,
dá se použít:
$this->getHttpRequest()->getQuery();
V presenteru je to automaticky dostupná služba, jinde si injectni
Nette\Http\IRequest
.
Ta metoda ti vrátí všechny GET parametry, takže si pak můžeš foreachem
vyfiltrovat co chceš (třeba regexp, nebo
Strings::startsWith()
)
- hranicka
- Člen | 23
Ty parametry si můžeš vytáhnout z objektu
Nette\Http\IRequest
metodou getQuery
(https://api.nette.org/…Request.html)
a pak s těmi parametry dále pracovat.
V presenteru můžeš ten objekt získat přes
$this->getHttpRequest()
, viz. https://doc.nette.org/cs/http/request
Editoval hranicka (2. 7. 2014 10:40)
- Oli
- Člen | 1215
Díky za reakce, ale asi jsem se nevyjadril uplne jasne :-) On neni problem tam ty parametry dostat, ale problem je aby ta adresa vypadala takhle pekne. Mozna to i blbe zpracovavam. Zpracovavam to takhle:
public function process(Form $form)
{
$searchterm = Strings::split($form->values->searchterm, '~#/~');
$this->presenter->redirect('Search:', [$searchterm]);
}
...
public function renderDefault(array $tag = null)
{
dump($this->getParameter('tag'));
}
Zkoušel jsem to i jako string:
public function process(Form $form)
{
$searchterm = Strings::replace($form->values->searchterm, '~#/~', '&');
$this->presenter->redirect('Search:', $searchterm);
}
...
public function renderDefault($tag = null)
{
dump($this->getParameter('tag'));
}
On je problém v tom, že když to udělám takhle. Tak ten string se vloží do toho jednoho parametru $tag. Což je logický.
U toho pole by mě stačilo by mě, kdyby šlo (možná v routovani) nějak upravit aby se místo tag%5B0%5D=pokus zobrazilo např tag0=pokus (bez těch escapovanejch hranatejch závorek).
Už je vidět o co mi jde? Jde mě v podstatě o to, jak vytvořit URL s & anižbych znal počet parametrů, které ten & spojí.
PS. teď jsem přišel na to, že ty hranatý závorky escapuje chrome a IE. FF je nechá bejt.
Editoval Oli (2. 7. 2014 10:55)
- hranicka
- Člen | 23
Když předám jako parametry to co jsem psal výše, tak to vygeneruje přeci URL jako
/search?param1=value1¶m2=value2
nebo ne?
Ty škaredé znaky se vytváří v případě parametrů-polí v URL, když bych napsal něco jako:
$parameters = [
'params' => [
'value1',
'value2',
'valueX',
],
];
Až pak to vygeneruje URL s hranatými závorkami co se asi v některých prohlížečích escapuje:
/search?params%5B0%5D=value1¶ms%5B1%5D=value2¶ms%5B2%5D=valueX
Do Nette se to ale vrací opět jako pole.