Natavenie defaultValue pre checkBoxList

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

Caute

mam na forme checkBoxList , do ktoreho natahujem farby z ciselnika (id, nazov) napr.modra, zlta, cervena.
Cely form je editovaci form urcitej polozky a ja potrebujem aby ked nacitam form tak som mal zaskrtnute urcite farby napr. aby bola zaskrtnuta modra a cervena.

Zoznam Id zaskrtnutych farieb taham z DB a mam ich v poli $farby.

Ako by sa to dalo riesit?

Vdaka

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

No, argument předaný setDefaultValue() musí být pole ve formátu keyvalue.

V tomto případě to tedy bude pole booleanů, kde klíčem budou klíče předané Checkboxu.

$form->addCheckboxList('farby', 'Farby:', array(
	'red' => 'Cervena',
	'blue' => 'Modra',
));
$form->setDefaults(array(
	'farby' => array(
		'red' => TRUE,
		'blue' => FALSE,
	),
));
cujan
Člen | 410
+
0
-

a este jedna otazka, ako spravim z pola ktore mam $farby(cervena, zelena) pole $farby(‚cervena‘=>true,‚zelena‘=>false)

vdaka

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

To vůbec nesouvisí s Nette a s poskytnutými informacemi to ani nejde řešit :)

cujan
Člen | 410
+
0
-

lenze ja farby, ktore maju byt zaskrtnute taham z DB

cujan
Člen | 410
+
0
-

Presnejsie ide o to, ze ja ma farby, ktore maju byt zaskrtnute v db, a odtial si ich viem uz vytiahnut do premennej(1 rozmerne pole) $farby obsahuje (cervena, zelena) len toto pole neviem prerobit na dvojrozmerne… typu $farby(‚cervena‘=>true,‚zelena‘=>false)

Draffix
Člen | 146
+
0
-

cujan napsal(a):

Presnejsie ide o to, ze ja ma farby, ktore maju byt zaskrtnute v db, a odtial si ich viem uz vytiahnut do premennej(1 rozmerne pole) $farby obsahuje (cervena, zelena) len toto pole neviem prerobit na dvojrozmerne… typu $farby(‚cervena‘=>true,‚zelena‘=>false)

No pokud jsem to správně pochopil, tak nepotřebuješ dvojrozměrné pole, ale asociativní pole

cujan
Člen | 410
+
0
-

no presne toto potrebujem :-) len ja mam problem to zrealizovat :-)

cujan
Člen | 410
+
0
-

uz som to z casti poriesil, len problem je v tom, ze mi vytvori len pole co ma jeden prvok…

<?php
foreach ($farby as $farba)
	    {
		$pary = array($farba => "true");
	    }

?>

napriek tomu ak som to aplikoval na prvok

<?php
$form['farba']-> setDefaultValue($pary);
?>

tak nezaskrtne sa ani jedna farba…

Editoval cujan (8. 11. 2012 10:53)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Přednes svoji potíž na JakPsatWeb, tohle nesouvisí s Nette.

Řešení snad může vypadat takto (ačkoliv bez kontext programu je to tápání):

$farby = array_map(function () {
	return TRUE;
), array_flip($farby));
cujan
Člen | 410
+
0
-

super pomohlo to…

<?php
//vytvorenie asociativneho pola
$farbyPary = array_map(function () {return TRUE;}, array_flip($farby));
?>

ale este maly problem je v tom, ze ak pouzijem na nastavenie default hodnot

<?php
  $form['farba']-> setDefaultValue($farbyPary)
?>

tak mi zaskrtne uplne vsetky farby, ktore su naplnene v checkBoxListe …

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

cujan Podívej se na to očima toho, kdo tvůj problém čte. Zjistíš, že ti chybí dost informací… zkus rovnou poslat svůj zdrojový kód, poskytnout co nejvíc informací… takhle ti nikdo pomoct nemůže.

cujan
Člen | 410
+
0
-

oki cize toto je form

<?php
protected function createComponentEditForm() {
	    //nacitanie udajov z ciselnika
	    $skupina = $this->skupinaRepository->findAllSkupina()->fetchPairs('id','nazov');
	    $krystalografickaSustava = $this->ciselnikkrystalografickasustavaRepository->findAllKrystalografickaSustava()->fetchPairs('id','vlastnost');
	    $vryp = $this->ciselnikvrypRepository = $this->ciselnikvrypRepository->findAllVryp()->fetchPairs('id','vlastnost');
	    $stiepatelnost = $this->ciselnikstiepatelnostRepository = $this->ciselnikstiepatelnostRepository->findAllStiepatelnost()->fetchPairs('id','vlastnost');
	    $farba = $this->ciselnikfarbaRepository->findAllFarba()->fetchPairs('id','vlastnost');
	    $lesk = $this->ciselnikleskRepository->findAllLesk()->fetchPairs('id','vlastnost');
	    $lom = $this->ciselniklomRepository->findAllLom()->fetchPairs('id','vlastnost');


	    $form = new Form;
	    //$form ->addHidden('id');
	    $form -> addText('nazov','Názov minerálu',40,100)->addRule(Form::FILLED,'Je nutné zadať názov');
	    $form -> addSelect('idSkupina','Skupina',$skupina)->setPrompt('- Zvoľte skupinu -');
	    $form -> addText('chemickeZlozenie','Chemické zloženie',40,100);
	    $form -> addSelect('idCiselnikKrystalografickaSustava','Kryštalografická sústava',$krystalografickaSustava)->setPrompt('- Zvoľte sústavu -');
	    $form -> addSelect('idCiselnikVryp','Vryp',$vryp)->setPrompt('- Zvoľte vryp -');
	    $form -> addText('tvrdostOd','tvrdosť od',40,100);
	    $form -> addText('tvrdostDo','tvrdosť do',40,100);
	    $form -> addSelect('idCiselnikStiepatelnost','Štiepateľnosť',$stiepatelnost)->setPrompt('- Zvoľte štiepateľnosť -');
	    $form -> addText('hustotaOd','hustota od',40,100);
	    $form -> addText('hustotaDo','hustota do',40,100);
	    $form -> addCheckboxList('farba','farba',$farba);
	    $form -> addCheckboxList('lesk','lesk',$lesk);
	    $form -> addCheckboxList('lom','lom',$lom);

	    $form->addSubmit('create', 'Ulož');
	    $form->onSuccess[] = $this->editMineralFormSubmitted;
	    return $form;
	}
