Source for file Rules.php
Documentation is available at Rules.php
6: * Copyright (c) 2004, 2009 David Grudl (http://davidgrudl.com)
8: * This source file is subject to the "Nette license" that is bundled
9: * with this package in the file license.txt.
11: * For more information please see http://nettephp.com
13: * @copyright Copyright (c) 2004, 2009 David Grudl
14: * @license http://nettephp.com/license Nette license
15: * @link http://nettephp.com
22: require_once dirname(__FILE__) .
'/../Object.php';
27: * List of validation & condition rules.
29: * @author David Grudl
30: * @copyright Copyright (c) 2004, 2009 David Grudl
38: public static $defaultMessages =
array(
41: /** @var array of NRule */
42: private $rules =
array();
48: private $toggles =
array();
50: /** @var IFormControl */
57: $this->control =
$control;
63: * Adds a validation rule for the current control.
64: * @param mixed rule type
65: * @param string message to display for invalid data
66: * @param mixed optional rule arguments
67: * @return NRules provides a fluent interface
69: public function addRule($operation, $message =
NULL, $arg =
NULL)
72: $rule->control =
$this->control;
73: $rule->operation =
$operation;
74: $this->adjustOperation($rule);
77: if ($message ===
NULL &&
isset(self::$defaultMessages[$rule->operation])) {
78: $rule->message =
self::$defaultMessages[$rule->operation];
80: $rule->message =
$message;
83: if ($this->parent ===
NULL) {
84: // notify only direct rules
85: $this->control->notifyRule($rule);
87: $this->rules[] =
$rule;
94: * Adds a validation condition a returns new branch.
95: * @param mixed condition type
96: * @param mixed optional condition arguments
97: * @return NRules new branch
107: * Adds a validation condition on specified control a returns new branch.
108: * @param IFormControl form control
109: * @param mixed condition type
110: * @param mixed optional condition arguments
111: * @return NRules new branch
116: $rule->control =
$control;
117: $rule->operation =
$operation;
118: $this->adjustOperation($rule);
121: $rule->subRules =
new self($this->control);
122: $rule->subRules->parent =
$this;
124: $this->rules[] =
$rule;
125: return $rule->subRules;
131: * Adds a else statement.
132: * @return NRules else branch
136: $rule =
clone end($this->parent->rules);
137: $rule->isNegative =
!$rule->isNegative;
138: $rule->subRules =
new self($this->parent->control);
139: $rule->subRules->parent =
$this->parent;
140: $this->parent->rules[] =
$rule;
141: return $rule->subRules;
147: * Ends current validation condition.
148: * @return NRules parent branch
152: return $this->parent;
158: * Toggles HTML elememnt visibility.
159: * @param string element id
160: * @param bool hide element?
161: * @return NRules provides a fluent interface
165: $this->toggles[$id] =
$hide;
172: * Validates against ruleset.
173: * @param bool stop before first error?
174: * @return bool is valid?
179: foreach ($this->rules as $rule)
181: if ($rule->control->isDisabled()) continue;
183: $success =
($rule->isNegative xor call_user_func($this->getCallback($rule), $rule->control, $rule->arg));
185: if ($rule->type ===
NRule::CONDITION &&
$success) {
186: $success =
$rule->subRules->validate($onlyCheck);
187: $valid =
$valid &&
$success;
189: } elseif ($rule->type ===
NRule::VALIDATOR &&
!$success) {
193: $rule->control->addError(vsprintf($rule->control->translate($rule->message), (array)
$rule->arg));
195: if ($rule->breakOnFailure) {
206: * Iterates over ruleset.
207: * @return ArrayIterator
211: return new ArrayIterator($this->rules);
221: return $this->toggles;
227: * Process 'operation' string.
231: private function adjustOperation($rule)
234: $rule->isNegative =
TRUE;
235: $rule->operation = ~
$rule->operation;
240: $operation =
is_scalar($rule->operation) ?
" '$rule->operation'" :
'';
241: throw new InvalidArgumentException("Unknown operation$operation for control '{$rule->control->name}'.
");
247: private function getCallback($rule)
249: $op =
$rule->operation;
251: return array($rule->control->getClass(), self::VALIDATE_PREFIX .
ltrim($op, ':'));