Как правильно совместить валидацию двух моделей в одном экшене?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
nihaha
Сообщения: 95
Зарегистрирован: 2017.02.12, 13:30

Как правильно совместить валидацию двух моделей в одном экшене?

Сообщение nihaha »

Есть основная модель Deficit и CRUD вокруг нее. Также, есть дополнительная модель Photos для обработки и валидации фоток. К модели Photos я добавил поведение для работы с фото (нарезка тамбов, сохранение).

В основной модели я добавил виртуальное поле $photos и в форме загружаю фотки так:

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

<?= $form->field($model->photos, 'file[]')->fileInput(['multiple' => true, 'accept' => 'image/*']); ?>
И теперь в контроллере мне нужно как-то, помимо валидации основной модели, в цикле провалидировать мои файлы (в цикле, потому что поведение умеет работать только с одной фоткой)

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

public function actionCreate()
{
    $deficit = new Deficit();
    $deficit->photos = new Photos();

    if ($deficit->load(Yii::$app->request->post()) && $deficit->save()){
        /* Вот тут нужно заполнить модель Photos данными и провалидировать ее*/
    
        return $this->redirect(['index']);
    }

    return $this->render('create', [
        'model' => $deficit,
    ]);
}
В $_FILES['Photo'] файлы есть, я просто не знаю как мне каждый файл отправить в модель Photo на обработку.
Или может стоит вовсе другим путем решать такую задачу?
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Как правильно совместить валидацию двух моделей в одном экшене?

Сообщение futbolim »

Создать Model, которая всё обработает
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Как правильно совместить валидацию двух моделей в одном экшене?

Сообщение Nex-Otaku »

Пример.

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

$filesUploaded = UploadedFile::getInstances($deficit, 'photos');
foreach ($filesUploaded as $file) {
    $fileName = $file->getBaseName() . "." . $file->getExtension();
    $filePath = "/home/www/my-site/my-files/{$fileName}";
    $file->saveAs($filePath);
    $photosModel = new Photos();
    $photosModel->fileName = $fileName;
    $photosModel->save();
}
Код изучить, переделать под себя, добавить обработку ошибок.
Аватара пользователя
nihaha
Сообщения: 95
Зарегистрирован: 2017.02.12, 13:30

Re: Как правильно совместить валидацию двух моделей в одном экшене?

Сообщение nihaha »

Nex-Otaku, спасибо, я уже сделал и получилось примерно так же, как и у тебя, только я логику присваивания файла и ID записи вынес в отдельный метод внутри Photos.
Ответить