checkboxy ve skupině a kontejneru – defaultní hodnoty
- m938nek
- Člen | 7
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)
- Davelister
- Člen | 28
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
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");
- libja
- Člen | 8
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
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.