yii\validators\EachValidator::validateAttribute PHP Method

validateAttribute() public method

public validateAttribute ( $model, $attribute )
    public function validateAttribute($model, $attribute)
    {
        $value = $model->{$attribute};
        if (!is_array($value)) {
            $this->addError($model, $attribute, $this->message, []);
            return;
        }
        $validator = $this->getValidator($model);
        // ensure model context while validator creation
        $originalErrors = $model->getErrors($attribute);
        $filteredValue = [];
        foreach ($value as $k => $v) {
            $model->{$attribute} = $v;
            if (!$validator->skipOnEmpty || !$validator->isEmpty($v)) {
                $validator->validateAttribute($model, $attribute);
            }
            $filteredValue[$k] = $model->{$attribute};
            if ($model->hasErrors($attribute)) {
                $validationErrors = $model->getErrors($attribute);
                $model->clearErrors($attribute);
                if (!empty($originalErrors)) {
                    $model->addErrors([$attribute => $originalErrors]);
                }
                if ($this->allowMessageFromRule) {
                    $model->addErrors([$attribute => $validationErrors]);
                } else {
                    $this->addError($model, $attribute, $this->message, ['value' => $v]);
                }
                $model->{$attribute} = $value;
                return;
            }
        }
        $model->{$attribute} = $filteredValue;
    }

Usage Example

Beispiel #1
0
 /**
  * @depends testValidate
  */
 public function testAllowMessageFromRule()
 {
     $model = FakedValidationModel::createWithAttributes(['attr_one' => ['text']]);
     $validator = new EachValidator(['rule' => ['integer']]);
     $validator->allowMessageFromRule = true;
     $validator->validateAttribute($model, 'attr_one');
     $this->assertContains('integer', $model->getFirstError('attr_one'));
     $model->clearErrors();
     $validator->allowMessageFromRule = false;
     $validator->validateAttribute($model, 'attr_one');
     $this->assertNotContains('integer', $model->getFirstError('attr_one'));
 }