Использование email шаблонов в Joomla 4 или MailTemplate()
В J4 появился интересный компонент позволяющий подключать шаблоны писем и редактировать их. Я скопипащу тут материал из сети по этому компоненту со своими комментариями.
Переопределение шаблона электронной почты Joomla 4 дает возможность использовать дополнительные настраиваемые поля, вложения и другие параметры, которые были недоступны в версиях Joomla 3.
Пользователи Joomla 4 могут полностью контролировать содержание электронных писем, отправляемых со своих веб-сайтов. Все это возможно с новым расширением com_mails.
Шаблоны писем
Новый компонент com_mails был добавлен как функция Joomla 4. Он используется для настройки шаблонов электронной почты отправляемых пользователям, которые служат для различных действий, включая контактную форму, регистрацию, сброс пароля Joomla, напоминание и многое другое.
Войдите в административную панель Joomla 4. В левом меню нажмите «Система», а затем выберите «Почтовые шаблоны».
Каждый шаблон электронного письма можно легко создать и настроить под разные темы. Несколько шаблонов электронной почты основаны на пяти основных компонентах:
- Диспетчер конфигурации
- Контакты
- Пользователи
- Система - Joomla! Уведомления об обновлениях
- Пользователь - Joomla!
Типы
Существует восемь различных типов настроек шаблона электронной почты (каждый компонент имеет свои типы). Различные типы шаблонов электронной почты:
Тестовое письмо (глобальная конфигурация)
Отправляется при нажатии кнопки «Отправить тестовое письмо» в глобальной конфигурации. Он отправляется на адрес отправителя, указанный в настройках почты (администратор может проверить, правильно ли работает функция электронной почты).
Контактная форма Почта (Контакты)
Этот шаблон электронного письма с содержанием электронного письма «Контактная форма» (пользователи веб-сайтов отправляют письмо с контактным запросом).
Контактная форма Mail Copy (Контакты)
Этот шаблон отправляется отправителю почты вместе с контактной формой, только если опция «Отправить копию отправителю» включена и выбрана.
Пользователи массовой рассылки (пользователи)
«Массовые пользователи почты» шаблон сообщения электронной почты, с содержанием посланного для всех пользователей сайта.
Сброс пароля (пользователи)
Отправляется пользователю по ссылке «Забыли пароль?» С запросом на сброс пароля.
Напоминание имени пользователя (пользователи)
Отправляется пользователю по ссылке с запросом на напоминание имени пользователя «Забыли имя пользователя?».
Новые пользователи (пользователи)
Отправлено новому пользователю, зарегистрированному на сайте.
Joomla: Уведомление об обновлении (Система - Уведомление об обновлении Joomla!)
Отправляется администраторам веб-сайта, когда системный плагин «Уведомление об обновлении Joomla!» Обнаруживает обновление. Для этого должен быть включен плагин уведомления об обновлении.
Как это могут использовать разработчики приложений
Для подключения используйте следующее:
use Joomla\CMS\Mail\MailTemplate;
Это пример из плагина Joomla 4
$mailer = new MailTemplate('plg_user_joomla.mail', $userLocale); $mailer->addTemplateData($data); $mailer->addRecipient($user['email'], $user['name']); $mailer->send();
Вот более развесистый вариант использования - метод модели компонента отправляющий письмо пользователю в случае изменения учетных данных аккаунта.
/* * Отправка писма абоненту в случае смены логина или пароля */ private function sendMail($user,$data) { $defaultLanguage = JFactory::getLanguage(); $defaultLocale = $defaultLanguage->getTag(); $userParams = new JRegistry($user->params); $userLocale = $userParams->get('language', $userParams->get('admin_language', $defaultLocale)); // Сбор данных для отправки почты $templdata = [ 'name' => $user->name, 'sitename' => $this->app->get('sitename'), 'url' => JUri::root(), 'username' => $user->username, 'password' => isset($data['password'])&&!empty($data['password'])? $data['password']: JText::_('COM_CABINET_SUBSCRIBERS_NOT_CHANGE_PASSWORD') ]; $mailer = new MailTemplate('com_cabinet.mailChangingUserSettings', $userLocale); $mailer->addTemplateData($templdata); $mailer->addRecipient($user->email, $user->name); try { if ($mailer->send() === false) { $this->app->enqueueMessage(JText::_('JERROR_SENDING_EMAIL'), 'warning'); } } catch (\Exception $exception) { $this->app->enqueueMessage( JText::_($exception->errorMessage()), 'warning' ); } }
Другие функции MailTemplate()
Добавить вложение в почту
addAttachment($name, $file)
Добавляет получателей для этой почты
addRecipient($mail, $name = null, $type = 'to')
Установить адрес ответа на это письмо
setReplyTo($mail, $name = '')
Добавление данных для замены в шаблоне
addTemplateData($data)
Рендеринг и отправка почты
send()
Заменить теги на указанные значения
replaceTags($text, $tags)
Получите определенный шаблон
getTemplate($key, $language)
Вставьте новый шаблон почты в систему
createTemplate($key, $subject, $body, $tags, $htmlbody = '')
Этот метод имеет косяк - при сохранении записи в таблицу '#__mail_templates' там забыли добавить привязку шаблона к компоненту, (поле 'extension') а без нее запись не подключается к списку шаблонов в компоненте. Там по этому полю происходит фильтрация - показываются только те шаблоны, которые привязаны к активным расширениям.
Поэтому надо создать дочерний класс к MailTemplate, где переопределить этот метод.
public static function createTemplate($key, $subject, $body, $tags, $htmlbody = '') { $db = Factory::getDbo(); $template = new \stdClass; $template->template_id = $key; // вот это поле в оригинальном методе отсутствует $template->extension = explode('.', $key)[0]; $template->language = ''; $template->subject = $subject; $template->body = $body; $template->htmlbody = $htmlbody; $template->attachments = ''; $params = new \stdClass; $params->tags = array($tags); $template->params = json_encode($params); return $db->insertObject('#__mail_templates', $template); }
Где:
$key - идентификатор формы шаблона имеет формат идентификатор-расширения.еще-что-то где разделитель - точка (.)
$tags - простой массив с перчислением тегов. Теги это индесы массива агружаемого методом addTemplateData Эти значения подставляются в языковые константы вашего расширения например элемент с индексом (а так же тегом) 'username' подставляется вместо {USERNAME} в языковых константах.
$subject, $body, $htmlbody - соответствующие языковые константы вашего расширения. Например:
COM_CABINET_SUBSCRIBERS_CHANGE_USER_EMAIL_BODY="Здравствуйте, {NAME}.\n\nИнформируем вас о том, что на сайте \"{SITENAME}\" параметры вашей учетной записи были изменены.\n\nТеперь вы можете войти на сайт по адресу {URL}, используя логин и пароль, которые представлены ниже.\n\nЛогин: {USERNAME}\nПароль: {PASSWORD}"
COM_CABINET_SUBSCRIBERS_CHANGE_USER_EMAIL_HTMLBODY=""
COM_CABINET_SUBSCRIBERS_CHANGE_USER_EMAIL_SUBJECT="Параметры учетной записи изменены"
COM_CABINET_MAIL_MAILCHANGINGUSERSETTINGS_TITLE="Параметры учетной записи абонента изменены"
COM_CABINET_MAIL_MAILCHANGINGUSERSETTINGS_DESC="Отправка писма с информацией в случае изменения параметров входа абонента в личный кабинет."
Последние 2 языковые константы определяют название и пояснения при выводе вашей формы в списке шаблонов. Они генерируются на лету из идентификатора вашего шаблона путем замены точки-разделителя на _MAIL_ и добавления окончаний соответственно _TITLE и _DESC.
Другой вариант - вместо метода createTemplate можно непоследственно создать нужную запись в таблице '#__mail_templates' использовав соответствующий sql в установочных файлах вашего компонента.
В install.mysql.sql
INSERT INTO `#__mail_templates` ( `template_id`, `extension`, `language`, `subject`, `body`, `htmlbody`, `attachments`, `params` ) VALUES ( 'com_cabinet.mailChangingUserSettings', 'com_cabinet', '', 'COM_CABINET_SUBSCRIBERS_CHANGE_USER_EMAIL_SUBJECT', 'COM_CABINET_SUBSCRIBERS_CHANGE_USER_EMAIL_BODY', 'COM_CABINET_SUBSCRIBERS_CHANGE_USER_EMAIL_HTMLBODY', '', '{\"tags\": [\"name\", \"sitename\", \"url\", \"username\", \"password\"]}' );
И в uninstall.mysql.sql
DELETE FROM `#__mail_templates` WHERE `extension`='com_cabinet';
Продолжаем перечислять методы класса MailTemplate:
Обновление существующего шаблона почты
updateTemplate($key, $subject, $body, $tags, $htmlbody = '')
Удаление шаблона почты
deleteTemplate($key)