Skip to content

[Snippet] msCart принимает sortby и sortdir, но молча их игнорирует #800

Description

@biz87

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

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 с кодом.

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