You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Bug] Письмо о заказе разбирает MODX-теги из комментария покупателя #888
Текст письма сначала собирается Fenom-чанкером вместе с полями заказа, включая комментарий адреса. Затем EmailChannel прогоняет уже готовое HTML через парсер тегов MODX, в том числе некэшируемые.
Комментарий покупателя попадает в тело до этого прохода. Теги из комментария исполняются на сервере при отправке письма менеджеру, а не остаются текстом.
Штатный чанк tpl.msEmail.new.manager выводит комментарий адреса без экранирования.
Шаги воспроизведения
Включить письмо менеджеру при смене статуса, канал email, шаблон tpl.msEmail.new.manager.
Оформить заказ и в комментарий адреса вписать некэшируемый тег MODX.
Сменить статус так, чтобы письмо ушло.
Открыть исходник письма.
Ожидаемое поведение
В письме комментарий как обычный текст. Теги из полей заказа не исполняются. Если чанку нужны свои теги MODX, они разбираются до подстановки данных покупателя.
Второй вызов с флагом некэшируемых тегов идёт по строке, куда Fenom уже вставил {\$address.comment}.
Скриншоты
Не требуются.
Окружение
MiniShop3: 1.14.1-beta2
MODX: 3.x
PHP: 8.2+
MySQL: не зависит
Браузер: не зависит
Логи ошибок
Логи из core/cache/logs/error.log
Ошибки нет. Письмо уходит, теги из комментария отрабатывают при сборке тела.
Дополнительный контекст
Файлы:
src/Notifications/Channels/EmailChannel.php
elements/chunks/ms3_email_new_manager.tpl
Это не #811: там событие order_created не отправляется. Это не #846: там пустой шаблон отключает письмо. Это не #840: там секреты попадают в чанки кабинета.
Предложение: не вызывать processElementTags по уже собранному телу. Экранировать комментарий, имя и адрес до вставки в HTML.
Значит из комментария покупателя исполняются не только [[++setting]] и [[snippet]], но и Fenom-конструкции, а в Fenom pdoTools через $_modx доступны runSnippet() и runProcessor(). Подтвердил вызовом сниппета-маркера через комментарий заказа.
Второй вектор — тема письма: StatusChangedNotification::processSubject() подставляет данные покупателя в строку темы, а buildSubject() компилирует её как шаблон через '@INLINE '. Тема вида Заказ {num}: {order_comment} исполняет код из комментария.
Третье место — Utils::sendEmail() (Utils.php:199-200), те же два вызова парсера по готовому телу; внутри MS3 метод не используется.
Прямое удаление processElementTags ломает чанки магазинов, написанные на MODX-тегах, поэтому в PR данные нейтрализуются вокруг парсера, а не вырезается его вызов: в самом шаблоне по-прежнему работают и Fenom, и MODX-настройки, лексикон и сниппеты.
Activity
biz87 commentedon Oct 15, 2026
Разобрал на стенде — картина шире, чем в описании.
$modx->getParser()при установленном pdoTools возвращает не разбор MODX-тегов, а Fenom:Значит из комментария покупателя исполняются не только
[[++setting]]и[[snippet]], но и Fenom-конструкции, а в Fenom pdoTools через$_modxдоступныrunSnippet()иrunProcessor(). Подтвердил вызовом сниппета-маркера через комментарий заказа.Второй вектор — тема письма:
StatusChangedNotification::processSubject()подставляет данные покупателя в строку темы, аbuildSubject()компилирует её как шаблон через'@INLINE '. Тема видаЗаказ {num}: {order_comment}исполняет код из комментария.Третье место —
Utils::sendEmail()(Utils.php:199-200), те же два вызова парсера по готовому телу; внутри MS3 метод не используется.Прямое удаление
processElementTagsломает чанки магазинов, написанные на MODX-тегах, поэтому в PR данные нейтрализуются вокруг парсера, а не вырезается его вызов: в самом шаблоне по-прежнему работают и Fenom, и MODX-настройки, лексикон и сниппеты.PR: #899
fix(notifications): закрыть тему письма тем же механизмом, что и тело (…
fix(notifications): не рвать маркер плоского ключа соседней цифрой (#888
fix(notifications): не исполнять теги из данных покупателя при сборке…
chore(release): 1.14.2-beta1 (#911)