Использование 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)