Загрузка файла из формы обратной связи

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Александр Гавриленко
Сообщения: 70
Зарегистрирован: 2017.02.05, 07:46

Загрузка файла из формы обратной связи

Сообщение Александр Гавриленко »

Здравствуйте!
Возвратился опять к загрузке файла из формы обратной связи:
viewtopic.php?f=19&t=44257;
viewtopic.php?f=19&t=44323
Как мне получить сам файл, а не файл с расширение с tmp?

Контроллер:

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

public function actionOneForm()
    {
        $model = new OneForm();
        if ($model->load(Yii::$app->request->post())) {
            $model->file_load = UploadedFile::getInstance($model, 'file_load');//загрузка файла
            //условие при отправке сообщения
            ...
        }

        return $this->render('one-form', compact('model'));
    }
Модель:

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

public function sendEmail($email)
    {
        if ($this->validate()) {
            Yii::$app->mailer->compose()
               ...
                ->attach($this->file_load->tempName)//загружает файл с расширением tmp
                ->send();
            return true;
        } else {
            return false;
        }
    }
Спасибо.
WalpeR
Сообщения: 64
Зарегистрирован: 2016.08.29, 17:21

Re: Загрузка файла из формы обратной связи

Сообщение WalpeR »

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

->attach(
Swift_Attachment::fromPath($this->file_load->tempName))->setFilename($this->file_load->baseName . '.' . $this->file_load->extension)
);
Попробуй так, пишу с телефона, не проверял
Александр Гавриленко
Сообщения: 70
Зарегистрирован: 2017.02.05, 07:46

Re: Загрузка файла из формы обратной связи

Сообщение Александр Гавриленко »

Пишет не определен Swift_Attachment.
Что прописать в пространстве имен?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Загрузка файла из формы обратной связи

Сообщение ElisDN »

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

->attach($this->file_load->tempName, ['fileName' => $this->file_load->baseName . '.' . $this->file_load->extension]);
Александр Гавриленко
Сообщения: 70
Зарегистрирован: 2017.02.05, 07:46

Re: Загрузка файла из формы обратной связи

Сообщение Александр Гавриленко »

ElisDN писал(а): 2017.07.28, 22:07

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

->attach($this->file_load->tempName, ['fileName' => $this->file_load->baseName . '.' . $this->file_load->extension]);
Спасибо огромное.
Пропишу полностью данный вопрос.
Думаю кому нибудь поможет!!!
Александр Гавриленко
Сообщения: 70
Зарегистрирован: 2017.02.05, 07:46

Re: Загрузка файла из формы обратной связи

Сообщение Александр Гавриленко »

И так.
Загрузка файла из формы обратной связи.

Вид:

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

<div class="row">
    <div class="col-lg-5">
       <?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data', 'id' => 'contact-form']]); ?>
            <?= $form->field($model, 'name')->textInput(['autofocus' => true]) ?>
            <?= $form->field($model, 'email') ?>
            <?= $form->field($model, 'phone')->textInput(['placeholder' => "+375(29)348-76-88"]) ?>
            <?= $form->field($model, 'subject') ?>
            <?= $form->field($model, 'body')->textarea(['rows' => 6]) ?>
            <?= $form->field($model, 'file_load')->fileInput() ?>
            <?= Html::submitButton('Submit', ['class' => 'btn btn-primary', 'name' => 'contact-button']) ?>
        <?php ActiveForm::end(); ?>
     </div>
</div>
Контроллер:

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

public function actionOneForm()
    {
        $model = new OneForm();
        if ($model->load(Yii::$app->request->post())) {
            $model->file_load = UploadedFile::getInstance($model, 'file_load');//загрузка файла
            if ($model->sendEmail(Yii::$app->params['adminEmail'])) {
                Yii::$app->session->setFlash('success', 'Спасибо за Ваше письмо. Мы постараемся как можно быстрее Вам ответить!');
                return $this->refresh();
            } else {
                Yii::$app->session->setFlash('error', 'Внимание! Ваше письмо по каким-то причинам не отправлено!!!');
            }
        }

        return $this->render('one-form', compact('model'));
    }
Модель:

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

class OneForm extends Model
{
    public $name;
    public $email;
    public $phone;
    public $subject;
    public $body;
    public $file_load;

    public function rules()
    {
        return [
            [['name', 'email', 'subject', 'body'], 'required'],
            ['email', 'email'],
            ['name', 'string', 'length' => [2, 100]],
            [['name', 'email'], 'trim'],
            ['phone', 'match', 'pattern' => '/\+\d{1,3}\(?\d{1,3}\)\d{1,3}\-\d{2}-\d{2}$/'],
            [['file_load'], 'file'],
        ];
    }


    public function attributeLabels()
    {
        return [
            'name' => 'Имя',
            'email' => 'E-mail',
            'phone' => 'Телефон',
            'subject' => 'Тема',
            'body' => 'Текст',
            'file_load' => 'Файл',
        ];
    }


