Commit 41b127b9 by Qiang Xue

Finished js validation for compare validator.

parent fe98f60f
...@@ -30,6 +30,47 @@ yii.validation = (function ($) { ...@@ -30,6 +30,47 @@ yii.validation = (function ($) {
valid || messages.push(options.message); valid || messages.push(options.message);
}, },
compare: function (value, messages, options) {
if (options.skipOnEmpty && isEmpty(value)) {
return;
}
var compareValue, valid = true;
if (options.compareAttribute === undefined) {
compareValue = options.compareValue;
} else {
compareValue = $('#' + options.compareAttribute).val();
}
switch (options.operator) {
case '==':
valid = value == compareValue;
break;
case '===':
valid = value === compareValue;
break;
case '!=':
valid = value != compareValue;
break;
case '!==':
valid = value !== compareValue;
break;
case '>':
valid = value > compareValue;
break;
case '>=':
valid = value >= compareValue;
break;
case '<':
valid = value < compareValue;
break;
case '<=':
valid = value <= compareValue;
break;
}
valid || messages.push(options.message);
},
boolean: function (value, messages, options) { boolean: function (value, messages, options) {
if (options.skipOnEmpty && isEmpty(value)) { if (options.skipOnEmpty && isEmpty(value)) {
return; return;
......
...@@ -83,7 +83,7 @@ class BooleanValidator extends Validator ...@@ -83,7 +83,7 @@ class BooleanValidator extends Validator
*/ */
public function clientValidateAttribute($object, $attribute) public function clientValidateAttribute($object, $attribute)
{ {
$options['message'] = array( $options = array(
'trueValue' => $this->trueValue, 'trueValue' => $this->trueValue,
'falseValue' => $this->falseValue, 'falseValue' => $this->falseValue,
'message' => Html::encode(strtr($this->message, array( 'message' => Html::encode(strtr($this->message, array(
......
...@@ -9,6 +9,7 @@ namespace yii\validators; ...@@ -9,6 +9,7 @@ namespace yii\validators;
use Yii; use Yii;
use yii\base\InvalidConfigException; use yii\base\InvalidConfigException;
use yii\helpers\Html;
/** /**
* CompareValidator compares the specified attribute value with another value and validates if they are equal. * CompareValidator compares the specified attribute value with another value and validates if they are equal.
...@@ -58,6 +59,15 @@ class CompareValidator extends Validator ...@@ -58,6 +59,15 @@ class CompareValidator extends Validator
* - `<=`: validates to see if the value being validated is less than or equal to the value being compared with. * - `<=`: validates to see if the value being validated is less than or equal to the value being compared with.
*/ */
public $operator = '='; public $operator = '=';
/**
* @var string the user-defined error message. It may contain the following placeholders which
* will be replaced accordingly by the validator:
*
* - `{attribute}`: the label of the attribute being validated
* - `{value}`: the value of the attribute being validated
* - `{compareValue}`: the value or the attribute label to be compared with
*/
public $message;
/** /**
...@@ -172,24 +182,27 @@ class CompareValidator extends Validator ...@@ -172,24 +182,27 @@ class CompareValidator extends Validator
*/ */
public function clientValidateAttribute($object, $attribute) public function clientValidateAttribute($object, $attribute)
{ {
$options = array('operator' => $this->operator);
if ($this->compareValue !== null) { if ($this->compareValue !== null) {
$compareLabel = $this->compareValue; $options['compareValue'] = $this->compareValue;
$compareValue = json_encode($this->compareValue); $compareValue = $this->compareValue;
} else { } else {
$compareAttribute = $this->compareAttribute === null ? $attribute . '_repeat' : $this->compareAttribute; $compareAttribute = $this->compareAttribute === null ? $attribute . '_repeat' : $this->compareAttribute;
$compareValue = "\$('#" . (CHtml::activeId($object, $compareAttribute)) . "').val()"; $compareValue = $object->getAttributeLabel($compareAttribute);
$compareLabel = $object->getAttributeLabel($compareAttribute); $options['compareAttribute'] = Html::getInputId($object, $compareAttribute);
} }
$condition = "value {$this->operator} $compareValue";
$message = strtr($this->message, array( if ($this->skipOnEmpty) {
$options['skipOnEmpty'] = 1;
}
$options['message'] = Html::encode(strtr($options['message'], array(
'{attribute}' => $object->getAttributeLabel($attribute), '{attribute}' => $object->getAttributeLabel($attribute),
'{compareValue}' => $compareLabel, '{value}' => $object->$attribute,
)); '{compareValue}' => $compareValue,
)));
return " return 'yii.validation.compare(value, messages, ' . json_encode($options) . ');';
if (" . ($this->skipOnEmpty ? "$.trim(value)!='' && " : '') . $condition . ") {
messages.push(" . json_encode($message) . ");
}
";
} }
} }
...@@ -76,10 +76,11 @@ abstract class Validator extends Component ...@@ -76,10 +76,11 @@ abstract class Validator extends Component
*/ */
public $attributes; public $attributes;
/** /**
* @var string the user-defined error message. Error message may contain some placeholders * @var string the user-defined error message. It may contain the following placeholders which
* that will be replaced with the actual values by the validator. * will be replaced accordingly by the validator:
* The `{attribute}` and `{value}` are placeholders supported by all validators. *
* They will be replaced with the attribute label and value, respectively. * - `{attribute}`: the label of the attribute being validated
* - `{value}`: the value of the attribute being validated
*/ */
public $message; public $message;
/** /**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment