Бортовой журнал Ктулху

Prestashop (1.4.4.0-1.4.4.1) blocklayered - сортировка атрибутов и характеристик по алфавиту, возрастанию и убыванию

Столкнулся с проблемой беспорядочного вывода значений характеристик товара в фильтре blocklayered (Prestashop 1.4.4.0 Prestadev.ru). Буквально все ресурсы кишат сообщениями об этой проблеме и нигде не предлагается решение (я по крайней мере не нашел, хотя не, уже нашел).

 

Вот на этом сайтике предлагалось вроде бы нужное решение, но для характеристик, а мне нужно сортировать производителей. Приведу пример на случай пропажи этой ценной информации.

При выводе в фильтре многоуровневой навигации (blocklayered.php) значения характеристик и атрибутов внутри соответствующей группы фильтров никак не сортируются.
Для удобочитаемого вида блока необходимо добавить в запросы сортировку по наименованию характеристик и атрибутов.
Соответственно для сортировки характеристик необходимо:

$filterBlocks[(int)$filter['position']]['SQLvalues'] = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
SELECT fvl.id_feature_value, fvl.value
FROM '._DB_PREFIX_.'feature_value fv
LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = fv.id_feature_value)
WHERE (fv.custom IS NULL OR fv.custom = 0) AND fv.id_feature = '.(int)$filterBlocks[(int)$filter['position']]['id_key'].' AND fvl.id_lang = '.(int)$id_lang);

заменить на

$filterBlocks[(int)$filter['position']]['SQLvalues'] = Db::getInstance()->ExecuteS(' SELECT fvl.id_feature_value, fvl.value FROM '._DB_PREFIX_.'feature_value fv LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = fv.id_feature_value) WHERE (fv.custom IS NULL OR fv.custom = 0) AND fv.id_feature = '.(int)$filterBlocks[(int)$filter['position']]['id_key'].' AND fvl.id_lang = '.(int)$id_lang.' ORDER BY `fvl`.`value` ASC');

Для сортировки атрибутов:

$filterBlocks[(int)$filter['position']]['SQLvalues'] = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
 SELECT al.id_attribute, al.name, a.color
 FROM '._DB_PREFIX_.'attribute a
 LEFT JOIN '._DB_PREFIX_.'attribute_lang al ON (al.id_attribute = a.id_attribute)
 WHERE a.id_attribute_group = '.(int)$filterBlocks[(int)$filter['position']]['id_key'].' AND al.id_lang = '.(int)$id_lang);

заменить на

$filterBlocks[(int)$filter['position']]['SQLvalues'] = Db::getInstance()->ExecuteS('
 SELECT al.id_attribute, al.name, a.color
 FROM '._DB_PREFIX_.'attribute a
 LEFT JOIN '._DB_PREFIX_.'attribute_lang al ON (al.id_attribute = a.id_attribute)
 WHERE a.id_attribute_group = '.(int)$filterBlocks[(int)$filter['position']]['id_key'].' AND al.id_lang = '.(int)$id_lang.' 
 ORDER BY `al`.`name` ASC');

Что-то похожее нужно и для сортировки о производителям. По каким-то соображениям разработчики не добавили простую сортировку, так что сделаю это за них.

Примерно строка 1035

 $man = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
SELECT DISTINCT(p.id_manufacturer), m.name
 FROM '._DB_PREFIX_.'product p 
 LEFT JOIN '._DB_PREFIX_.'manufacturer m ON (m.id_manufacturer = p.id_manufacturer)
 WHERE p.id_product IN ('.implode(',', $productKeys).') AND p.id_manufacturer != 0');

заменить на

$man = Db::getInstance()->ExecuteS('
 SELECT DISTINCT(p.id_manufacturer), m.name
 FROM '._DB_PREFIX_.'product p 
 LEFT JOIN '._DB_PREFIX_.'manufacturer m ON (m.id_manufacturer = p.id_manufacturer)
 WHERE p.id_product IN ('.implode(',', $productKeys).') AND p.id_manufacturer != 0 GROUP BY m.name');

 Забавно что на официальном багтрекере не решена эта проблема.

Использованные ресурсы:

Вложения:
ФайлОписаниеРазмер файла:
Скачать этот файл (blocklayered.php.zip)blocklayered.php.zip 14 Кб