?>

tu je metoda render edit

<?php
public function renderEdit($id=0)
	{
	    $mineralEdit = $this->mineralRepository->findBy(array('id' => $id))->fetch()->toArray();
	    $farby = $this->mineralfarbaRepository->findBy(array('idMineral'=> $id))->fetchColumn('idFarba');

	    dump($farby);
	    $form = $this['editForm'];
	    $form -> setDefaults($mineralEdit);
	    $form['idSkupina'] -> setDefaultValue($mineralEdit['idSkupina']);
	    $form['idCiselnikKrystalografickaSustava'] -> setDefaultValue($mineralEdit['idCiselnikKrystalografickaSustava']);
	    $form['idCiselnikVryp'] -> setDefaultValue($mineralEdit['idCiselnikVryp']);
	    $form['idCiselnikStiepatelnost'] -> setDefaultValue($mineralEdit['idCiselnikStiepatelnost']);

	    //vytvory asociativne pole pre farby (cervena => true...)
	    $farbyPary = array_map(function () {return TRUE;}, array_flip($farby));

	    dump($farbyPary);
	    $form['farba']-> setDefaultValue($farbyPary);
	}
?>
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

S tím už se lépe odpovídá :). Bylo by asi dobré ještě doplnit do toho pole ty negativní barvy… teď budou mít všechny TRUE, a ty co v poli nejsou, ale jsou ve $farby v továrničce formuláře, by se měly přidat s hodnotou FALSE.

cujan
Člen | 410
+
0
-

teraz render edit vyzera takto

<?php
public function renderEdit($id=0)
	{
	    $mineralEdit = $this->mineralRepository->findBy(array('id' => $id))->fetch()->toArray();
	    $farby = $this->mineralfarbaRepository->findBy(array('idMineral'=> $id))->fetchColumn('idFarba');
	    $farbyAll = $this->ciselnikfarbaRepository->findAll()->fetchColumn('id');

	    dump($farbyAll);
	    $form = $this['editForm'];
	    $form -> setDefaults($mineralEdit);
	    $form['idSkupina'] -> setDefaultValue($mineralEdit['idSkupina']);
	    $form['idCiselnikKrystalografickaSustava'] -> setDefaultValue($mineralEdit['idCiselnikKrystalografickaSustava']);
	    $form['idCiselnikVryp'] -> setDefaultValue($mineralEdit['idCiselnikVryp']);
	    $form['idCiselnikStiepatelnost'] -> setDefaultValue($mineralEdit['idCiselnikStiepatelnost']);

	    //vytvory asociativne pole pre farby (cervena => true...)
	    $farbyPary = array_map(function () {return TRUE;}, array_flip($farby));
	    $farbyKomplet = $farbyPary + array_map(function () {return FALSE;}, array_flip($farbyAll));
	    //foreach ($farby as $farba)
	    //{
		//$pary = array($farba => "true");
	    //}
	    dump($farbyKomplet);
	    $form['farba']-> setDefaultValue($farbyKomplet);
	}

?>

dump $farbyKomplet

array(15) {
12 ⇒ TRUE
10 ⇒ FALSE
11 ⇒ FALSE
13 ⇒ FALSE
14 ⇒ FALSE
15 ⇒ FALSE
16 ⇒ FALSE
17 ⇒ FALSE
18 ⇒ FALSE
19 ⇒ FALSE
20 ⇒ FALSE
21 ⇒ FALSE
22 ⇒ FALSE
23 ⇒ FALSE
24 ⇒ FALSE
}

farby komplet uz v tvare ze farby co maju byt zaskrtnute su true a ostatne su false, len pri zobrazeni mam este stale vsetky zaskrtnute…
neviem ci neude problem v tom ze to pole nie je zoradene…

Editoval cujan (8. 11. 2012 11:44)

cujan
Člen | 410
+
0
-

dva dni skusam a zatial nic nepomohlo…

cujan
Člen | 410
+
0
-

caute, priseil som nato, ziadne asociativne pole, proste predajte do setDefaultValue iba pole poloziek, ktore chcete mat zaskrtnute…

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

cujan Hluboce se omlouvám za mystifikaci… o který CheckboxList jde?

cujan
Člen | 410
+
0
-

o tento

https://componette.org/search/?…

ale pohoda, aj tak ti dakujem za kopu uzitocnych rad… vela som sa naucil a este viac si ma donutil nastdovat si tym ze si ma nakopol…

dikes