Skip to content

Commit

Permalink
Forms: class Rule: renamed variables and removed constants (BC break …
Browse files Browse the repository at this point in the history
…for internal usage)
  • Loading branch information
dg committed Aug 29, 2013
1 parent fc2df69 commit 5aad1de
Show file tree
Hide file tree
Showing 8 changed files with 56 additions and 68 deletions.
12 changes: 6 additions & 6 deletions Nette/Forms/Controls/BaseControl.php
Original file line number Diff line number Diff line change
Expand Up @@ -386,9 +386,9 @@ public function translate($s, $count = NULL)
* @param mixed optional rule arguments
* @return self
*/
public function addRule($operation, $message = NULL, $arg = NULL)
public function addRule($validator, $message = NULL, $arg = NULL)
{
$this->rules->addRule($operation, $message, $arg);
$this->rules->addRule($validator, $message, $arg);
return $this;
}

Expand All @@ -399,9 +399,9 @@ public function addRule($operation, $message = NULL, $arg = NULL)
* @param mixed optional condition arguments
* @return Nette\Forms\Rules new branch
*/
public function addCondition($operation, $value = NULL)
public function addCondition($validator, $value = NULL)
{
return $this->rules->addCondition($operation, $value);
return $this->rules->addCondition($validator, $value);
}


Expand All @@ -412,9 +412,9 @@ public function addCondition($operation, $value = NULL)
* @param mixed optional condition arguments
* @return Nette\Forms\Rules new branch
*/
public function addConditionOn(IControl $control, $operation, $value = NULL)
public function addConditionOn(IControl $control, $validator, $value = NULL)
{
return $this->rules->addConditionOn($control, $operation, $value);
return $this->rules->addConditionOn($control, $validator, $value);
}


Expand Down
10 changes: 5 additions & 5 deletions Nette/Forms/Controls/TextBase.php
Original file line number Diff line number Diff line change
Expand Up @@ -110,23 +110,23 @@ public function getControl()
}


public function addRule($operation, $message = NULL, $arg = NULL)
public function addRule($validator, $message = NULL, $arg = NULL)
{
if ($operation === Form::FLOAT) {
if ($validator === Form::FLOAT) {
$this->addFilter(function($s) {
return str_replace(array(' ', ','), array('', '.'), $s);
});

} elseif ($operation === Form::URL) {
} elseif ($validator === Form::URL) {
$this->addFilter(function($s) {
return Nette\Utils\Validators::isUrl('http://' . $s) ? 'http://' . $s : $s;
});

} elseif ($operation === Form::LENGTH || $operation === Form::MAX_LENGTH) {
} elseif ($validator === Form::LENGTH || $validator === Form::MAX_LENGTH) {
$tmp = is_array($arg) ? $arg[1] : $arg;
$this->control->maxlength = is_scalar($tmp) ? $tmp : NULL;
}
return parent::addRule($operation, $message, $arg);
return parent::addRule($validator, $message, $arg);
}

}
6 changes: 3 additions & 3 deletions Nette/Forms/Controls/TextInput.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,13 +75,13 @@ public function getControl()
$input = parent::getControl();

