В 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)