Problém s přesměrování – scalar error

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

Mám formulář, v kterém si uživatel zaklikne checkboxy a odešle.
Po odeslání a zprocování má proběhnout redirect:

$this->add = "?add[]=9&add[]=14&add[]=20";

$this->getPresenter()->redirect("this$this->add");

Toto končí chybou:
Invalid value for parameter ‚add‘, expected scalar.

Problém je v zápisu add[], jelikož se to Nette nelíbí [].
Jak byste toto řešili vy?

[] musím použít, jelikož bez jejich použití se vezme jen poslní parametr a ostatní se vymažou.

Updatnul jsem na 2.1 a zde už to bohužel nejde. Dřív v tomto zápisu nebyl problém.

Editoval sumiisakua (13. 3. 2012 15:08)

Jan Endel
Člen | 1016
+
0
-

mělo by fungovat něco jako:

$this->getPresenter()->redirect("this", array('add' => $vals['add']));

Nette by ti to na pole mělo předělat samo.

sumiisakua
Člen | 36
+
0
-

Pilec: Stejná chyba.

$id = array(3) [
   0 => "24" (2)
   1 => "15" (2)
   2 => "25" (2)
]

$this->getPresenter()->redirect("this", array('add' => $id));

Jediné řešní mě napadlo, že bych nesestavoval url do tvaru: ?add[]=9&add[]=14&add[]=20, ale ?add=9–14–20. Toto řešení mi přidá do zprocování pouze jeden řádek, a to explode(„-“, $add).

PS: Tlačítko inline code nefunguje → při jeho využití a odeslání postu se text mezi `` nijak neodlišší.

Editoval sumiisakua (13. 3. 2012 17:14)

boky
Člen | 18
+
0
-

Proč nemůže být parametr array?

Dost to používám v js a nechce se mi to přepisovat.

Čelo
Člen | 42
+
+1
-

Máš u patřičných metod uvedené, že parametr add je array?

	public function renderDefaultCiCo(array $add) { ... }
boky
Člen | 18
+
0
-

Čelo napsal(a):

Máš u patřičných metod uvedené, že parametr add je array?

	public function renderDefaultCiCo(array $add) { ... }

To bylo první co sem zkoušel :)

MartinitCZ
Člen | 580
+
0
-

Vyřešil toto někdo? Mám podobný problém jen stim rozdílem, že nemohu použí toto (ani s tim to nefunguje):

Čelo napsal(a):

Máš u patřičných metod uvedené, že parametr add je array?

	public function renderDefaultCiCo(array $add) { ... }

Jelikož parametr, který mohu dostat, může být string nebo array.

Jan Tvrdík
Nette guru | 2595
+
0
-

martinit wrote:

Vyřešil toto někdo? Mám podobný problém jen stim rozdílem, že (…) parametr, který mohu dostat, může být string nebo array.

public function renderFoo()
{
	$param = $this->getParameter('param-name');
}
MartinitCZ
Člen | 580
+
0
-

Honzo: Mě spíš jde o vytvoření URL. Řešim v podstatě něco podobného jako v prvním postu.

Formulář, který má vytvořit url s parametrem, který bude obsahovat několik hodnot a poté využít AJAX po submitu.

Jan Tvrdík
Nette guru | 2595
+
0
-

Pořád nechápu, s čím máš problém.

MartinitCZ
Člen | 580
+
0
-

Mám formulář, v kterém si zaškrtneš checkboxy. Po odeslání se zkontoluje, které jsou zaškrtlé a vytvoří to slug pole:

	$this->url = array('hugo', 'ondra', 'tomas');

Poté se má provést redirect, ale to vždy končí chybou:

	$this->presenter->redirect("Homepage:default", array("url" => $this->url)); //Array to string conversion

POkud si to někdy řešil a víš jak na to, tak budu moc rád za každou radu :)

Jan Tvrdík
Nette guru | 2595
+
0
-

Aha, už to chápu. Máš úplně jiný problém, než který se řešil v tomto vláknu. Jedná se o nekompatibilitu Nette 2.0.3 s PHP 5.4 (v PHP 5.3 to funguje v pořádku). Oprava je zahrnuta do verze 2.1-dev a bude zahrnuta do 2.0.4.

Viz issue #546.

MartinitCZ
Člen | 580
+
0
-

Honza: aha, tak to se omlouvám, ale přišlo mi to dost podobné ;)
OK budu čekat na novou verzi.

MartinitCZ
Člen | 580
+
0
-

Upravil jsem si UI/Presenter.php podle té opravy a vše funguje jak má, ale jen do té doby, než použiji routu.

Vždy končí Warningem: rawurldecode() expects parameter 1 to be string, array given

$FrontendRouter[] = new Route("[names/<name>/][parts/<id>/]", array(
	"presenter" => "Homepage",
	"action" => "default",
	"name" => array(
		Route::VALUE => NULL,
		Route::FILTER_IN => function($s) {
			if ($s !== NULL) {
				return explode('+', $s);
			};
			return NULL;
		},
		Route::FILTER_OUT => function($s) {
			if ($s !== NULL) {
				return implode('+', $s);
			};
			return NULL;
		},
	),
	"id" => NULL,
));

Výsledkem má být url ve tvaru: /names/tomas+lukas+hugo/

Co je na ní špatně? Děkuji.

Editoval martinit (28. 5. 2012 18:35)