Сортировка товаров по изображению и цене

Сортировка товаров по изображению и цене

Сортировка товаров в интернет-магазине (в начале товары с картинками и внутри еще и по цене)

В общем все работало классно, пока клиент не захотел новую сортировку товаров.

Задача: В каталоге товаров в интернет-магазине нужно в начале выстраивать товары у которых есть картинка, а после необходимо выстраивать у которых картинки нет. Внутри этой сортировки необходимо еще сортировать товары по цене (сама дешевая в начале) при чем необходимо, что бы товары, у которых цены нет (то есть по заказу), были в самом конце каждого из списков (то есть в конце товаров с картинками и товаров без картинок).

Особенности: Встала одна особенность — часть изображений выгружали через 1С, а часть вручную через админку.

Начнем с сортировки

Мой код сортировки для MySQL выглядит так:

ORDER BY CHAR_LENGTH(mod_catalog.`cover`) DESC, FIELD( mod_catalog.`price` , 'NULL, not null' ) , mod_catalog.`price` ASC

В чем смысл?

В начале я сортирую столбец с картинкой по количеству символов. Далее идет сортировка по цене, вернее по цене, что не NULL, а после обычное выстраивание по цене.

У меня если у товара нет картинки — ячейка пустая. Если есть — записывается название файла картинки без расширения.

Возникшая проблема и ее решение

Все прекрасно работало, пока я не понял, что из 1С названия картинок идут с 32 символами, а из админки до 10 символов в названии файла. Из-за этого товар с картинкой, залитый из админки, всегда уходил в самый конец списка.

Как же я ее решил?

Я изменил рандомайзер в админке. То есть я сделал так, что бы картинки, залитые из админки, имели в названии 32 символа.

Вот код рандомайзера:

function generateRandomString($length = 32) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}
//Вывод ответа рандомайзера
echo generateRandomString();

Об этом коде я поговорю в другой, новой записи.