Podmienená validácia voliteľných súčastí formulárov

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

Zdravím,

je možné v Nette aplikovať addConditionOn() na celé skupiny alebo skupiny komponentov vytvorené pomocou FormContainer()?
Mám niekoľko metód, ktoré vracajú objekt typu FormContainer, na prvky ktorého by som chcel aplikovať podmienene (podľa užívateľa a hodnoty iného poľa) addConditionOn().
Skúšal som prístup cez call_user_func_array(), pričom addConditionOn() použijem pred call_user_func_array().

Príklad metódy, na ktorej by som to potreboval použiť:

	public function createFormPartBankAccount($name_prefix = '', $optional_on = NULL)
	{
		$sub = new FormContainer();

		$rules = array(
			'number'	=> array(
				array('addRule', Form::FILLED, $this->translate->_('Bank account number is obligatory')),
				array('addRule', Form::INTEGER, $this->translate->_('Bank account number has to be an integer')),
				array('addRule', Form::MIN_LENGTH, $this->translate->_('Minimal length of a bank account number is %d characters', 2), 2),
				array('addRule', Form::MAX_LENGTH, $this->translate->_('Maximal length of a bank account number is %d characters', 10), 10)
			),
			'bank_code'			=> array(
				array('addRule', Form::FILLED, $this->translate->_('Bank code is obligatory')),
				array('addRule', Form::MIN_LENGTH, $this->translate->_('Minimal length of bank code is %d characters', 3), 3),
				array('addRule', Form::MAX_LENGTH, $this->translate->_('Maximal length of bank code is %d characters', 4), 4)
			),
			'bank_name'			=> array(
				array('addRule', Form::FILLED, $this->translate->_('Bank name is obligatory')),
				array('addRule', Form::MIN_LENGTH, $this->translate->_('Bank name has to have at least %d characters', 2), 2),
				array('addRule', Form::MAX_LENGTH, $this->translate->_('Bank name can have at most %d characters', 20), 20)
			)
		);

		$sub->addText($name_prefix . 'number_prefix', $this->translate->_('Account number prefix'), 6, 6)
				->addCondition(Form::FILLED)
				->addRule(Form::INTEGER, $this->translate->_('Account number prefix has to be an integer'));
		$sub->addText($name_prefix . 'number', $this->translate->_('Account number'), 10, 10);
		$sub->addText($name_prefix . 'bank_code', $this->translate->_('Bank code'), 4, 4);
		$sub->addText($name_prefix . 'bank_name', $this->translate->_('Bank name'), 20, 20);
		$sub->addText($name_prefix . 'bic', $this->translate->_('Bank Identifier Code (BIC)'), 11, 11);
		$sub->addText($name_prefix . 'iban', $this->translate->_('International Bank Account Number (IBAN)'), 20, 20);

		foreach($rules as $form_element => $rule)
		{
			$index_name = $name_prefix . $form_element;
			// $sub->components[$index_name]->addRule(Form::FILLED, $required_element_message[$required_element]);
			if( !empty($optional_on) )
			{
				$sub->components[$index_name]->addConditionOn($optional_on['element'], $optional_on['condition_name'], $optional_on['condition_value']);
			}
			// call_user_func_array
			foreach($rules[$form_element] as $extra_rule)
			{
				call_user_func_array(array($sub->components[$index_name], $extra_rule[0]), array_slice($extra_rule, 1));
			}
		}

		return $sub;
	}

Problém s touto metódou je, že sa síce pravidlo použije, ale nasledujúce pravidlá nie sú jemu podradené (užívateľ je vyzývaný na zadanie čísla účtu, aj keď by byť nemal), čo je to, čo by som potreboval.

Nemá niekto nejakú radu?

Ďakujem.