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');