Dynamický formulář – checkboxlist

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

Lze nějak přiřadit k jednotlivým itemům(Checkbox) v Checkboxlistu id? (->setOption(‚id‘, ‚něco‘)). Itemy se zadávají jako obyčejný array…

Jde mi to jen pokud přidávám do formuláře jednotlivé checkboxy ale z nich nelze udělat list, abych neměl hromadu hodnot ale pouze jeden array, jako u Checkboxlistu. Nebo jsem nepřišel na to jak…

O co mi jde: Mám selectbox a podle vybrané položky chci zobrazit jen vhodné checkboxy. Našel jsem v dokumentaci toto: https://doc.nette.org/…s/validation

Další otázka je zda pokud zaškrtnu checkbox a pak ho následně schovám změnou v selectboxu, zda se po odeslání formuláře přenese nebo ne. Pokud by se přenášel tak by to nedávalo pro mě smysl.

Řešení s jednotlivýma Checkboxama bude sice asi funkční ale blbě se to pak zpracovává. Nějaký lepší nápad?

Editoval MikyWoW (22. 8. 2016 19:00)

David Krupička
Člen | 45
+
0
-

Ahoj, nehledáš toto?

$form = new Form;
$form->addCheckboxList('colors', 'Favorite colors:', array(
    'r' => 'red',
    'g' => 'green',
    'b' => 'blue',
));
MikyWoW
Člen | 9
+
0
-

Tohle jsme používal ale nejde na to aplikovat ten filtr který je popsán v odkaze. Toto mi vpodstatě funguje ale výsledek je hromada hodnot pro každý checkbox zvlášť. Já bych to potřeboval aplikovat na CheckboxList ale nejde mi přistupovat k jednotlivým checkboxům v listu abych nastavil „->setOption(‚id‘, ‚type_‘.$key);“

$form = new Form;

$sel = new Nette\Forms\Controls\SelectBox('produkt:', $this->getproducts());

foreach ($this->getproducts_types() as $key => $value)
{
    $t = preg_split('/,/', $value);
    foreach ($t as $c)
    {
        $sel->addCondition($form::EQUAL, $key)
        ->toggle('type_'.$c);
    }

}

$form->addComponent($sel, 'product');

foreach ($this->gettypes() as $key => $value)
{
    $form->addCheckbox('type_'.$key, $value)
         ->setOption('id', 'type_'.$key);

}
MikyWoW
Člen | 9
+
0
-

Tak jsem zjistil že toto opravdu pouze skrývá ale hodnoty to přenese i ty skryté takže to budu muset stejně řešit jinak.

Barvoj
Člen | 60
+
0
-

A co použít metodu setOmitted na checkboxlisty, které se nemají objevit ve values po submitu formuláře?

Napadá mě něco takového:

Presenter:

protected function createComponentMyForm($name)
{
	// je klíčové abys formuláři předával $this a $name jinak nebude fungovat níže použité $select->getValue()
    $form = new Form($this, $name);

    $select = $form->addSelect('pick', 'Pick', ['first' => 'First', 'second' => 'Second'])
            ->setDefaultValue('first');

    $form->addCheckboxList('first', 'First', ['a' => 'a', 'b' => 'b', 'c' => 'c'])
        ->setOmitted(true); // Checkboxy se neobjeví ve values
    $form->addCheckboxList('second', 'Second', ['d' => 'd', 'e' => 'e'])
        ->setOmitted(true); // Checkboxy se neobjeví ve values
    $form->addSubmit('submit', 'Submit');

    $select->addCondition(Form::EQUAL, 'first')
        ->toggle('first_container');
    $select->addCondition(Form::EQUAL, 'second')
        ->toggle('second_container');

    $form[$select->getValue()]
		->setOmitted(false); // Pouze u zvoleného checkboxlistu se nastaví omitted na false

    $form->onSuccess[] = function (Form $form, ArrayHash $values) {
        ...
    };

    return $form;
}

latte šablona:

{form myForm}
    {input pick}

    <div id="first_container">
        {label first /}
        {input first}
    </div>
    <div id="second_container">
        {label first /}
        {input second}
    </div>

    {input submit}
{/form}

Hodnoty checkboxů se ti pak sice odesílají, ale nette je ignoruje :)

Nebo potom doporučím ty checkboxy načítat dynamicky třeba snippetem. Inspiraci bys mohl najít ve článku o selectboxech

Editoval Barvoj (23. 8. 2016 17:34)