checkboxy ve skupině a kontejneru – defaultní hodnoty

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

Dobrý den. Mám následující problém:
Je několik skupin checkboxů (fieldsety) a v každý skupině je kontejner (aby se odesílaly jako pole).

<?php
// form
$pForm = new NForm('userForm');
// step through groups
foreach ($allGroups as $groupName => $group) {
	// add fieldset
	$pForm->addGroup($groupName);
	// + container
	$container = $pForm->addContainer($groupName);
	// step through one group
	foreach ($group as $cbName => $data) { // $data is reference to object
		$caption = $data->getCzech();
		$container->addCheckbox($cbName, $caption);
	}
}
$pForm->addSubmit('odeslat', 'odeslat');
?>

když dumpnu post, vyleze z toho například (po zaškrtnutí pár checkboxů):

array(4) {
  "public" => array(2) {
    "articles" => string(2) "on"
    "page" => string(2) "on"
  }
  "admin" => array(3) {
    "admin_users" => string(2) "on"
    "admin_articles" => string(2) "on"
    "admin_files" => string(2) "on"
  }
  "stats" => array(1) {
    "statistics" => string(2) "on"
  }
  "odeslat" => string(7) "odeslat"
}

což je sice fajn a přesně jak jsem chtěl, ale problém je, že nedokážu nastavit defaultní hodnotu (zaškrtnutí checkboxu) pomocí $pForm->setDefaults(…) – podle podobnýho vstupního pole

nezlobte se na mě, pokud je to opravdu hloupej dotaz, ale s nette tolik zkušeností nemam a na fóru jsem to taky nenašel. Děkuju.

Editoval m938nek (10. 12. 2009 16:55)

m938nek
Člen | 7
+
0
-

Pomůže mi někdo?

Davelister
Člen | 28
+
0
-

Neco takoveho funguje:

$pForm->setDefaults(array('public'=>array('admin_users'=>true)));

PS: Misto dumpovani POSTU pouzij $pForm->getValues(), tadle metoda ti da osetrena data, u checkboxu asi neni co osetrovat, ale treba u selectu uz je.

Editoval Davelister (11. 12. 2009 18:23)

BigCharlie
Člen | 283
+
0
-

Ještě dodám, že když bys chtěl nastavit hodnotu jednomu prvku, použij metodu setDefaultValue:

$form = new Form();
$form->addText("pole", "Pole")->setDefaultValue("obsah");
hurvajs
Člen | 86
+
0
-

nebo treba tak, ze se kouknes jak vypada odeslany POST a Ty predgenerujes proste n-rozmerne pole, tak aby odpovidalo a nastavis pomoci setDefaults()

m938nek
Člen | 7
+
0
-

Výborně, děkuju za pomoc. Právě jsem to zkoušel a je to ok. Mam ale ještě jeden dotaz. Jak takovym checkboxům nastavim validační podmínku, aby směl zůstat zaškrtlej jen pokud je zaškrtlej určitej jinej?

libja
Člen | 8
+
0
-

Máš na mysli toto? viz neprůstřelné formuláře

Podmínku je možné vázat i na jiný prvek, než ten aktuální. Stačí addCondition nahradit za addConditionOn a jako první parametr uvést odvolávku na jiný prvek. V tomto případě se bude e-mail vyžadovat tehdy, zaškrtne-li se checkbox (tj. jeho logická hodnota bude TRUE):

<?php
$form->addCheckbox('promo', 'zasílejte mi reklamu');
$form->addText('email', 'E-mail:')
        ->addConditionOn($form['promo'], Form::EQUAL, TRUE) // podmínka: pokud je checkbox zaškrtnut
                ->addRule(Form::FILLED, 'Zadejte e-mailovou adresu'); // pak musí být e-mail zadan
?>
m938nek
Člen | 7
+
0
-

Měl jsem na mysli spíš opak :) (chvíli jsem si s tim hrál, ale tvá rada dost pomohla, libjo). Jen pro pořáek tady uvádim řešení:

// nezaškrtlej ten nadřazenej
->addConditionOn($pForm[$groupName][$supName], NForm::EQUAL, false)
	// ale zaškrtlej podřazenej - chyba
	->addRule(NForm::EQUAL, 'Pro přístup k "'.$data->getCzech().'" musí být přístup i k nadřazené', false);

samozřejme $supName jsem si naplnil tim co je mu nadřízenej, ono to je v 1. příspěvku tohohle vlákna dost zjednodušený, takhle to ve skutečnosti nevypadá…

ještě by mě ale zajímala jedna věc – – – je možný přidat nějakou akci/podmínku, aby se po odškrtnutí jednoho checkboxu odškrtly i určitý jiný (javascriptem). Pak už snad přestanu otravovat. Díky.