Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Отправка писем

Магазин сам отправляет письма о заказах и регистрации. Модуль может отправлять свои — например, сообщать владельцу магазина о новом отзыве. Для этого служит метод Mail::Send(): он берёт шаблон письма, подставляет в него переменные и отправляет через почтовые настройки магазина.

Где лежат шаблоны

Шаблоны писем модуля хранят в папке mails, по подпапке на язык. Каждому письму нужны два файла с одним именем: версия HTML и текстовая. Создайте их вручную:

modules/acmehello/
├── acmehello.php
├── mails/
│   └── en/
│       ├── review_added.html
│       └── review_added.txt
└── ...

Имя подпапки — код языка: en, ru, fr. Папку en держите всегда: если шаблона для языка письма нет, движок возьмёт английский.

Шаблон

<!-- modules/acmehello/mails/en/review_added.html -->
<h2>Новый отзыв</h2>
<p>Товар: {product}</p>
<p>Автор: {author}</p>
<p>Оценка: {rating} из 5</p>
Новый отзыв
 
Товар: {product}
Автор: {author}
Оценка: {rating} из 5

Второй блок — содержимое файла review_added.txt. Шаблон письма — не Smarty: в нём нет условий и циклов, только метки в фигурных скобках, которые заменяются значениями.

Отправка

// modules/acmehello/acmehello.php
private function notifyAboutReview(string $productName, string $author, int $rating): bool
{
    return (bool) Mail::Send(
        (int) $this->context->language->id,
        'review_added',
        $this->trans('Новый отзыв о товаре', [], 'Modules.Acmehello.Admin'),
        [
            '{product}' => $productName,
            '{author}' => $author,
            '{rating}' => $rating,
        ],
        Configuration::get('PS_SHOP_EMAIL'),
        null,
        null,
        null,
        null,
        null,
        $this->getLocalPath() . 'mails/'
    );
}

Метод отправляет письмо на почту магазина и возвращает true при успехе.

Аргументы Mail::Send

По порядкуЧто передают
1Номер языка: по нему выбирается подпапка шаблона
2Имя шаблона без расширения
3Тема письма
4Массив переменных: ключ — метка вместе со скобками
5Адрес получателя
6Имя получателя
7, 8Адрес и имя отправителя; null — настройки магазина
9Вложение
10Служебный, оставляют null
11Папка шаблонов. Для модуля — его папка mails

Без одиннадцатого аргумента движок ищет шаблон в общей папке mails магазина и не найдёт его. getLocalPath() возвращает путь к папке модуля на диске.

Вызов после сохранения отзыва

// modules/acmehello/acmehello.php, метод addReview
if (!$review->add()) {
    return false;
}
 
$product = new Product($productId, false, $this->context->language->id);
$this->notifyAboutReview($product->name, $author, $rating);
 
return true;

Письмо уходит после того, как отзыв сохранён. Результат отправки на сохранение не влияет: отзыв не должен пропасть из-за неработающей почты.

Как увидеть результат

Отправьте отзыв через форму на странице отзывов и откройте в панели «Расширенные параметры → E-mail». Внизу страницы — журнал отправленных писем: в нём появится строка с шаблоном review_added. На той же странице настраивают способ отправки и отправляют тестовое письмо.

На локальной машине почта обычно не уходит наружу. Удобно указать в настройках SMTP локальный перехватчик писем, например Mailpit: письма будут видны в его окне.

Готовые переменные

Движок сам добавляет в каждое письмо несколько меток.

МеткаЧто подставится
{shop_name}Название магазина
{shop_url}Адрес магазина
{shop_logo}Логотип

Частая ошибка

Создан только файл .html, а .txt забыт. Mail::Send() возвращает false, письмо не уходит, и на экране ошибки нет. Для каждого письма нужны оба файла с одинаковым именем в папке каждого языка.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.