diff --git a/framework/assets/yii.validation.js b/framework/assets/yii.validation.js index 83e0497..0865237 100644 --- a/framework/assets/yii.validation.js +++ b/framework/assets/yii.validation.js @@ -30,6 +30,47 @@ yii.validation = (function ($) { 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) { if (options.skipOnEmpty && isEmpty(value)) { return; diff --git a/framework/validators/BooleanValidator.php b/framework/validators/BooleanValidator.php index dd72c67..1420739 100644 --- a/framework/validators/BooleanValidator.php +++ b/framework/validators/BooleanValidator.php @@ -83,7 +83,7 @@ class BooleanValidator extends Validator */ public function clientValidateAttribute($object, $attribute) { - $options['message'] = array( + $options = array( 'trueValue' => $this->trueValue, 'falseValue' => $this->falseValue, 'message' => Html::encode(strtr($this->message, array( diff --git a/framework/validators/CompareValidator.php b/framework/validators/CompareValidator.php index 1df09c4..720ab56 100644 --- a/framework/validators/CompareValidator.php +++ b/framework/validators/CompareValidator.php @@ -9,6 +9,7 @@ namespace yii\validators; use Yii; use yii\base\InvalidConfigException; +use yii\helpers\Html; /** * CompareValidator compares the specified attribute value with another value and validates if they are equal. @@ -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. */ 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 */ public function clientValidateAttribute($object, $attribute) { + $options = array('operator' => $this->operator); + if ($this->compareValue !== null) { - $compareLabel = $this->compareValue; - $compareValue = json_encode($this->compareValue); + $options['compareValue'] = $this->compareValue; + $compareValue = $this->compareValue; } else { $compareAttribute = $this->compareAttribute === null ? $attribute . '_repeat' : $this->compareAttribute; - $compareValue = "\$('#" . (CHtml::activeId($object, $compareAttribute)) . "').val()"; - $compareLabel = $object->getAttributeLabel($compareAttribute); + $compareValue = $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), - '{compareValue}' => $compareLabel, - )); + '{value}' => $object->$attribute, + '{compareValue}' => $compareValue, + ))); - return " -if (" . ($this->skipOnEmpty ? "$.trim(value)!='' && " : '') . $condition . ") { - messages.push(" . json_encode($message) . "); -} -"; + return 'yii.validation.compare(value, messages, ' . json_encode($options) . ');'; } } diff --git a/framework/validators/Validator.php b/framework/validators/Validator.php index 22da00a..2460081 100644 --- a/framework/validators/Validator.php +++ b/framework/validators/Validator.php @@ -76,10 +76,11 @@ abstract class Validator extends Component */ public $attributes; /** - * @var string the user-defined error message. Error message may contain some placeholders - * that will be replaced with the actual values by the validator. - * The `{attribute}` and `{value}` are placeholders supported by all validators. - * They will be replaced with the attribute label and value, respectively. + * @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 */ public $message; /**