Dva na sobě závislé CheckBoxy

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

zdar, zkouším:

<?php

	$form = new AppForm($this, 'form');
        $form->addGroup();
        $form->addHidden('id');
        $form->addText('title', 'Název')->addRule(Form::FILLED, 'Prosím zadejte název');
        $form->addCheckbox('predefined', 'Použít předdefinované hodnoty');
        $form->addCheckbox('text', 'Použít textovou hodnotu');
        $form->getComponent('predefined')->addCondition($form['text'], Form::EQUAL, TRUE)->addRule(Form::FILLED, 'Parametr nemůže být zároveň předdefinovaný a textový.');
        $form->addSubmit('submit1', 'Vložit');
        $form->onSubmit[] = array($this, 'handleSaveParam');
?>

zahlásí

InvalidArgumentException

Unknown operation for control ‚predefined‘.

Problém je v addCondition, ale proč,… netuším :(

Editoval Mas3r (7. 12. 2008 20:43)

LM
Člen | 206
+
0
-

U addCondition je první parametr operace ne komponenta, můžeš použít addConditionOn nebo rovnou asi

<?php
$form['predefined']->addCondition(Form::EQUAL, TRUE)
	->addConditionOn($form['text'],Form::EQUAL, TRUE)
		->addRule...
?>
Mas3r
Člen | 116
+
0
-

To bohužel taky nefunguje. Jinak vycházel jsem z:

<?php

$form = new Form();
$form->addText('name', 'Your name:')
    ->addRule(Form::FILLED, 'Enter your name');

$form->addText('age', 'Your age:', 5)
    ->addRule(Form::FILLED, 'Enter your age')
    ->addRule(Form::NUMERIC, 'Age must be numeric')
    ->addRule(Form::RANGE, 'Age must be in range from %d to %d', array(10, 100));

$form->addCheckbox('send', 'Shipping address:')
    ->addCondition(Form::EQUAL, TRUE)
        ->toggle('sendBox'); // toggle HTML element 'sendBox'

$form->addText('email', 'Email:', 35)
    ->setEmptyValue('@')
    ->addCondition(Form::FILLED) // conditional rule: if is email filled, ...
        ->addRule(Form::EMAIL, 'E-mail is not valid'); // ... then check email

$form->addText('city', 'City:', 35)
    ->addConditionOn($form['send'], Form::EQUAL, TRUE) // if $form['send'] is checked
        ->addRule(Form::FILLED, 'Enter your shipping address'); // $form['city'] must be filled

$form->addSelect('country', 'Country:', $countries)->skipFirst(); // skip first option
// must be declared, if you want use skipFirst
$form['country']->addRule(Form::FILLED, 'Select your country');
?>

EDIT: asi bych řekl, že na CheckBoxu nejde zavolat addCondition na jiný checkbox

Editoval Mas3r (7. 12. 2008 21:31)

LM
Člen | 206
+
0
-

Pak asi takhle:

<?php
$form['predefined']->addCondition(Form::EQUAL, TRUE)
	->addRuleFor($form['text'], ~Form::EQUAL, 'Parametr nemůže být zároveň předdefinovaný a textový.', TRUE);
?>
Jod
Člen | 701
+
0
-

Ja používam pri uploade súborov s nadpisom niečo takéto

<?php
	$form->addFile('document', 'Dokument');
	$form->addText('name', 'Názov')
		->addConditionOn($form['document'], Form::FILLED)
			->addRule(Form::FILLED, 'Vyplňte názov dokumentu');
?>

Či som teraz mimo o čom tu hovoríte? :D bo je už dosť hodin, treba sa uložiť na kute ,)

Editoval Jod (8. 12. 2008 1:05)

Mas3r
Člen | 116
+
0
-

Kombinace Text + CheckBox je asi OK, ale ne 2 Checkboxy …

<?php
$form->getComponent('predefined')->addCondition(Form::EQUAL, TRUE)->addRuleFor($form['text'], Form::EQUAL, 'Parametr nemůže být zároveň předdefinovaný a textový.', TRUE);
$form->getComponent('text')->addCondition(Form::EQUAL, TRUE)->addRuleFor($form['predefined'], Form::EQUAL, 'Parametr nemůže být zároveň předdefinovaný a textový.', TRUE);
?>

Ani toto nefaká.

Editoval Mas3r (8. 12. 2008 19:44)

LuKo
Člen | 116
+
0
-

Tato otázka mě napadla hned při prvním pohledu na Tvůj kód, ale raději jsem se neptal, protože v tom asi bude nějaký účel. Ale když vidím, jak se s tím trápíš, nedá mi to se nezeptat: chápu-li to správně, potřebuješ mít volbu pro buď předdefinovaný, nebo textový vstup. Proč nepoužiješ přepínač (radio)?

$form->addRadioList('typ', 'Použít hodnoty:', array('predefined' => 'předdefinované', 'text' => 'textové'));
Tomik
Nette Evangelist | 485
+
0
-

LuKo napsal(a):

Tato otázka mě napadla hned při prvním pohledu na Tvůj kód, ale raději jsem se neptal, protože v tom asi bude nějaký účel. Ale když vidím, jak se s tím trápíš, nedá mi to se nezeptat: chápu-li to správně, potřebuješ mít volbu pro buď předdefinovaný, nebo textový vstup. Proč nepoužiješ přepínač (radio)?

$form->addRadioList('typ', 'Použít hodnoty:', array('predefined' => 'předdefinované', 'text' => 'textové'));

Taky mě to napadlo, s tím, že na přepínač by šel navázat javascript, který by případný textový prvek schovával/ukazoval. A při zpracování by se obsah textového pole bral v úvahu, jen kdyby bylo vybráno „text“.

LuKo
Člen | 116
+
0
-

Tomik napsal(a):

Taky mě to napadlo, s tím, že na přepínač by šel navázat javascript, který by případný textový prvek schovával/ukazoval. A při zpracování by se obsah textového pole bral v úvahu, jen kdyby bylo vybráno „text“.

$form->addRadioList('typ', 'Použít hodnoty:', array('predefined' => 'předdefinované', 'text' => 'textové'))
     ->addCondition(Form::EQUAL, 'text')
          ->toggle('textbox');

Myslíš něco takového? (nezkoušel jsem, pouze jsem intuitivně použil již dříve napsané)

Mas3r
Člen | 116
+
0
-

Jo, nakonec použiju radio,… Byla to hloupost :)