Рассылка по расписанию
Последнее занятие будет самым коротким. Неожиданно обнаружилось, что мы уже всё сделали, и осталось только добавить скрипт отправки писем по расписанию.
На всякий случай напоминаю алгоритм работы компонента:
-
Создаём рассылку и указываём ей свойства. Обязательно указать шаблон или сниппет.
-
Добавляем пользователей (или они добавляются самостоятельно, через сайт)
-
На странице очереди писем добавляем новые, путем выбора рассылки. В зависимости от того, что в ней указано, текст письма генерируется сниппетом или шаблоном.
-
Отправляем письма. Можно вручную, из админки, или скриптом, по расписанию.
Всё, кроме скрипта мы уже сделали.
Отправка писем по расписанию
Учитывая, что все необходимое у нас уже прописано в классе sxQueue, нужно только подключить модель компонента, выбрать записи и вызвать метод send().
<?php
// Это для вызова из директории разработки
if (file_exists(dirname(dirname(dirname(dirname(dirname(__FILE__))))) . '/config.core.php')) {
require_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . '/config.core.php';
}
else {
require_once dirname(dirname(dirname(dirname(dirname(dirname(__FILE__)))))) . '/config.core.php';
}
// Получаем конфиг и вызываем MODX
require_once MODX_CORE_PATH . 'config/' . MODX_CONFIG_KEY . '.inc.php';
require_once MODX_CONNECTORS_PATH . 'index.php';
// Добавляем модель
$modx->addPackage('sendex', MODX_CORE_PATH . 'components/sendex/model/');
// Выбираем 100 писем
$q = $modx->newQuery('sxQueue');
$q->limit($modx->getOption('sendex_queue_limit', null, 100, true));
// Отправляем
$queue = $modx->getCollection('sxQueue');
/** @var sxQueue $email */
foreach ($queue as $email) {
$email->send();
}
После отправки письмо удаляется, так что скрипт можно запускать хоть через каждые 2 минуты - нагрузки он не создаст.
Я добавил этот файл в /core/components/sendex/cron/send.php, чтобы его нельзя было вызвать из браузера. Зачем давать возможность непонятно кому отправлять ваши письма?
Добавить в cron его можно или вручную (см. документацию к своему хостингу). Обычно нужно зайти на сервер через SSH и набрать crontab -e и в редакторе добавить:
*/2 * * * * php /var/www/site/www/core/components/sendex/cron/send.php
Сервер будет дергать файл каждые 2 минуты, и все рассылки улетят мгновенно. На лабораторном тарифе MODXCloud я не смог зайти в SSH, наверное отключено.
В принципе, вот и всё последнее занятие, но добавйте еще пройдёмся по теме добавления писем в очередь через API.
Добавление писем через API
Не знаю, как сделано в других решениях, но я не представляю, как можно автоматизировать добавление писем в рассылку.
Ведь может быть огромное количество ситуаций и условий. Рассылка новых тикетов из раздела вопросы, или новостей с шаблоном 5 из родителя 13 - это все не нарисуешь в интерфейсе.
Поэтому, автоматическое добавление писем в рассылку мы оставляем на совести разработчика сайта. Мы ему уже все подготовили:
-
Создать сниппет или шаблон, который будет формировать тело письма
-
Создать рассылку и указать сниппет или шаблон
-
Получить объект sxNewsletter и вызвать метод addQueues
То есть, все очень просто.
На всякий случай вот код:
$modx->addPackage('sendex', MODX_CORE_PATH . 'components/sendex/model/');
/** @var sxNewsletter $newsletter */
if ($newsletter = $modx->getObject('sxNewsletter', array('name' => 'Рассылка новостей'))) {
$newsletter->addQueues();
}
Можно вызывать этот код при публикации новых страниц, по расписанию или еще как то. В своем сниппете или шаблоне вы можете выбирать любые документы и по любым условиям. Вообще, можно набивать рассылки какой угодно информацией.
Я считаю, это достаточно перспективная разработка, которую будет легко и приятно использовать. Тем более, мы написали всё, чтобы управлять рассылками вручную.
Заключение
На этом наш курс занятий заканчивается.
Задавайте вопросы, будем обсуждать непонятности. В ближайшее время я постараюсь просмотреть код, возможно немного доработать логику и выложить уже в репозиторий.
За всеми изменениями можно следить на GitHub.
На всякий случай оставляю доступ к моему сайту разработки:
Manager: http://c2263.paas2.ams.modxcloud.com/manager/
Login: admin
Password: adminadmin
0
👍
👎
❤️
🔥
😮
😢
😀
😡
2 502
17.12.2013, 11:14:14
10 комментариев
Александр Наумов
14.01.2014, 01:07:34
Курс замечательный, правда глубоко не углублялся пока, но это дело времени. Единственно что бы еще хотелось узнать по данной теме, это то, как проектировать плейсхолдеры. Может быть кто-нибудь знает материалы на эту тему?
Василий Наумкин
14.01.2014, 01:39:10
Плейсхолдер, это буквально "держатель места". То есть, это какой-то набор символов чанке, который будет заменен значением при работе.
Например, есть чанк
И ты выводишь его на странице
Выйдет
Плейсхолдеры нужны для разделения логики и представления, то есть PHP и HTML. Что ты хочешь вывести из PHP - то и задаёшь в чанке, а потом меняешь. Вот смотри, свежая дока по этой теме.
Александр Наумов
14.01.2014, 01:43:21
Василий, спасибо за наводку!
Roman Smile
07.04.2014, 05:02:10
В курсе мы не взаимодействовали с формами ресурсов. Но вот, например, нам нужно при редактировании обычного ресурса иметь обычный textfield, но с автокомплитом из некой таблицы в БД. Как реализовать такой текстфилд в компоненте понятно, но как это впихнуть в форму редактирования ресурса?
Василий Наумкин
07.04.2014, 17:13:31
Только плагином на загрузку страницы админки. Так можно зарегистрировать свой javascript, который заменит стандартный textfield.
Roman Smile
16.04.2014, 13:15:58
Ок, удалось успешно подключить вот так:
Еще вопрос. Как из этого подключенного js повесить функцию на удаление какого-нибудь ресурса через контекстное меню? Ну, когда мы в дереве ресурсов жмем правой кнопкой на документ и выбираем "Удалить".
Roman Smile
16.04.2014, 14:38:46
Или, возможно, посоветуете другой вариант решения следующей задачи. Когда документ меняется пользователем, то нужно делать разные проверки и затем, если необходимо, давать изменяющему документ пользователю окно с сообщением. Это можно реализовать с помощью плагина на OnBeforeDocFormSave:
Но это работает только когда юзер открыл форму редактирования документа сохраняет его оттуда. Но документ может изменяться и с помощью того самого контекстного меню "Удалить" или "Снять с публикации". Нужно как-то сделать возможным делать проверки и выдавать модальные окна, когда пользователь не только редактирует документ с помощью формы, но и жмакает в этом контекстном меню. Вот, пока только представляется вариант отправлять отдельный AJAX-запрос, когда юзер тыкает в "Удалить" или "Снять с публикации". Вопрос в том, как изящно повесить функцию на это событие, получив при этом id документа, которому вызвали контекстное меню.
Василий Наумкин
16.04.2014, 15:24:28
Не могу ничего посоветовать, придётся копать исходники самостоятельно.
Roman Smile
19.04.2014, 00:26:19
Вопрос по добавлению своей иконки для своего CRC. Например, в Тикетс для TicketsSection добавление происходит через заданный класс .icon-ticketssection, я нашел его в css: https://github.com/bezumkin/Tickets/search?q=icon-ticketssection&ref=cmdform
А на каком этапе этот класс .icon-ticketssection присваивается узлу в дереве ресурсов?
Василий Наумкин
19.04.2014, 00:39:21
Это делает сам MODX - добавляет класс к иконке.
bezumkin.ru
Личный сайт Василия Наумкина
Прямой эфир
Василий Наумкин
23.12.2024, 05:33:00
В MODX сначала создали проблему, автоматически генерируя адреса, а потом "решили" заморозкой.
Так ч...
Дмитрий
14.12.2024, 09:10:38
Василий, прошу прощения, тупанул, не разобрался сразу. Фреймворк отличный! "Чистый лист" на vue, рис...
Василий Наумкин
05.12.2024, 20:01:14
В итоге основная ошибка была в неправильном общем root в Nginx, из-за чего запросы не улетали на фай...
Василий Наумкин
01.07.2024, 11:56:41
Да, верно, именно так.
А в контроллере, скорее всего, ловить данные методом post.
Василий Наумкин
26.06.2024, 09:38:15
О, точно, вылезает если не залогинен.
Спасибо, исправил!
Василий Наумкин
09.04.2024, 04:45:01
> Ошибка 500
Это не похоже на ошибку Nginx, это скорее всего ошибка PHP - надо смотреть его логи.
...
Уровни подписки
Спасибо!
500 ₽ в месяц
Эта подписка ничего не даёт, просто возможность сказать спасибо за мои заметки. Подписчики отмечаются зелёненьким цветом в комментариях.
Большое спасибо!
1 000 ₽ в месяц
И эта подписка не даёт ничего, кроме оранжевого цвета в комментариях и возможности сказать спасибо, но уже большое!