slo_nik
@slo_nik

Как создать шаблон для письма из записи в БД?

Добрый день.
Необходимо создать письмо из строки, которая хранится в базе данных.
Строка имеет такой вид:
<p><strong>Поступила новая заявка с site.ru.</strong><br />
<br />
<strong>Имя:</strong> {order->name}<br />
<strong>Телефон:</strong> {order->phone}<br />
<strong>Почта:</strong> {order->email}<br />
<strong>Вес:</strong> {order->weight}<br />
<strong>Откуда:</strong> {order->from}<br />
<strong>Куда:</strong> {order->to}<br />
<strong>Дата отправки:</strong> {order->shipping_date}<br />
<strong>Сообщение:</strong> {order->message}</p>

Все вхождения начинающиеся с order->*, необходимо заменить на значения из POST запроса.
Например.
Есть действие в контролере в котором сохраняются данные переданные через форму.
if(Yii::$app->request->isAjax) {

           $model = new Proposal();

           if($model->load(Yii::$app->request->post()) && $model->validate()){
               if($model->save()){

                   /* получаем шаблон письма из базы данных */
                   $template = EmailTemplate::findOne(['name' => 'new_order']);
                   /* в $model записаны данные, которые надо подставить в $template */
                   Yii::$app->mailer->compose()
                       ->setFrom([Yii::$app->params['supportEmail'] => Yii::$app->name])
                       ->setTo(Yii::$app->siteSettings->get('SITE.EMAIL_ADMIN'))
                       ->setSubject('Новая заявка на сайте' . Yii::$app->name)
                       /* подставляю полученную строку в письмо */
                       ->setHtmlBody($template->body)
                       ->send();

                   return 'ok';
               }
           }
       }
       return false;
    }

Как в данном случае заменить подстроки в $template->body на значения из $model?

p.s. Пока что видится такое решение.

При записи шаблона в БД создавать файл, в который писать сам шаблон и использовать его уже как вид
Yii::$app->mailer->compose('@app/mails')
При редактировании шаблона перезаписывать файл вида.
Но тут небольшая сложность. Часть данных в $model может отсутствовать. Наверное надо делать дополнительную проверку, есть ли данная подстрока в строке.

Для первой версии yii есть расширение QsEmailManager, а есть ли что-то похожее для второй версии?
  • Вопрос задан
  • 272 просмотра
Решения вопроса 1
qonand
@qonand
Software Engineer
как самый просто вариант использовать strtr, только ко перед заменой данные из модели необходимо экранировать от html-тегов
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы