Yii for beginners 2

Comparing #40 with #41

Revision #41 was created by rackycz rackycz on Mar 17, 2022, 10:43:17 AM.

Each validator

Content

[...]
1st = resetScope()

2nd = defaultScope()

3rd = custom scope

 
 
17. Each validator (see Yii2)
 
------------------------------------
 
 
If you need the "each validator" (for validating array of values) which is available in Yii2, you 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');
 
}
 
```