foreach ($this->getRules() as $rule) {
if ($rule->isNegative || $rule->type !== Nette\Forms\Rule::VALIDATOR) {
if ($rule->isNegative || $rule->branch) {

} elseif ($rule->operation === Nette\Forms\Form::RANGE && $input->type !== 'text') {
} elseif ($rule->validator === Nette\Forms\Form::RANGE && $input->type !== 'text') {
$input->min = isset($rule->arg[0]) && is_scalar($rule->arg[0]) ? $rule->arg[0] : NULL;
$input->max = isset($rule->arg[1]) && is_scalar($rule->arg[1]) ? $rule->arg[1] : NULL;

} elseif ($rule->operation === Nette\Forms\Form::PATTERN && is_scalar($rule->arg)) {
} elseif ($rule->validator === Nette\Forms\Form::PATTERN && is_scalar($rule->arg)) {
$input->pattern = $rule->arg;
}
}
Expand Down
15 changes: 7 additions & 8 deletions Nette/Forms/Helpers.php
Original file line number Diff line number Diff line change
Expand Up @@ -93,24 +93,23 @@ public static function exportRules(Rules $rules, $json = TRUE)
{
$payload = array();
foreach ($rules as $rule) {
if (!is_string($op = $rule->operation)) {
if (!is_string($op = $rule->validator)) {
if (!Nette\Utils\Callback::isStatic($op)) {
continue;
}
$op = Nette\Utils\Callback::toString($op);
}
if ($rule->type === Rule::VALIDATOR) {
$item = array('op' => ($rule->isNegative ? '~' : '') . $op, 'msg' => Validator::formatMessage($rule, FALSE));

} elseif ($rule->type === Rule::CONDITION) {
if ($rule->branch) {
$item = array(
'op' => ($rule->isNegative ? '~' : '') . $op,
'rules' => static::exportRules($rule->subRules, FALSE),
'rules' => static::exportRules($rule->branch, FALSE),
'control' => $rule->control->getHtmlName()
);
if ($rule->subRules->getToggles()) {
$item['toggle'] = $rule->subRules->getToggles();
if ($rule->branch->getToggles()) {
$item['toggle'] = $rule->branch->getToggles();
}
} else {
$item = array('op' => ($rule->isNegative ? '~' : '') . $op, 'msg' => Validator::formatMessage($rule, FALSE));
}

if (is_array($rule->arg)) {
Expand Down
17 changes: 4 additions & 13 deletions Nette/Forms/Rule.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,31 +21,22 @@
*/
final class Rule extends Nette\Object
{
/** type */
const CONDITION = 1;

/** type */
const VALIDATOR = 2;

/** @var IControl */
public $control;

/** @var mixed */
public $operation;
public $validator;

/** @var mixed */
public $arg;

/** @var int (CONDITION, VALIDATOR, FILTER) */
public $type;

/** @var bool */
public $isNegative = FALSE;

/** @var string (only for VALIDATOR type) */
/** @var string */
public $message;

/** @var Rules (only for CONDITION type) */
public $subRules;
/** @var Rules for conditions */
public $branch;

}
46 changes: 22 additions & 24 deletions Nette/Forms/Rules.php
Original file line number Diff line number Diff line change
Expand Up @@ -79,16 +79,15 @@ public function isRequired()
* @param mixed optional rule arguments
* @return self
*/
public function addRule($operation, $message = NULL, $arg = NULL)
public function addRule($validator, $message = NULL, $arg = NULL)
{
$rule = new Rule;
$rule->control = $this->control;
$rule->operation = $operation;
$rule->validator = $validator;
$this->adjustOperation($rule);
$rule->arg = $arg;
$rule->type = Rule::VALIDATOR;
$rule->message = $message;
if ($rule->operation === Form::REQUIRED) {
if ($rule->validator === Form::REQUIRED) {
$this->required = $rule;
} else {
$this->rules[] = $rule;
Expand All @@ -103,9 +102,9 @@ public function addRule($operation, $message = NULL, $arg = NULL)
* @param mixed optional condition arguments
* @return Rules new branch
*/
public function addCondition($operation, $arg = NULL)
public function addCondition($validator, $arg = NULL)
{
return $this->addConditionOn($this->control, $operation, $arg);
return $this->addConditionOn($this->control, $validator, $arg);
}


Expand All @@ -116,19 +115,18 @@ public function addCondition($operation, $arg = NULL)
* @param mixed optional condition arguments
* @return Rules new branch
*/
public function addConditionOn(IControl $control, $operation, $arg = NULL)
public function addConditionOn(IControl $control, $validator, $arg = NULL)
{
$rule = new Rule;
$rule->control = $control;
$rule->operation = $operation;
$rule->validator = $validator;
$this->adjustOperation($rule);
$rule->arg = $arg;
$rule->type = Rule::CONDITION;
$rule->subRules = new static($this->control);
$rule->subRules->parent = $this;
$rule->branch = new static($this->control);
$rule->branch->parent = $this;

$this->rules[] = $rule;
return $rule->subRules;
return $rule->branch;
}


Expand All @@ -140,10 +138,10 @@ public function elseCondition()
{
$rule = clone end($this->parent->rules);
$rule->isNegative = !$rule->isNegative;
$rule->subRules = new static($this->parent->control);
$rule->subRules->parent = $this->parent;
$rule->branch = new static($this->parent->control);
$rule->branch->parent = $this->parent;
$this->parent->rules[] = $rule;
return $rule->subRules;
return $rule->branch;
}


Expand Down Expand Up @@ -179,10 +177,10 @@ public function validate()
foreach ($this as $rule) {
$success = $this->validateRule($rule);

if ($rule->type === Rule::CONDITION && $success && !$rule->subRules->validate()) {
if ($success && $rule->branch && !$rule->branch->validate()) {
return FALSE;

} elseif ($rule->type === Rule::VALIDATOR && !$success) {
} elseif (!$success && !$rule->branch) {
$rule->control->addError(Validator::formatMessage($rule, TRUE));
return FALSE;
}
Expand Down Expand Up @@ -228,9 +226,9 @@ public function getToggles($actual = FALSE)
{
$toggles = $this->toggles;
foreach ($actual ? $this : array() as $rule) {
if ($rule->type === Rule::CONDITION) {
if ($rule->branch) {
$success = static::validateRule($rule);
foreach ($rule->subRules->getToggles(TRUE) as $id => $hide) {
foreach ($rule->branch->getToggles(TRUE) as $id => $hide) {
$toggles[$id] = empty($toggles[$id]) ? ($success && $hide) : TRUE;
}
}
Expand All @@ -246,21 +244,21 @@ public function getToggles($actual = FALSE)
*/
private function adjustOperation($rule)
{
if (is_string($rule->operation) && ord($rule->operation[0]) > 127) {
if (is_string($rule->validator) && ord($rule->validator[0]) > 127) {
$rule->isNegative = TRUE;
$rule->operation = ~$rule->operation;
$rule->validator = ~$rule->validator;
}

if (!is_callable($this->getCallback($rule))) {
$operation = is_scalar($rule->operation) ? " '$rule->operation'" : '';
throw new Nette\InvalidArgumentException("Unknown operation$operation for control '{$rule->control->name}'.");
$validator = is_scalar($rule->validator) ? " '$rule->validator'" : '';
throw new Nette\InvalidArgumentException("Unknown validator$validator for control '{$rule->control->name}'.");
}
}


private static function getCallback($rule)
{
$op = $rule->operation;
$op = $rule->validator;
if (is_string($op) && strncmp($op, ':', 1) === 0) {
return 'Nette\Forms\Validator::validate' . ltrim($op, ':');
} else {
Expand Down
4 changes: 2 additions & 2 deletions Nette/Forms/Validator.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,8 @@ public static function formatMessage(Rule $rule, $withValue = TRUE)
if ($message instanceof Nette\Utils\Html) {
return $message;

} elseif ($message === NULL && is_string($rule->operation) && isset(static::$messages[$rule->operation])) {
$message = static::$messages[$rule->operation];
} elseif ($message === NULL && is_string($rule->validator) && isset(static::$messages[$rule->validator])) {
$message = static::$messages[$rule->validator];

} elseif ($message == NULL) { // intentionally ==
trigger_error("Missing validation message for control '{$rule->control->name}'.", E_USER_WARNING);
Expand Down
14 changes: 7 additions & 7 deletions tests/Nette/Forms/Rules.required.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ test(function() { // Rules

$items = iterator_to_array($rules);
Assert::same( 1, count($items) );
Assert::same( Form::REQUIRED, $items[0]->operation );
Assert::same( Rule::VALIDATOR, $items[0]->type );
Assert::same( Form::REQUIRED, $items[0]->validator );
Assert::null( $items[0]->branch );
Assert::false( $items[0]->isNegative );

Assert::false( $rules->validate() );
Expand All @@ -54,15 +54,15 @@ test(function() { // 'required' is always the first rule

$items = iterator_to_array($rules);
Assert::same( 2, count($items) );
Assert::same( Form::REQUIRED, $items[0]->operation );
Assert::same( Form::EMAIL, $items[1]->operation );
Assert::same( Form::REQUIRED, $items[0]->validator );
Assert::same( Form::EMAIL, $items[1]->validator );

$rules->addRule(~$form::REQUIRED);
$items = iterator_to_array($rules);
Assert::same( 2, count($items) );
Assert::same( Form::REQUIRED, $items[0]->operation );
Assert::same( Form::REQUIRED, $items[0]->validator );
Assert::true( $items[0]->isNegative );
Assert::same( Form::EMAIL, $items[1]->operation );
Assert::same( Form::EMAIL, $items[1]->validator );

Assert::false( $rules->validate() );
Assert::same( array('Please enter a valid email address.'), $input->getErrors() );
Expand All @@ -80,7 +80,7 @@ test(function() { // setRequired(FALSE)

$items = iterator_to_array($rules);
Assert::same( 1, count($items) );
Assert::same( Form::EMAIL, $items[0]->operation );
Assert::same( Form::EMAIL, $items[0]->validator );

Assert::false( $rules->validate() );
Assert::same( array('Please enter a valid email address.'), $input->getErrors() );
Expand Down

0 comments on commit 5aad1de

Please sign in to comment.