Uložení hodnot do cache před vytvořením komponenty

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

Zdravím,
mám problém s implementací relativně složitého formuláře s dependency select boxy.

Formulář:

  • 1. řádek formuláře: INPUT TEXT, SELECT 1, dependent SELECT 2, dependent SELECT 3
  • 2. řádek formuláře: INPUT TEXT, SELECT 1, dependent SELECT 2, dependent SELECT 3
  • 3. řádek formuláře: INPUT TEXT, SELECT 1, dependent SELECT 2, dependent SELECT 3
  • n. řádek formuláře…
  • submit button „přidat řádek“
  • submit button „odeslat“

Závislost select boxů je OK. Problém je v přidáváním řádků tak, aby zůstaly zobrazeny vybrané hodnoty, protože ve výchozím zobrazení se select boxy naplní výchozími hodnotami. Zvolil jsem tedy tento postup:

  1. zobrazí se formulář s 1. řádkem
  2. uživatel vyplní 1. řádek a klikne na „přidat řádek“ (submit button)
  3. data se uloží do cache a refreshne se stránka
  4. načtou se data z cache
  5. zobrazí se formulář s 1. řádkem (s hodnotami z cache) a s 2. řádkem volným

To byla moje myšlenka, nicméně dle detailních logů se aplikace chová takto:

  1. zobrazí se formulář s 1. řádkem
  2. uživatel vyplní 1. řádek a klikne na „přidat řádek“ (submit button)
  3. vytvoří se komponenta s výchozími hodnotami select boxů
  4. do cache se uloží data z původně odeslaného formuláře – ovšem to už je pozdě, protože formulář je již vytvořen

Výsledek je ten, že v zobrazeném formuláři nemám data z cache, ale výchozí data. Potřebuji docílit toho, aby se data z odeslaného formuláře uložila do cache dříve, než se vytvoří komponenta formuláře po znovunačtení stránky.

Kód (zkráceno):

class GeneratorControl extends Nette\Application\UI\Control {
  function createComponentGeneratorForm() {
    $form = new Nette\Application\UI\Form;
    $formValues = $this->cache->load("formValues");

    // vytvoreni polozek formulare
    // (...)

    if ($formValues) {
     // nastaveni hodnot z cache
      $form->setDefaults($formValues);
    }

    $form->onValidate[] = $this->generatorFormSucceeded;

    return $form;
  }

  function generatorFormSucceeded($form, $values) {
    $this->cache->save("formValues", $form->getHttpData()); // getHttpData() z duvodu nutnosti prijmu nevalidnich hodnot ze selectboxu
    $this->redrawControl("generatorForm");
  }
}