Snippet & setDefaultValues
- Pavel Kravčík
- Člen | 1195
Koukám na životní cyklus presenteru a tohle mi nedává smysl. Dělám něco špatně?
public function actionEditovat($id)
{
$dealer = $this->dealerModel->dealer($id);
$obec = $this->por_obecRepository->getById($dealer->obec_id, TRUE);
$this['dealerForm']['obec_id']->setItems(array($obec->id => $obec->nazev));
$this['dealerForm']['psc']->setValue($obec->psc);
$this['dealerForm']->setDefaults($dealer->toArray());
}
public function handlePsc($value)
{
$citties = $this->por_obecRepository->fetchPairs('id', 'nazev', array("psc = '$value'"), TRUE);
if($citties)
{
asort($citties);
$this['dealerForm']['obec_id']->setItems($citties);
}
else
{
$this['dealerForm']['obec_id']->setItems(array());
}
$this->redrawControl('obec');
}
public function createComponentDealerForm()
{
...
$form->addText('psc', 'PSČ')
->addRule(Form::FILLED);
$form->addSelect('obec_id', 'Město', array())
...
}
Pak tam mám nějaký JS na volání Handleru. Při vytváření uživatele mi to funguje dobře. Píšu do políčka psc a když je tam 5 číslic, JS zavolá handler a selectbox se naplní a formulář se uloží.
Problém mi nastane ve chvíli, kdy chci použít ten formulář pro editaci. Takže si ho nastavím v actionMetodě podle toho, co je v DB. Ale může stát, že budu chtít změnit město, takže ten handler použiji také. Vše proběhne ok do doby, než chci uložit formulář. Formulář se ukáže s chybou:
Please select a valid option.
Resp. tenhle řádek přepisuju ten AJAX někde ve validaci si myslím. Přitom podle toho životního cyklu, by měl být handler až později.
$this['dealerForm']['obec_id']->setItems(array($obec->id => $obec->nazev));
Pravděpodobně se pro validaci bere nastavení z actionMetody a ne aktuální options nastavené pomocí handleru. Jak to vyřešit? Díky za tipy.
Editoval kzk_cz (3. 2. 2015 14:22)
- David Matějka
- Moderator | 6445
Spise me prekvapuje, ze ti funguje to vytvareni (nedavas nahodou do selectu pri vytvareni vsechny mesta a to psc to jen umozni filtrovat?)
V nette se behem jednoho pozadavku zpracovava pouze jeden signal – a jak handle tak form je zpracovani signalu, proto se ti handle nezavola.
IMHO na zavisle select boxy (nebo i jine zavisle inputy) je nejlepsi tohle reseni.
- Pavel Kravčík
- Člen | 1195
Ne nedávám. Při načtení formuláře, tam dávám jen aktuální město podle ID. Ten select má tedy na začátku jen jednu option. To nastavím v actionEditovat($id).
Pak se pustí signál:
$.nette.ajax({
type: 'GET',
url: {link psc!},
data:
{
'{!$presenter->getParameterId('value')}': $('.ajax-psc').val()
}
});
Ten mi dobře nastaví v tom formuláři nové položky podle PSČ. Já vyberu nové město a kliknu uložit. A tam je ten problém. Validace se kontroluje s tím, co je zadáno v setItems() v actionEditovat() a ne podle aktuálních options v selectu v HTML. Ještě by to asi šlo obejít použitím onSubmit[], ale není moc hezké.
Díky za odkaz, ráno jsem si ho dával do záložek, že to pak prozkoukám, ale nepřišlo mi přesně to, co jsem se snažil hledat.
Editoval kzk_cz (3. 2. 2015 15:30)
- David Matějka
- Moderator | 6445
Mel jsem na mysli u vytvareni uzivatele (kde rikas, ze ti to funguje) – jestli tam nahodou do formulare pri nacteni nedas vsechny mesta? To by vysvetlovalo, proc to funguje.
Validace se kontroluje s tím, co je zadáno v setItems() v actionEditovat() a ne podle aktuálních options v selectu v HTML.
ano, to je bezpecnostni feature, aby ti nikdo nemohl nic podstrcit
nepřišlo mi přesně to, co jsem se snažil hledat.
imho jo, s par upravama :)
- Pavel Kravčík
- Člen | 1195
public function renderVytvorit()
{
$this->template->setFile(__DIR__.'/../templates/PsaDealer/dealerForm.latte');
$this->template->vytvor = TRUE;
}
public function renderEditovat()
{
$this->template->setFile(__DIR__.'/../templates/PsaDealer/dealerForm.latte');
}
Navíc tam mám jen tu actionEditovat(), kde by se měly naplnit data k editaci. Takže to bude tím, že vlastně jsem to já, kdo se snaží podstrkávat data. :)
Jasně zkusím, mrknout na ten signál. Ale o těch úpravách… když jsem to ráno přelétl, tak mi přišlo, že se dostanu stejné situace. Jen to nebudu definovat v action() ale v createComponent() a na ten AJAX se to stejně vybodne. :D Ale vyzkouším.
Editoval kzk_cz (3. 2. 2015 16:02)
- David Matějka
- Moderator | 6445
To onChange zareaguje na kazdou zmenu hodnoty – tedy i pri zpracovani,
kdyz se bude z http nacitat PSC – zavola se callback a zmeni to items
v selectboxu s mestama.
Takze je nutne, aby ty inputy byly uvedeny ve zpravnem poradi – nejdrive ten,
na kterem je to zavisle a az pak ten zavisly.
- Pavel Kravčík
- Člen | 1195
@matej21: PANE VY JSTE BŮH. Vypadá funkčně v testovacím presenteru. Na tohle bych v životě sám nepřišel. Díky! :)