Проблема
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 при пустой корзине даёт два эффекта сразу:
- Плейсхолдер остаётся пустым — там, где ожидалась корзина, ничего нет.
- 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.
Проблема
msCartимеет два ранних выхода, которые возвращают HTML чанка напрямую, минуя всю обработку в конце файла:А
toPlaceholderиshowLogобрабатываются только в самом конце:До этих строк пустая корзина не доходит никогда:
total_countравен нулю, срабатывает первый выход.Что видит пользователь
Вызов с
toPlaceholderпри пустой корзине даёт два эффекта сразу:toPlaceholderставят именно туда.Пока в корзине есть товар — работает как задумано. Покупатель убирает последнюю позицию, и «Корзина пуста» появляется вверху страницы, а
<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.