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
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:
- zobrazí se formulář s 1. řádkem
- uživatel vyplní 1. řádek a klikne na „přidat řádek“ (submit button)
- data se uloží do cache a refreshne se stránka
- načtou se data z cache
- 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:
- zobrazí se formulář s 1. řádkem
- uživatel vyplní 1. řádek a klikne na „přidat řádek“ (submit button)
- vytvoří se komponenta s výchozími hodnotami select boxů
- 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");
}
}