Neznámý počet GET parametrů

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
+1
-

A když bys napsal něco jako:

$parameters = [
	'param1' => 'value1',
	'param2' => 'value2',
	// ... tohle pole si můžeš skládat dynamicky
];
$this->presenter->redirect('Search:', $parameters);

Tak by to bylo to co potřebuješ?

Editoval hranicka (2. 7. 2014 10:55)

Oli
Člen | 1215
+
0
-

@hranicka taky ne. to mě zase vrátí to samé escapované pole jen je asociativní. V první řadě mě jde o to zbavit se těch „škaredejch“ escapovanejch znaků :-)

hranicka
Člen | 23
+
+1
-

Když předám jako parametry to co jsem psal výše, tak to vygeneruje přeci URL jako

/search?param1=value1&param2=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&params%5B1%5D=value2&params%5B2%5D=valueX

Do Nette se to ale vrací opět jako pole.

Oli
Člen | 1215
+
0
-

@hranicka ajo máš pravdu. nějak mě to nedošlo… Díky ;-)