Ukládání vybraných checkboxů do db

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

Zdravím,
dělám dotazník, který se má automaticky při změně ukládat. Funguje to fajn u normálních textboxů, ale mám strašnej problém u checkboxlistu.
Nevím jak uložit pouze vybrané checkboxy a za boha nemůžu najít řešení. Už tři hodiny sedím u google a nette foru a pořád nic, co by mi pomohlo.
Mé řešení zatím uloží úplně všechny checkboxy, což nechci.

Autosubmit formulářů mám vyřešenou pomocí jQuery.

Formulář:

$form->addCheckboxList('nezem_cin1',null,[
	'1' => 'Agroturistika',
    '2' => 'Autodoprava',
    '3' => 'Autooprava a opravy strojů',
    '4' => 'Kovovýroba',
    '5' => 'Dřevovýroba',
    '6' => 'Stavební výroba',
    '7' => 'Pohostinství a ubytování',
    '8' => 'Zprac. masa a mas. výrobky',
]);
$form->addText('jina_cin','Jiná činnost:')
	->setHtmlAttribute('placeholder','Jiná činnost');

Ukládání hodnot do db:

foreach($form['nezem_cin1']->items as $key => $label) {
	$this->service->newValues('1', $key, $label); //1 - id odpovědi
}

Latte:

<div class="col-xs-12 col-lg-6">
	{foreach $form['nezem_cin1']->items as $key => $label}
	<div class="profile_option">
    	<input class="magic-checkbox" type="checkbox" name="{$label}" id="nezmecin-{$key}">
        <label for="nezmecin-{$key}">{$label}</label>
    </div>
    {/foreach}
</div>

jQuery:

var get_form_nezemcin = $('form[id="frm-form_nezemcin"]');

get_form_nezemcin.on('change', function(){
    $.ajax({
        type: 'POST',
        url: get_form_nezemcin.attr('action'),
        data: get_form_nezemcin.serialize(),
        success: function(){
            var time = new Date();
            console.log('Saved at ' + time.getHours() + ':' + time.getMinutes()+':'+time.getSeconds() + '!');
        }
    });
    return false;
});
David Matějka
Moderator | 6445
+
+2
-

->items nad checkbox listem (stejne jako nad select boxem atd) vraci polozky, ktere tam jsou k vybrani. k hodnotam, ktery uzivatel odeslal, se dostanes pres $form['nezem_cin1']->getValue() respektive $form->getValues(), coz ti vrati pole (resp ArrayHash) s hodnotami vsech prvku, co clovek formularem odeslal

CZechBoY
Člen | 3608
+
+1
-

Lepší se mrknout do success jaké hodnoty byly odeslány než to tahat někde z formu.

$form->onSuccess[] = function ($form, array $values) {
	$items = $values['nezem_cin1'];
	foreach ($items as $key => $value) {
		// tady už to co máš nahoře, iteteruješ jen nad zaškrtnutýma checkboxama
	}
};
nocturne32
Člen | 21
+
0
-

@CZechBoY, @DavidMatějka děkuji vám za rychlou reakci, ale nějak mi to nejde. Do toho foreache se mi to zřejmě ani nedostává. Metoda newValues() funguje v pohodě, zkoušel jsem to dát mimo foreach a dobrý.
Dokonce jsem pro jistotu vypnul i jquery s ajaxem.
Když to udělám takto, tak mi to vyhodí chybu, že getValues() není definována.

$form->onSuccess[] = function (Form $form, $values) use ($callback) {
	$items = $form['nezem_cin1']->getValues();
    foreach ($items as $key => $value) {
    	$this->service->newValues(8,$key,$value);
   	}
	$callback()
};

Tohle se mi do foreache ani nedostane.

$form->onSuccess[] = function (Form $form, array $values) use ($callback) {
	$items = $values['nezem_cin1'];
    foreach ($items as $key => $value) {
    	$this->service->newValues(8, $key, $value);
   	}
	$callback();
};

A pak jsem zkoušel takto. Tak se to tam nedostane.

$form->onSuccess[] = function (Form $form, $values) use ($callback) {
	$items = $values->nezem_cin1;
    foreach ($items as $key => $value) {
    	$this->service->newValues(8, $key, $value);
   	}
	$callback();
};

V homepage presenteru volám kdyžtak takto.

protected function createComponentForm_nezemcin()
    {
        return $this->questionnaireFormFactory->createFormNezemcin(function () {
        });
    }
CZechBoY
Člen | 3608
+
0
-

Do onSuccess se dostane nebo jen foreach neiteruje?

nocturne32
Člen | 21
+
0
-

Foreach jenom neiteruje. Dokonce jsem dumpnul $values v onSuccess a vyplivlo to prázdný array(), i když jsem nějaké checkboxy zaškrtal. Ten texbox „jiná činnost“ to však ukázalo správně, když jsem ho vyplnil. Tak nevím, kde je ten problém.

nocturne32
Člen | 21
+
0
-

@CZechBoY – Už jsem našel chybu, a bylo to v šabloně.
Zkusil jsem vypsat dva checkboxlisty najednou a funguje jenom nezem_cin1, ten ručně vypsaný nefunguje, ale potřeboval bych to nastylovat a navíc to vrací ne úplně to, co bych chtěl.

{form form_nezemcin class=>'form-horizontal'}
    <h3 class="col-lg-12">4. Nezemědělská činnost</h3>
    {input submit}
    <div class="col-xs-12 col-lg-6">
        {input nezem_cin1} //takhle to funguje
    </div>
    <div class="col-xs-12 col-lg-6">
        {foreach $form['nezem_cin2']->items as $key => $label} //takhle to nefunguje
            <div class="profile_option">
                <input type="checkbox" name="{$form->name}[]" value="{$key}">
                <label for="nezmecin-{$key}">{$label}</label>
            </div>
        {/foreach}
        <div class="profile_option">
            {input jina_cin class=>'form-control'}
        </div>
    </div>
{/form}

Tohle vrací dump($values) po zaškrtání u každého checkboxlistu.

Nette\Utils\ArrayHash #7a97
	nezem_cin1 => array (3)
		0 => 2
		1 => 3
		2 => 4
	nezem_cin2 => array ()
	jina_cin => ""
David Matějka
Moderator | 6445
+
+3
-

vykresluj je nasledovne:

<input type="checkbox" n:name="nezem_cin2:$key">
<label n:name="nezem_cin2:$key">{$label}</label>

viz doc

nocturne32
Člen | 21
+
0
-

Ježiši, to mi úplně uniklo. Mockrát děkuji. :-)