Changes
Title
unchanged
Yii for beginners 2
Category
unchanged
Tutorials
Yii version
unchanged
1.1
Tags
unchanged
Yii,mvc,tutorial,beginner
Content
changed
[...]
1st = resetScope()
2nd = defaultScope()
3rd = custom scope
Each validator (see Yii2)
------------------------------------
If you need the "each validator" (for validating array of values) which is available in Yii2, you can paste this method to your model and use it as the validator. Do not forget to specify validation rules for the particular values as well! See examples below.
```php
public function each($attribute, $params)
{
$attr = $this->$attribute;
if (!is_array($attr)) {
$attr = [$attr];
}
$validatorName = $params['rule'][0];
$validatorParams = array_slice($params['rule'], 1);
$validatedAttributes = [$attribute];
$model = new self(); // Better would be to create a brand new model dynamically
$validator = CValidator::createValidator($validatorName, $model, $validatedAttributes, $validatorParams);
foreach ($attr as $value) {
$model->$attribute = $value;
$validator->validate($model, $validatedAttributes);
foreach ($model->getErrors($attribute) as $e) {
$this->addError($attribute, $e);
}
$model->clearErrors();
}
}
```
Usage is standard:
```php
public function rules()
{
return array(
array('myColumn', 'each', 'rule' => ['validatorName', 'optionalParamA' => 1]),
);
}
```
Where "validatorName" can be either an existing validator class or your custom validation method within your model. No difference here.
```php
public function validatorName($attribute, $params)
{
$val = $this->$attribute;
$paramA = $params['optionalParamA']??'Not set';
$this->addError($attribute, 'An error text');
}
```
This code can also be found in the documentation of [CValidator](https://www.yiiframework.com/doc/api/1.1/CValidator)