Итак, я схожу с ума, как сумасшедший, чтобы попытаться найти решение этой проблемы, которая действительно работает правильно, но пришла с пустыми руками.
При использовании функции Sort By на странице категории для сортировки товаров по атрибуту (емкость, вес и т.д.). Magento подобен этому, потому что он считает, что это текстовая строка:
Продукт A: 10 кг
Продукт B: 11 кг
Продукт C: 15 кг
Продукт D: 9 кг
тогда как он должен выглядеть следующим образом:
Продукт D: 9 кг
Продукт A: 10 кг
Продукт B: 11 кг
Продукт C: 15 кг
Оглядываясь, кажется, что люди предлагают изменить backend_type на десятичные и frontend_input на цену в таблице eav_attribute для атрибутов, которые вы бы как сортировать численно. Однако это не только не работает, но и изменяет формат номера, чтобы иметь перед ним символ доллара ($), и потому, что мы отображаем фактическое значение атрибута на странице продукта, поверх его использования для сортировки, мы не работаем как исправление.
Я пытаюсь выяснить, как работает метод getSortOrder(), но похоже, что эта функциональность довольно глубоко встроена, поэтому я изо всех сил пытаюсь найти способ обхода этой ошибки.
Любая помощь приветствуется!
EDIT:
Для тех, кто хочет решить эту проблему в будущем, здесь исправление, которое я придумал:
Вам нужно переопределить функцию _getProductCollection() в List.php, которая хранится в приложении /Code/Mage/core/catalog/block/product/list.php.
Скопируйте файл в приложение/код/Mage/local/catalog/block/product/list.php, чтобы вы не редактировали файлы ядра.
Затем ниже, где говорится:
$this->_productCollection = $layer->getProductCollection();
Введите следующий код:
// Start of Code to force Magento to numerically sort decimal attributes rather than alphabetically
$filterAttribute = $this->getRequest()->getParam('order');
$filterAttributeDir = $this->getRequest()->getParam('dir');
$attributeType = Mage::getModel('eav/entity_attribute')->loadByCode('catalog_product', $filterAttribute)->getFrontendClass();
// If a Sort By option is selected on category page and attribute has frontend_class = validate-number or validate-digits
// then CAST the attribute values as signed integers
if (isset($filterAttribute) && ($attributeType == 'validate-digits' || $attributeType == 'validate-number')) {
$this->_productCollection->getSelect()->reset(Zend_Db_Select::ORDER);
$this->_productCollection->getSelect()->order('CAST(`' . $filterAttribute . '` AS SIGNED) ' . $filterAttributeDir . "'");
}
// End of code to force Magento to numerically sort....
Теперь, если у вас есть входная проверка для владельца магазина в панели администратора для атрибута, установленного на Десятичный номер или целочисленный номер: Тогда этот код будет reset порядок сортировки в коллекции продуктов, а затем CAST его как целое число со знаком, так что он будет сортироваться численно, а не буквенно-цифровым способом.
Надеюсь, что это поможет кому-то!