    public function sendEmail($email)
    {
        if ($this->validate()) {
            Yii::$app->mailer->compose()
                ->setTo($email)
                ->setFrom(['[email protected]' => 'My Company'])
                ->setReplyTo($this->email)
                ->setSubject($this->subject)
                ->setTextBody($this->body)
                ->setHtmlBody(
                    '<h3>Здравствуйте, меня зовут '.$this->name.'</h3>'
                    .$this->body
                    .'<p style="font-weight: bold;">Телефон: ' . $this->phone . '</p>'
                    .'<p style="font-weight: bold;">Почта: ' . $this->email . '</p>'
                )
                ->attach($this->file_load->tempName, ['fileName' => $this->file_load->baseName  .  '.'  .  $this->file_load->extension])
                ->send();
            return true;
        } else {
            return false;
        }
    }
}
Ну и соответственно в config/main.php настраивается 'mailer'
Всем, кто принимал непосредственное участие, огромное спасибо! ;)
WalpeR
Сообщения: 64
Зарегистрирован: 2016.08.29, 17:21

Re: Загрузка файла из формы обратной связи

Сообщение WalpeR »

Письмо может не отправится. send() - @return bool whether this message is sent successfully.

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

public function sendEmail($email)
{
	if (!$this->validate()) {
		return false;
	}
	return Yii::$app->mailer->compose()
		->setTo($email)
		->setFrom(['[email protected]' => 'My Company'])
		->setReplyTo($this->email)
		->setSubject($this->subject)
		->setTextBody($this->body)
		->setHtmlBody(
			'<h3>Здравствуйте, меня зовут '.$this->name.'</h3>'
			.$this->body
			.'<p style="font-weight: bold;">Телефон: ' . $this->phone . '</p>'
			.'<p style="font-weight: bold;">Почта: ' . $this->email . '</p>'
		)
		->attach($this->file_load->tempName, ['fileName' => $this->file_load->baseName  .  '.'  .  $this->file_load->extension])
		->send();
}
Александр Гавриленко
Сообщения: 70
Зарегистрирован: 2017.02.05, 07:46

Re: Загрузка файла из формы обратной связи

Сообщение Александр Гавриленко »

Все таки не до конца выяснил проблему.
Если в форме заполняются все поля и выбран файл, то все отправляется.
А если не выбран файл, то выдает ошибку, что путь к файлу не должен быть пустым.
Как быть?
Аватара пользователя
Йож
Сообщения: 574
Зарегистрирован: 2015.08.26, 03:05

Re: Загрузка файла из формы обратной связи

Сообщение Йож »

Вам нужно аттачить файл, только если он загружен.
Александр Гавриленко
Сообщения: 70
Зарегистрирован: 2017.02.05, 07:46

Re: Загрузка файла из формы обратной связи

Сообщение Александр Гавриленко »

Да, вроде получилось, но код громоздкий

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

public function sendEmail($email)
	{
		if ($this->validate()) {
			if (isset($this->file_load)){//если файл для загрузки не пустой
				Yii::$app->mailer->compose()
					->setTo($email)
					->setFrom(['[email protected]' => $this->nameSite])
					//->setFrom([$this->email => $this->name])
					->setReplyTo([$this->email => $this->name])
					->setSubject($this->subject)
					->setTextBody($this->body)
					->setHtmlBody(
						'<h3>Здравствуйте, меня зовут '. $this->name.'</h3>'
						.$this->body
						.'<p style="font-weight: bold;">Мой телефон: ' . $this->phone . '</p>'
						.'<p style="font-weight: bold;">Моя почта: ' . $this->email . '</p>'
					)
					//загрузка файла
					->attach($this->file_load->tempName, ['fileName' => $this->file_load->baseName . '.' . $this->file_load->extension])
					//добавление заголовка
					->addHeader('Precedence', 'bulk')
					//отправка письма
					->send();
				return true;
			}else {
				Yii::$app->mailer->compose()
					->setTo($email)
					->setFrom(['[email protected]' => $this->nameSite])
					->setReplyTo([$this->email => $this->name])
					->setSubject($this->subject)
					->setTextBody($this->body)
					->setHtmlBody(
						'<h3>Здравствуйте, меня зовут '. $this->name.'</h3>'
						.$this->body
						.'<p style="font-weight: bold;">Мой телефон: ' . $this->phone . '</p>'
						.'<p style="font-weight: bold;">Моя почта: ' . $this->email . '</p>'
					)
					->addHeader('Precedence', 'bulk')
					->send();
				return true;
			}

		} else {
			return false;
		}
WalpeR
Сообщения: 64
Зарегистрирован: 2016.08.29, 17:21

Re: Загрузка файла из формы обратной связи

Сообщение WalpeR »

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

if (!$this->validate()) {
	return false;
}
$message = Yii::$app->mailer->compose()
	->setTo($email)
	->setFrom(['[email protected]' => $this->nameSite])
	->setReplyTo([$this->email => $this->name])
	->setSubject($this->subject)
	->setTextBody($this->body)
	->setHtmlBody(
		'<h3>Здравствуйте, меня зовут '. $this->name.'</h3>'
		.$this->body
		.'<p style="font-weight: bold;">Мой телефон: ' . $this->phone . '</p>'
		.'<p style="font-weight: bold;">Моя почта: ' . $this->email . '</p>'
	)
	->addHeader('Precedence', 'bulk');
	
if($this->file_load) {
	$message->attach($this->file_load->tempName, ['fileName' => $this->file_load->baseName . '.' . $this->file_load->extension])
}
return $message->send();

Александр Гавриленко
Сообщения: 70
Зарегистрирован: 2017.02.05, 07:46

Re: Загрузка файла из формы обратной связи

Сообщение Александр Гавриленко »

Класс. Спасибо.
Только надо подредактировать

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

$message->attach($this->file_load->tempName, ['fileName' => $this->file_load->baseName . '.' . $this->file_load->extension]);
точка с запятой в конце.
Ответить