Dynamický počet persistentních proměnných

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

Ahoj, podobně jako v tomhle vláknu i já používám get form k sortu nějakých dat. Sort chci zachovat samozřejmě i na další stránce, logicky dospívám k persistentním parametrům v url, díky čemuž jsem našel i výše uvedené vlákno.

Jenomže zde jsem se zasekl a zatím se mi nepodařilo najít hezké řešení – jak persistovat indexované pole?
Můj formulář je totiž dynamický a pokaždé je tak počet proměnných a jejich názvy, které by bylo třeba přenést, jiný.

Se session mi to funguje vpohodě, ale používat kvůli tomuhle session se mi vůbec nelíbí. Budu vděčný za jakékoliv popostřčení :)

pidiclovek
Člen | 91
+
0
-

Ha! Slevuji na požadavcích, už jsem to převymyslel tak, že mi postačí obyčejné pole, již jen jedno. Otázkou ale stále zůstává, jak persistovat pole tak, aby se v GET projevilo jak např.: potvrzený multiselect? Něco jako:

  /** @persistent */
  public $foo;
  /**
   * Get persistent parameter
   * @return array persistants
   */
  public static function getPersistentParams() {
      return array('foo');
  }
public function actionDefault() {

      $this->foo = array(3,4);
  }

By se projevilo v url jako foobar.com?foo=3&foo=4

nAS
Člen | 277
+
0
-

Podívej se na metody loadState() a saveState(), viz Fifteen v examples.

Filip Procházka
Moderator | 4668
+
0
-

pidiclovek napsal(a):

Jenomže zde jsem se zasekl a zatím se mi nepodařilo najít hezké řešení – jak persistovat indexované pole?

https://doc.nette.org/cs/forms#…

Aby se projevilo v url jako foobar.com?foo=3&foo=4

Když se na tu url podíváš pořádně, tak ti třeba dojde, jaká je to hloupost :) Správně tedy

foobar.com?foo[]=3&foo[]=4

A to se dělá takto

$this->redirect('this', array('foo' => array(3, 4)))
pidiclovek
Člen | 91
+
0
-

Na loadState() a spol se podívám, díky! :)

Každopádně @Hosiplan: Jsem to ale pako :) že mě nenapadne takhle jednoduchý řešení, díky Filipe! Jinak jsem myslel ty parametry jako pole, url si pochopil správně, já tam jen ty závorky zapomněl napsat :) Díky!

S tím kontejnerem jsi to prosím myslel jak? Už jsem s nimi kdysi experimentoval, ale pořádně jsem asi ještě nepochopil, k čemu bych je měl ve formulářích využívat, dokumentace v tomhle pokulhává

Filip Procházka
Moderator | 4668
+
0
-

Kontejnery ti vytváří zanoření inputů. Příklad:

$form->addText('name');
$form->addText('city');
$form->addText('zip');

vygeneruje

<input type="text" name="name">
<input type="text" name="city">
<input type="text" name="zip">

Pokud ale použiješ Container

$form->addText('name');
$address = $form->addContainer('address');
$address->addText('city');
$address->addText('zip');

tak ti z toho poleze

<input type="text" name="name">
<input type="text" name="address[city]">
<input type="text" name="address[zip]">

Což se bude chovat jako pole i výsledek bude v poli

$form->getValues(TRUE) === array(
	'name' => NULL,
	'address' => array(
		'city' => NULL,
		'zip' => NULL,
	)
)

U GET formulárů se ti to dokonce rovnou dostane do URL v poli :)

pidiclovek
Člen | 91
+
0
-

@Hosiplan: Tak to je ovšem bomba, to řeší mé problémy s checkboxy, které jsem si už málem podědil a přepsal tak, aby mohly být poli. Díky moc za vysvětlení.

Já nemám práva dokumentaci editovat, ale bylo by skvělé přesně tyto kusy kódu tam najít, jsou perfektně sebevysvětlující. :)

Díky všem zúčastněným za pomoc :)