Описание проблемы
msCart принимает sortby и sortdir, но на порядок товаров в корзине они не влияют. Значение уходит в pdoFetch и там же теряется: результат выборки перекладывается в массив по идентификатору, а вывод строится обходом корзины.
Параметр принимается без возражений, ошибки нет, порядок просто остаётся прежним.
Где это видно
core/components/minishop3/elements/snippets/ms3_cart.php:
$default = [
'class' => msProduct::class,
'sortby' => 'msProduct.id',
'sortdir' => 'ASC',
// ...
];
$pdoFetch->setConfig(array_merge($default, $scriptProperties), false);
$tmp = $pdoFetch->run();
$rows = [];
foreach ($tmp as $row) {
$rows[$row['id']] = $row; // порядок выборки теряется здесь
}
foreach ($cart as $key => $entry) { // вывод идёт по корзине
// ...
}
array_merge($default, $scriptProperties) позволяет переопределить сортировку снаружи, и запрос действительно выполнится с новым ORDER BY. Но строки тут же раскладываются в ассоциативный массив по id, после чего порядок берётся из содержимого корзины.
Почему это стоит починить
Не потому, что кому-то нужна сортировка корзины, — а потому, что параметр создаёт ложное ожидание. Он есть, принимается, не ругается, и человек тратит время, пытаясь понять, почему товары идут не так, как он просил. Молчаливое игнорирование хуже отсутствия параметра.
Из документации (snippets/mscart.md) упоминание уже убрано, вместо него стоит пояснение, что порядок соответствует корзине. Но в коде обманка осталась.
Варианты решения
Первый — честно не принимать. Убрать sortby и sortdir из $default и игнорировать их в $scriptProperties, а при передаче писать в журнал предупреждение, как это сделано для отброшенных частей sortby в msProducts.
Второй — заставить работать. Раскладывать $rows с сохранением порядка выборки и обходить не корзину, а результат запроса, подтягивая записи корзины по product_id. Это меняет поведение: сейчас порядок в корзине осмысленный (последний добавленный виден там, куда его положили), и менять его по умолчанию нельзя — понадобится отдельный параметр вида keepCartOrder.
Склоняюсь к первому: сортировка корзины — редкая потребность, а вот тихо игнорируемый параметр вредит всем.
Связанное
Найдено при сверке страницы snippets/mscart с кодом.
Описание проблемы
msCartпринимаетsortbyиsortdir, но на порядок товаров в корзине они не влияют. Значение уходит в pdoFetch и там же теряется: результат выборки перекладывается в массив по идентификатору, а вывод строится обходом корзины.Параметр принимается без возражений, ошибки нет, порядок просто остаётся прежним.
Где это видно
core/components/minishop3/elements/snippets/ms3_cart.php:array_merge($default, $scriptProperties)позволяет переопределить сортировку снаружи, и запрос действительно выполнится с новымORDER BY. Но строки тут же раскладываются в ассоциативный массив поid, после чего порядок берётся из содержимого корзины.Почему это стоит починить
Не потому, что кому-то нужна сортировка корзины, — а потому, что параметр создаёт ложное ожидание. Он есть, принимается, не ругается, и человек тратит время, пытаясь понять, почему товары идут не так, как он просил. Молчаливое игнорирование хуже отсутствия параметра.
Из документации (
snippets/mscart.md) упоминание уже убрано, вместо него стоит пояснение, что порядок соответствует корзине. Но в коде обманка осталась.Варианты решения
Первый — честно не принимать. Убрать
sortbyиsortdirиз$defaultи игнорировать их в$scriptProperties, а при передаче писать в журнал предупреждение, как это сделано для отброшенных частейsortbyвmsProducts.Второй — заставить работать. Раскладывать
$rowsс сохранением порядка выборки и обходить не корзину, а результат запроса, подтягивая записи корзины поproduct_id. Это меняет поведение: сейчас порядок в корзине осмысленный (последний добавленный виден там, куда его положили), и менять его по умолчанию нельзя — понадобится отдельный параметр видаkeepCartOrder.Склоняюсь к первому: сортировка корзины — редкая потребность, а вот тихо игнорируемый параметр вредит всем.
Связанное
Найдено при сверке страницы
snippets/mscartс кодом.