Skip to content

[Snippet] msCart игнорирует toPlaceholder и showLog, когда корзина пуста #803

Description

@biz87

Проблема

msCart имеет два ранних выхода, которые возвращают HTML чанка напрямую, минуя всю обработку в конце файла:

// core/components/minishop3/elements/snippets/ms3_cart.php:92-99
if (empty($status['total_count'])) {
    $applyStatusToTotal($total, $status);
    $formatTotalForDisplay($total, $ms3);
    if ($return === 'tpl') {
        return $pdoFetch->getChunk($tpl, compact('total', 'products', 'status'));
    }
    return compact('total', 'products', 'status');
}
if (empty($cart)) {                    // :100-107 — то же самое

А toPlaceholder и showLog обрабатываются только в самом конце:

// :263-271
if ($modx->user->hasSessionContext('mgr') && !empty($showLog)) {
    $output .= '<pre class="msCartLog">' . print_r($pdoFetch->getTime(), true) . '</pre>';
}

if (!empty($toPlaceholder)) {
    $modx->setPlaceholder($toPlaceholder, $output);
} else {
    return $output;
}

До этих строк пустая корзина не доходит никогда: total_count равен нулю, срабатывает первый выход.

Что видит пользователь

Вызов с toPlaceholder при пустой корзине даёт два эффекта сразу:

  1. Плейсхолдер остаётся пустым — там, где ожидалась корзина, ничего нет.
  2. HTML чанка вываливается на место вызова — обычно это верх шаблона, до разметки страницы, потому что вызов с toPlaceholder ставят именно туда.
{* Вверху шаблона *}
{'!msCart' | snippet : ['toPlaceholder' => 'cart']}
...
{* Ниже по разметке *}
<aside>{$_modx->getPlaceholder('cart')}</aside>

Пока в корзине есть товар — работает как задумано. Покупатель убирает последнюю позицию, и «Корзина пуста» появляется вверху страницы, а <aside> пустеет.

Пустая корзина — не редкий случай, а состояние по умолчанию для каждого нового посетителя.

showLog ломается там же и тем же образом, но это мелочь: лог виден только вошедшему менеджеру.

Причина

Ранние выходы добавлялись как оптимизация — при пустой корзине незачем делать выборку товаров. Но вместе с выборкой они обходят и постобработку вывода, которая к выборке отношения не имеет.

Что предлагается

Свести три пути возврата к одному. Например, вычислять $output в каждой ветке, а showLog / toPlaceholder / return применять один раз после них. Тогда добавление следующего параметра вывода не придётся повторять в трёх местах.

Затрагиваемые файлы

  • core/components/minishop3/elements/snippets/ms3_cart.php:92-107 — ранние выходы
  • core/components/minishop3/elements/snippets/ms3_cart.php:263-271 — постобработка, до которой они не доходят

Найдено при сверке документации с кодом для страницы snippets/mscart.

Activity

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 code

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions