Skip to content

[Bug] Письмо о заказе разбирает MODX-теги из комментария покупателя #888

Closed

Description

@Ibochkarev

Описание проблемы

Текст письма сначала собирается Fenom-чанкером вместе с полями заказа, включая комментарий адреса. Затем EmailChannel прогоняет уже готовое HTML через парсер тегов MODX, в том числе некэшируемые.

Комментарий покупателя попадает в тело до этого прохода. Теги из комментария исполняются на сервере при отправке письма менеджеру, а не остаются текстом.

Штатный чанк tpl.msEmail.new.manager выводит комментарий адреса без экранирования.

Шаги воспроизведения

  1. Включить письмо менеджеру при смене статуса, канал email, шаблон tpl.msEmail.new.manager.
  2. Оформить заказ и в комментарий адреса вписать некэшируемый тег MODX.
  3. Сменить статус так, чтобы письмо ушло.
  4. Открыть исходник письма.

Ожидаемое поведение

В письме комментарий как обычный текст. Теги из полей заказа не исполняются. Если чанку нужны свои теги MODX, они разбираются до подстановки данных покупателя.

Фактическое поведение

EmailChannel после getChunk вызывает:

\$this->modx->getParser()->processElementTags('', \$body, true, false, '[[', ']]', [], 10);
\$this->modx->getParser()->processElementTags('', \$body, true, true, '[[', ']]', [], 10);

Второй вызов с флагом некэшируемых тегов идёт по строке, куда 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.

Activity

  1. added
    bugSomething isn't working
    priority: highВажно исправить в ближайшее время
    phpPull requests that update php code
    on Oct 13, 2026
  2. biz87 commented on Oct 15, 2026

    @biz87
    Member

    Разобрал на стенде — картина шире, чем в описании.

    $modx->getParser() при установленном pdoTools возвращает не разбор MODX-тегов, а Fenom:

    EmailChannel.php:149 → PdoTools\Parsing\Parser->processElementTags()
                         → Fenom->process() → Fenom\Template.php(487): eval()'d code
    

    Значит из комментария покупателя исполняются не только [[++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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingphpPull requests that update php codepriority: highВажно исправить в ближайшее время

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions