Source for file Rules.php
Documentation is available at Rules.php
6: * @copyright Copyright (c) 2004, 2010 David Grudl
7: * @license http://nettephp.com/license Nette license
8: * @link http://nettephp.com
10: * @package Nette\Forms
16: * List of validation & condition rules.
18: * @copyright Copyright (c) 2004, 2010 David Grudl
19: * @package Nette\Forms
23: /** @ignore internal */
24: const VALIDATE_PREFIX =
'validate';
27: public static $defaultMessages =
array(
30: /** @var array of Rule */
31: private $rules =
array();
37: private $toggles =
array();
39: /** @var IFormControl */
46: $this->control =
$control;
52: * Adds a validation rule for the current control.
53: * @param mixed rule type
54: * @param string message to display for invalid data
55: * @param mixed optional rule arguments
56: * @return Rules provides a fluent interface
58: public function addRule($operation, $message =
NULL, $arg =
NULL)
61: $rule->control =
$this->control;
62: $rule->operation =
$operation;
63: $this->adjustOperation($rule);
66: if ($message ===
NULL &&
isset(self::$defaultMessages[$rule->operation])) {
67: $rule->message =
self::$defaultMessages[$rule->operation];
69: $rule->message =
$message;
72: if ($this->parent ===
NULL) {
73: // notify only direct rules
74: $this->control->notifyRule($rule);
76: $this->rules[] =
$rule;
83: * Adds a validation condition a returns new branch.
84: * @param mixed condition type
85: * @param mixed optional condition arguments
86: * @return Rules new branch
96: * Adds a validation condition on specified control a returns new branch.
97: * @param IFormControl form control
98: * @param mixed condition type
99: * @param mixed optional condition arguments
100: * @return Rules new branch
105: $rule->control =
$control;
106: $rule->operation =
$operation;
107: $this->adjustOperation($rule);
110: $rule->subRules =
new self($this->control);
111: $rule->subRules->parent =
$this;
113: $this->rules[] =
$rule;
114: return $rule->subRules;
120: * Adds a else statement.
121: * @return Rules else branch
125: $rule =
clone end($this->parent->rules);
126: $rule->isNegative =
!$rule->isNegative;
127: $rule->subRules =
new self($this->parent->control);
128: $rule->subRules->parent =
$this->parent;
129: $this->parent->rules[] =
$rule;
130: return $rule->subRules;
136: * Ends current validation condition.
137: * @return Rules parent branch
141: return $this->parent;
147: * Toggles HTML elememnt visibility.
148: * @param string element id
149: * @param bool hide element?
150: * @return Rules provides a fluent interface
154: $this->toggles[$id] =
$hide;
161: * Validates against ruleset.
162: * @param bool stop before first error?
163: * @return bool is valid?
168: foreach ($this->rules as $rule)
170: if ($rule->control->isDisabled()) continue;
172: $success =
($rule->isNegative xor $this->getCallback($rule)->invoke($rule->control, $rule->arg));
174: if ($rule->type ===
Rule::CONDITION &&
$success) {
175: $success =
$rule->subRules->validate($onlyCheck);
176: $valid =
$valid &&
$success;
178: } elseif ($rule->type ===
Rule::VALIDATOR &&
!$success) {
182: $rule->control->addError(self::formatMessage($rule, TRUE));
184: if ($rule->breakOnFailure) {
195: * Iterates over ruleset.
196: * @return ArrayIterator
200: return new ArrayIterator($this->rules);
210: return $this->toggles;
216: * Process 'operation' string.
220: private function adjustOperation($rule)
223: $rule->isNegative =
TRUE;
224: $rule->operation = ~
$rule->operation;
227: if (!$this->getCallback($rule)->isCallable()) {
228: $operation =
is_scalar($rule->operation) ?
" '$rule->operation'" :
'';
229: throw new InvalidArgumentException("Unknown operation$operation for control '{$rule->control->name}'.
");
235: private function getCallback($rule)
237: $op =
$rule->operation;
249: $message =
$rule->message;
250: if ($translator =
$rule->control->getForm()->getTranslator()) {
251: $message =
$translator->translate($message, is_int($rule->arg) ?
$rule->arg :
NULL);
254: $message =
str_replace('%label', $rule->control->translate($rule->control->caption), $message);
256: $message =
str_replace('%value', $withValue ? (string)
$rule->control->getValue() :
'%%value', $message);