Nejde odeslat formular s praznym checkboxem
- pepelopez
- Člen | 9
Ahoj,
narazil jsem na problem, pres ktery se nemuzu dostat. Nejdrive trochu kodu a na konci dotaz.
Mam formular, ktery bych chtel pouzivat na filtr nejakych dat. tomto filtru dynamicky generuju dejme tomu velikosti zbozi (XL, L, M…), formular vypada zjednodusene takto:
public function createComponentTestForm() {
$form = new AppForm();
//formular se odesila na /nejaka-stranka/neco/ (tedy bez puvodnich parametru, coz je OK)
$form->setAction($this->link('Detail:default'));
$form->setMethod('GET');
$product_sizes = array(1 => 'L', 2 => 'XL', 3 => 'S');
$sizes = $form->addContainer('velikosti'); $i = 1;
foreach($product_sizes as $size){
$sizes->addCheckbox($i, $size);
$i++;
}
$form->addSubmit('send', 'Filtrovat');
$form->onSuccess[] = array($this, 'nejakeFunkceKteraVlastneNicNedela');
return $form;
}
a v sablone ho vypisuju takto:
// slo by i control testForm, ale mam tam jinou strukturu html, kterou ted resit ale nemusime.
{form testForm}
{foreach $form['velikosti']->components as $component}
<label for="{$component->label->attrs['for']}">
{$component->control}
{$component->label}
</label>
{/foreach}
{/form}
no a pak mam DefaultPresenter s metodou renderDefault, ktera vypada takto:
// krome $velikosti prijma i dalsi jine parametry z filtru, pro ukazku staci jen jeden
public function renderPdefault($velikosti){
// pokud existuje promenna $velikosti, tak jsme ji pres ve filtrovacim formulari zaskrtli nejake pole pro filtr velikosti a udelame nejakou podminku pri vyberu dat z db....
}
no a problem je v tom, ze pokud stranku nactu tak filtr je prazdny.. to je jeste ok.. pokud ale zaskrtnu nejaky checkbox ve filtru a formular odeslu, tak se mi data spravne vyfiltruji a ten checkbox, ktery jsem zaskrnul zaskrtnuty zustane, to je taky ok.. kdyz ale ted checkbox (ktery jsem v minulem kroku zaskrnul) odskrtnu a formular odeslu, tak se stranka refreshne a checkbox zustane zaskrtnuty.. nevim si tedy rady s tim smazat informaci o tom, ze jsem zaskrtnuty checkbox odskrtnul.
Je to srozumitelne? Zkusim to jeste jednou trochu jinak :o)
- nactu stranku (ve formulari neni zaskrtly zadny checkbox)
- zaskrtnu nejaky checkbox a formular odeslu
- stranka se refreshne a me se vyfiltruji data a ten checkbox, ktery jsem zaskrtnul zaskrtnuty zustane
- zasktnuty checkbox odskrtnu a odeslu formular
- stranka se refreshne ale je v naprosto stejnem stavu jako v kroku 3) (vyfiltrovana data a zaskrtnuty checkbox. Mel by ale nastat stav 1, kdy se nactou vsechna data a formular bude prazdny).
nenapada nekoho, kde by mohl byt problem?
- LeonardoCA
- Člen | 296
Těžko říct bez dema, zkus raději takhle
$product_sizes = array(1 => 'L', 2 => 'XL', 3 => 'S');
$sizes = $form->addContainer('velikosti');
foreach($product_sizes as $key => $size){
$sizes->addCheckbox('size'+$key, $size);
}
nebo ještě lépe asi takhle
$product_sizes = array(1 => 'L', 2 => 'XL', 3 => 'S');
$sizes = $form->addContainer('velikosti');
foreach($product_sizes as $key => $size){
$sizes->addCheckbox('size', $size)
->setValue($key);
}
(nevím z hlavy s čím se lépe pracuje)
atribut name a id musí dle w3c spec začínat písmenem nebo podtržítkem nebo dvojtečkou, a když nezačíná může to dělat problémy
Editoval LeonardoCA (19. 6. 2012 18:12)
- pepelopez
- Člen | 9
on tam spis asi bude problem v tom, ze ta url se tvori takto:
&velikosti%5B1%5D=on&velikosti%5B2%5D=on&velikosti%5B3%5D=on
takze parametr velikosti je vlastne pole. mam ve formulari i checboxy, ktere se negeneruji dynamicky a na nich vse funguje tak, jak ma… problem je jen u techto "dynamicky"generovanych checkboxu
Editoval pepelopez (19. 6. 2012 20:03)
- pepelopez
- Člen | 9
take jsem zjistil, ze pokud v metode v presenteru:
public function renderDefault($velikosti){
}
smazu parametr $velikosti (takze takto):
public function renderDefault(){
tak vse funguje OK… tady ale ale nastava problem v tom, ze na strance je pouzita jeste komponenta paginator. POkud tedy neuvedu u metody renderDefault parametr velikosti, tak komponenta paginator mi tvori odkazy bez tohoto parametru coz je spatne.. pokud ve filtru totiz neco zaskrtnu, tak tento parametr se musi prenest i do komponenty paginator a to mi funguje pouze tehdy, pokud uvedu parametr velikosti jako parametr metody renderDefault… aach jo
a pokud nastavim:
/** @persistent */
public $velikosti;
tak nastava stejny problem, jako v mem prvnim prispevku…
Editoval pepelopez (19. 6. 2012 20:56)
- finwe
- Člen | 58
Právě jsem na toto taky narazil, mám sérii checkboxů, které jsou namapované na persistentní parametr.
Všiml jsem si, že nette generuje URL v action formuláře bez parametrů, ale parametry pak předává jako hiddeny (vygenerují se před zavíracím /form v FormMacros::renderFormEnd (WTF?)
Tudíž i když checkbox odškrtnu, hiddenu zůstává hodnota on a tak se i odešle spolu s formulářem.
Jak to ale vyřešit čistě (abych třeba javascriptem neměnil i hodnotu těch hiddenů), to mě nenapadlo.