addCheckboxList validace souvisejících Text fieldů

AnderN
Člen | 2
+
0
-

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
+
0
-

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
+
0
-

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.

Polki
Člen | 553
+
0
-

Zkus toto:

->addCondition(Form::EQUAL, in_array(1, $form[‚days‘]->getValues()), TRUE);

Ale nezkousel jsem tak za to nerucim.