Skip to content

Commit ea7bf09

Browse files
committed
event based validation state
1 parent 8f1bdc5 commit ea7bf09

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

src/widgets/form/ActiveField.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -702,6 +702,9 @@ public function weekInput($options = [])
702702
return parent::input('week', $options);
703703
}
704704

705+
/**
706+
* @inheritdoc
707+
*/
705708
public function error($options = [])
706709
{
707710
if ($options === false) {
@@ -714,6 +717,10 @@ public function error($options = [])
714717
return $this;
715718
}
716719

720+
/**
721+
* Returns the JS options for the field.
722+
* @return array the JS options.
723+
*/
717724
protected function getClientOptions()
718725
{
719726
$attribute = Html::getAttributeName($this->attribute);
@@ -767,7 +774,7 @@ protected function getClientOptions()
767774
}
768775

769776
if (!empty($validators)) {
770-
$options['validate'] = new JsExpression("function (attribute, value, messages, deferred, \$form) {" . implode('', $validators) . "$(attribute.container + ' ' + attribute.error).attr('data-error', messages[0]); messages[0] ? $(attribute.input).addClass('{$this->form->errorCssClass}').removeClass('{$this->form->successCssClass}') : $(attribute.input).removeClass('{$this->form->errorCssClass}').addClass('{$this->form->successCssClass}')}");
777+
$options['validate'] = new JsExpression("function (attribute, value, messages, deferred, \$form) {" . implode('', $validators) . "}");
771778
}
772779

773780
if ($this->addAriaAttributes === false) {

src/widgets/form/ActiveForm.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,22 @@ class ActiveForm extends \yii\widgets\ActiveForm
3737
*/
3838
public function init()
3939
{
40+
if (!isset($this->options['id'])) {
41+
$this->options['id'] = $this->getId();
42+
}
43+
44+
if (!isset($this->options['data-success-class'])) {
45+
$this->options['data-success-class'] = $this->successCssClass;
46+
}
47+
48+
if (!isset($this->options['data-error-class'])) {
49+
$this->options['data-error-class'] = $this->errorCssClass;
50+
}
51+
52+
if ($this->enableClientValidation) {
53+
$this->registerAfterValidateHandler();
54+
}
55+
4056
parent::init();
4157
}
4258

@@ -51,4 +67,22 @@ public function field($model, $attribute, $options = [])
5167
{
5268
return parent::field($model, $attribute, $options);
5369
}
70+
71+
/**
72+
* Register the necessary JS handlers to set error messages and validation state indicators.
73+
*/
74+
protected function registerAfterValidateHandler()
75+
{
76+
$view = $this->getView();
77+
$id = $this->options['id'];
78+
79+
$view->registerJs(<<<JS
80+
$('#{$id}').on('afterValidateAttribute', function (evt, attribute, messages) {
81+
var yiiForm = $(this);
82+
$(attribute.container + ' ' + attribute.error).attr('data-error', messages[0]);
83+
messages[0] ? $(attribute.input).addClass(yiiForm.attr('data-error-class')).removeClass(yiiForm.attr('data-success-class')) : $(attribute.input).addClass(yiiForm.attr('data-success-class')).removeClass(yiiForm.attr('data-error-class'));
84+
});
85+
JS
86+
);
87+
}
5488
}

0 commit comments

Comments
 (0)