Ukládání vybraných checkboxů do db
- nocturne32
- Člen | 21
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
->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
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
@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 () {
});
}
- nocturne32
- Člen | 21
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
@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
vykresluj je nasledovne:
<input type="checkbox" n:name="nezem_cin2:$key">
<label n:name="nezem_cin2:$key">{$label}</label>
viz doc