addCheckboxList validace souvisejících Text fieldů
- AnderN
- Člen | 2
Zdravím, dělám formulář, ve kterém uživatel pomocí checkboxů vybere dny v týdnu a pro ty, které vybral, má zadat další související hodnoty (čas začátku a konce události).
for ($i=1; $i<=7; $i++) {
$form->addCheckbox("days_{$i}_checked");
$form->addText("days_{$i}_start")
->addConditionOn($form["days_{$i}_checked"], Form::EQUAL, true)
->setRequired('Start time required.');
$form->addText("days_{$i}_end")
->addConditionOn($form["days_{$i}_checked"], Form::EQUAL, true)
->setRequired('End time required.');
}
Zároveň je však podmínkou výběr alespoň jednoho dne. Z toho důvodu jsem pro dny v týdnu začal používat CheckboxList a ne oddělené checkboxy.
$form->addCheckboxList("days", 'Select days:', [1, 2, 3, 4, 5, 6, 7])
->setRequired(false)
->addRule($form::MIN_LENGTH, 'At least one day must be selected.', 1);
Potíž je v tom, že se mi nedaří správně adresovat jednotlivé prvky toho CheckboxListu, abych zjistil, zda je ten který den zaškrtnutý a mohl zkontrolovat, že jsou také vyplněné odpovídající časy události.
$form->addText("rec_days_{$key}_start")
->addConditionOn($form[???], Form::EQUAL, true)
->setRequired('layout.addLessonForm.dayStart');
Prosím tedy pokorně o radu. Zároveň uvítám i další názory, jak byste uvedené zadání řešili vy (separátní checkboxy, vlastní validační metoda, apod.). Předem děkuji.
- Polki
- Člen | 553
Moc jsem nad tim nepremyslel. Ale:
Pokud se nepletu checkboxlist doda ve values pole hodnot tech checkboxu, ktere byly zaskrtnute. Takze teoreticky by melo fungovat pravidlo Form::FILLED nad checkboxlistem.
Jinak pokud chces to udelat dynamicky pro uzivatele a treba po zaskrtnuti checkboxu pomoci toggle zobrazit ci skryt ten formular pro ten den s additionalinfo, tak bych to udelal jak jsi mel puvodne jen bych pridal hidden, kteremu bych pro kazdy ten label nastavil condition jestli je vyplneny, resp. jestli se jeho hodnota rovna true. A pokud by vsechny byly false, tak bych tomu hiddenu normalne dal error hlasku kterou bych si pres manual rendering vypsal nekde nahore pekne.
Edit 1:
Moje chyba spatne jsem si precetl ze prvky potrebujes naadresovat na jednotlive
checkboxy. To zkus jako:
->addRule($form[‚days‘][1], Form::EQUAL, true)
Nebo:
->addRule(1, Form::IS_IN, $form[‚days‘])
Pripadne misto addRule dat addCondition. Jak potrebujes.
Stale bych ale bral radsi udelat si to zvlast jak jsi mel puvodne a resit, jestli je alespon jeden zaskrtly bud tim hidden inputem, jak jsem psal, nebo potom az v metode onValidate
Editoval Polki (17. 1. 2019 8:18)
- AnderN
- Člen | 2
Omlouvám se, to jsem mohl napsat rovnou. Adresování jako pole (např.
$form['days'][1]
) jsem už zkoušel, ale to u toho
CheckboxListu nejde:
Cannot use object of type Nette\Forms\Controls\CheckboxList as array.
Otočení argumentů v pravidle/podmínce IS_IN
mě sice
nenapadlo, ale také to není možné. Vrací další chybu:
Argument 1 passed to Nette\Forms\Controls\BaseControl::addConditionOn() must implement interface Nette\Forms\IControl, integer given, called in ...
Je škoda, že ty prvky nelze adresovat přirozeně. U takového RadioListu nebo Selectu je to pochopitelné, protože nemůže být vybraný víc jak 1 a ten je pak hodnotou toho elementu, ale u CheckboxListu, popř. MultiSelectu je výsledkem pole hodnot, takže může být potřeba kontrolovat, co uživatel vybral.