Isolution666
@Isolution666
Full-Stack Developer

Не работает отправка файла на Yii2 Basic, что не так?

вот контроллер:
public function actionIndex() {
        $page = Indexpage::find()->one();
        
        $model = new UploadForm();
            if ($model->load(Yii::$app->request->post()) && $model->upload(Yii::$app->params['adminEmail'])) {
                $model->imageFile = UploadedFile::getInstance($model, 'imageFile');
                Yii::$app->session->setFlash('contactFormSubmitted');
                $email  = new Zakaz();
                $email-> attributes = $model->attributes;
                if(!$email->save()){
                    throw new \yii\web\HttpException(500, 'Невозможно сохранить');
                }
                return $this->refresh();
            } 

        return $this->render('index', [
            'page' => $page,
            'model' => $model,
            ]);
    }


вот модель:
<?php
    namespace app\models;
    
    use Yii;
    use yii\base\Model;

class UploadForm extends Model {
    
    public static function tableName() {
        return '1038_zakaz';
    } 

    public $id;
    public $fio;
    public $email;
    public $phone;
    public $city;
    public $sfera;
    public $words;  
    public $imageFile;
    public $data;

    public function rules()
    {
        return [
            [['fio', 'email', 'phone', 'city', 'sfera', 'words', 'data'], 'required'],
            ['email', 'email'],
            [['imageFile'], 'file', 'skipOnEmpty' => false, 'extensions' => 'txt, pdf, png, gif, doc, docx, xlsx, jpg'],
        ];
    }
    
    public function attributeLabels() {
            return [
                //'id' => '',
                'fio' => 'Укажите вашу фамилию имя отчество',
                'email' => 'Укажите ваш электронный адрес',
                'phone' => 'Укажите ваш номер телефона',
                'city' => 'Укажите ваш город',
                'sfera' => 'Выберите услугу',
                'words' => 'Напишите ваше сообщение',
                'imageFile'  => 'Прикрепите файл', 
                'data' => '',
            ];
    }    
    
    public function upload($email) {
        if ($this->validate()) {
            $this->imageFile->saveAs('ru/img/' . $this->imageFile->baseName . '.' . $this->imageFile->extension);
            Yii::$app->mailer->compose()
                ->setTo($email)
                ->setFrom([$this->email => $this->fio])
                ->setSubject('Новый заказ')
                ->setHtmlBody('
                    <p>ФИО Заказчика: '.$this->fio.'</p>
                    <p>E-mail: '.$this->email.' </p>
                    <p>Телефон: '.$this->phone.' </p>
                    <p>Город: '.$this->city.' </p>
                    <p>Услуга: '.$this->sfera.' </p>
                    <p>'.$this->words.'</p>
                        <hr/> 
                    <i>Дата получения: '.$this->data.'</i>
                              ')
                ->send();

            return true;
        }
        return false;
    }    
}


вот вьюшка:
<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>
            <?= $form->field($model, 'fio')->textInput(['placeholder' => 'Ваше Ф.И.О.'])->label('') ?>
	    <?= $form->field($model, 'email')->widget(MaskedInput::className(), ['clientOptions' => ['alias' =>  'email'],])->textInput(['placeholder' => 'ваше email'])->label('') ?>  
	    <?= $form->field($model, 'phone')->widget(MaskedInput::className(), ['mask' => '+7(999) 99-99-999'])->textInput(['placeholder' => 'ваш телефон'])->label('') ?> 
	    
            <?php $city = City::find()->orderBy(['c_header' => SORT_ASC,])->all();?> 
            <?php $sc = ['prompt' => 'Ваш город'];?>
            <?php $select = ArrayHelper::map($city, 'c_header', 'c_header')?> 
            <?= $form->field($model, 'city')->dropDownList($select, $sc)->label('') ?> 

            <?php $servis = Servis::find()->all();?>
            <?php $params = ['prompt' => 'Выберите услугу...'];?>
            <?php $itds = ArrayHelper::map($servis,'s_header','s_header'); ?> 
            <?= $form->field($model, 'sfera')->dropDownList($itds,$params)->label('')  ?>

      
            <?= $form->field($model, 'words')->textarea(['rows' => 4])->label('') ?>
            <?= $form->field($model, 'imageFile')->fileInput()->label('') ?>
            
            <?= $form->field($model, 'data')->hiddenInput(['value' => date("d.m.Y в H:i:s")])->label('') ?>
      

      <div class="row"> 
          <div class="col-lg-9">
<?= Html::submitButton('<i class="ionicons ion-paper-airplane"></i> ОТПРАВИТЬ', ['class' => 'btn btn-warning gif', 'style' => 'width:100%;', 'name' => 'contact-button']) ?>
          </div>
          <div class="col-lg-3">
    <button class="btn btn-primary" data-dismiss="modal" aria-hidden="true">
        <i class="ionicons ion-close"></i> закрыть
    </button>  
          </div>
      </div>
      
        <?php ActiveForm::end() ?>


Всё работает, если закомментировать переменную imageFile, валидация работает, отправляет и в БД и на почту.

Вопрос: что я не так сделал? Почему не отправляется файл? Потому что без него - всё работает и отправляется. Подскажите в чём ошибка. Заранее благодарю.
  • Вопрос задан
  • 446 просмотров
Решения вопроса 1
qonand
@qonand
Software Engineer
Первое что бросается в глаза: в контроллере Вы сначала вызываете $model->upload - который сохраняет файл с атрибута imageFile на жесткий диск, а лишь потом этому этому атрибуту присваиваете файл $model->imageFile = UploadedFile::getInstance($model, 'imageFile'); А нужно наоборот...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Skrolea
Ну какие то ошибки должны быть?
Ответ написан
Ваш ответ на вопрос

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

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