@Heckfy325
Начинающий программист. Простите за глупые вопросы

Почему не проходит валидация загрузки картинки, yii2?

Пытаюсь загрузить картинку, но поле не проходит валидацию, говорит "нужно загрузить файл".

Форма:
<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>
<?= $form->field($model, 'passport')->fileinput()->label(false) ?>
<?= Html::submitButton('Отправить') ?>
<?php ActiveForm::end() ?>


Модель:
public function rules()
    {
        return [
            [['passport'], 'file', 'extensions' => 'png, jpg'],
        ];
    }
public function upload(){
        if ($this->validate()){
            $path = 'img/store/' . $this->passport->baseName . '.' . $this->passport->extension;
            $this->passport->saveAs($path);
            return true;
        }else{
            return false;
        }
    }


Контроллер:
public function actionCreate()
    {
        $model = new Clients();

        $model->passport = UploadedFile::getInstance($model, 'passport');
        if($model->passport){
            $model->upload();
        }

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            if ($model->save()) {
                Yii::$app->session->setFlash('success', 'Спасибо, мы получили вашу анкету. В скором времени мы с вами свяжемся.');
            } else {
                Yii::$app->session->setFlash('error', 'Ошибка... Попробуйте еще раз...');
            }
            return $this->refresh();
        }

        return $this->render('create', [
            'model' => $model,
        ]);
    }
  • Вопрос задан
  • 223 просмотра
Пригласить эксперта
Ответы на вопрос 1
slo_nik
@slo_nik Куратор тега Yii
Добрый день.
Попробуйте сделать так:
if ($model->load(Yii::$app->request->post()) && $model->save()) {
       $model->passport = UploadedFile::getInstance($model, 'passport');
        if($model->passport){
            $model->upload();
        }
// остальной код действия.
}

И, если Вы сохраняете модель в строке
if ($model->load(Yii::$app->request->post()) && $model->save()) {

то зачем в этом условии Вы пытаетесь ещё раз сохранить модель?
if ($model->save()) {
                Yii::$app->session->setFlash('success', 'Спасибо, мы получили вашу анкету. В скором времени мы с вами свяжемся.');


p.s.
Этот path должен указывать на директорию web
$path = 'img/store/' . $this->passport->baseName . '.' . $this->passport->extension;

Думаю, что тут лучше использовать псевдонимы, что-то типа этого
$path = Yii::getAlias('@web') . 'img/store/' . $this->passport->baseName . '.' . $this->passport->extension;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы