Nejde odeslat formular s praznym checkboxem

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

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)

  1. nactu stranku (ve formulari neni zaskrtly zadny checkbox)
  2. zaskrtnu nejaky checkbox a formular odeslu
  3. stranka se refreshne a me se vyfiltruji data a ten checkbox, ktery jsem zaskrtnul zaskrtnuty zustane
  4. zasktnuty checkbox odskrtnu a odeslu formular
  5. 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?

pepelopez
Člen | 9
+
0
-

tak problem bude asi zde:

$form->setMethod('GET');

pac kdyz radky zakomentuju, tak vse funguje jak ma (ale formular se odesila POSTEM), coz nechci.......

Editoval pepelopez (19. 6. 2012 17:31)

LeonardoCA
Člen | 296
+
0
-

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

jj name a ID zacina, vypada takto:

<input type="checkbox" name="velikosti[1]" id="frmfilterForm-velikosti-1">
//atdatdatd....
pepelopez
Člen | 9
+
0
-

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

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

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.