Проблема с валидацией файлов. Кастомный валидатор не отрабатывает на $model->validate()

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
lostdok
Сообщения: 48
Зарегистрирован: 2016.09.05, 18:23

Проблема с валидацией файлов. Кастомный валидатор не отрабатывает на $model->validate()

Сообщение lostdok »

Проблема следующая. У меня есть 8 input type file.

http://dl3.joxi.net/drive/2018/12/12/00 ... e024c0.jpg

Мне надо сделать валидацию: если хоть один файл в любом из инпутов указан, то модель валидна.

Контроллер (указываю только то, что имеет отношение к проблеме):

Код: Выделить всё

public function actionIndex()
 {
        $galleryForm = new GalleryForm();
	$galleryForm->load(Yii::$app->request->post())
        $images = $galleryForm->upload();
        
        // другой код......


    return $this->render('index', [
    	//...
        'galleryForm' => $galleryForm,
    ]);
  }

Модель (указываю только то, что имеет отношение к проблеме):

Код: Выделить всё

class GalleryForm extends Model
{
  const FILE_DIR = 'bulletin/gallery';
  
  public $images;

  public function rules()
  {
    return [
      [['images'], 'validateImages']
    ];
  }

// Проблема в том, что вот этот валидатор не запускается, хотя определен в rules
  public function validateImages($attribute, $params) {
    if($this->images === null || count($this->images) === 0) {
      $this->addError($attribute, 'Загрузите фото');
    }
  }
  
  /**
   * @return bool|int[]
   */
  public function upload()
  {
    $this->images = UploadedFile::getInstances($this, 'images'); // если это убрать, то валидатор "validateImages" отрабатывает
    if ($this->validate(['images'])) { // валидация здесь проходит успешно
      if(empty($this->images)) {
        return true;
      }
      return \Yii::$app->filestorage->multipleUploadFromModel($this, 'images', self::FILE_DIR);
    }
    return false;
  }
}
Вид (указываю только то, что имеет отношение к проблеме):

Код: Выделить всё

<?php for ($i = 1; $i < 9; $i++) : ?>
  <label class="b-field-img__item-empty" id="images_<?= $i ?>">
  <?= $form->field($galleryForm, 'images[]')->label(false)->fileInput([
    'id' => 'image_input_' . $i,
    'class' => 'b-field-img__input'
  ]) ?>
</label>
<?php endfor; ?>

Получается у меня в контроллере запускается метод $galleryForm->upload().
Внутри этого метода в $this->images присваивается UploadedFile. После чего запускается валидация поля images.
Я ожидаю, что при этом мой метод validateImages] будет запущен. Но он не отрабатывает.

Что я делаю не так?


P.S. Если в модели в методе upload убрать строку

Код: Выделить всё

$this->images = UploadedFile::getInstances($this, 'images');
, валидация отработает.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Проблема с валидацией файлов. Кастомный валидатор не отрабатывает на $model->validate()

Сообщение andku83 »

Код: Выделить всё

[['images'], 'validateImages', 'skipOnEmpty' => false],
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Проблема с валидацией файлов. Кастомный валидатор не отрабатывает на $model->validate()

Сообщение SiZE »

Проблема в том что UploadedFile::getInstances($this, 'images') возвращает массив, в котором 8 пустых инпутов
lostdok
Сообщения: 48
Зарегистрирован: 2016.09.05, 18:23

Re: Проблема с валидацией файлов. Кастомный валидатор не отрабатывает на $model->validate()

Сообщение lostdok »

andku83 писал(а): 2018.12.12, 19:45

Код: Выделить всё

[['images'], 'validateImages', 'skipOnEmpty' => false],
Да! Это решение проблемы. Огромное спасибо!!!

Не знал, что это параметр для ВСЕХ валидаторов. Я думал это только для FileValidator.

Буду более внимательно читать документацию в следующий раз ))
Ответить