Поэтому я искал Google как сумасшедший, чтобы попытаться найти решение этой проблемы, которая действительно работает правильно, но пришла с пустыми руками.
При использовании функции Sort By на странице категории для сортировки товаров по атрибуту (емкость, вес и т. Д.). Magento подобен этому, потому что он считает, что число является текстовой строкой:
Продукт А: 10 кг
Продукт B: 11 кг
Продукт C: 15 кг
Продукт D: 9 кг
тогда как он должен выглядеть следующим образом:
Продукт D: 9 кг
Продукт А: 10 кг
Продукт B: 11 кг
Продукт C: 15 кг
Оглядываясь, кажется, что люди предлагают изменить backend_type на decimal и frontend_input на цену в таблице eav_attribute для атрибутов, которые вы хотите сортировать численно. Однако это не только не работает, но и изменяет формат номера, чтобы иметь перед ним символ доллара ($), и потому, что мы отображаем фактическое значение атрибута на странице продукта, поверх его использования для сортировки, мы не работаем как исправление.
Я пытаюсь выяснить, как работает метод getSortOrder (), но похоже, что эта функциональность довольно глубоко встроена, поэтому я изо всех сил пытаюсь найти способ обхода этой ошибки.
Любая помощь приветствуется!
РЕДАКТИРОВАТЬ:
Для тех, кто хочет решить эту проблему в будущем, вот исправление, которое я придумал:
Вам необходимо переопределить функцию _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....
Теперь, если у вас есть входная проверка для владельца магазина на панели администратора для атрибута, установленного на Десятичный номер или целочисленный номер: Затем этот код сбросит порядок сортировки в коллекции продуктов, а затем CAST его как целое число со знаком, так что он будет сортироваться численно, а не буквенно-цифровым способом.
Надеюсь, что кто-то поможет!
Таким образом, я нашел поток на этом в своей документации, и, по-видимому, это известная точка боли для продукта. Лучшее решение, которое я нашел, это переопределить ORDER BY
для запроса, вызвав примитивный метод класса Collection
, вот пример, который они дают:
$_productCollection = Mage::getModel('catalog/product')->getCollection(); $_productCollection->setOrder(array('cm_brand', 'name', 'cm_length'), 'asc'); $_productCollection->getSelect()->reset(Zend_Db_Select::ORDER); $_productCollection->getSelect()->order(array('cm_brand ASC', 'name ASC', 'CAST(`cm_length` AS SIGNED) ASC'));
Основываясь на вашем примере только с одним столбцом сортировки, я думаю, вы могли бы пойти с:
$_productCollection = Mage::getModel('catalog/product')->getCollection(); $_productCollection->setOrder('weight', 'asc'); $_productCollection->getSelect()->reset(Zend_Db_Select::ORDER); $_productCollection->getSelect()->order('CAST(`weight` AS SIGNED) ASC'));
В ответ на сообщение Адама Б.
Моя ситуация: мне нужно было сортировать продукты по специальному атрибуту Magento (1.8.1.0) с числовым значением. Однако Magento сортировался так:
1 , 11 , 123 ,2 ,234, 3
(буквенно-цифровые) вместо: 1, 2, 3, 11, 123, 234
(числовые)
Я честно не понимаю, почему это не работает из коробки, но я получил эту работу со следующей адаптацией:
$this->_productCollection->getSelect()->order(new Zend_Db_Expr("CAST( ".$filterAttribute." AS SIGNED ) ".$filterAttributeDir));
Надеюсь, это кому-то понравится.
Можете ли вы рассказать нам « Catalog Input Type for Store Owner
»? Например, это текст или выпадаете? Я имею в виду, у вас есть столбец «position» в Magento Admin (Catalog-> Attributes-> Manage attributes-> Manage Label / Options-> Manage Options (значения вашего атрибута)). Если ваш атрибут является текстом, это фактическое значение строки '9kg'
или '9'
с добавлением 'kg'
позже?
В любом случае, если вы можете установить позицию в редакторе атрибутов, я думаю, что getSortOrder()
поможет вам (подтвердите это, и кто-то может опубликовать ответ о getSortOrder()
).
Если вы не можете установить позицию (потому что значения не заданы заранее), я думаю, вам нужно будет создать порядок сортировки продукта самостоятельно *, возможно, preg_replace()
буквы из значений атрибутов с помощью preg_replace()
или str_replace()
, сортировка по результату, а затем передача нового отсортированного массива продуктов в циклы отображения – см. «грубый псевдокод» в этом ответе .
* потому что я не думаю, что какие-либо встроенные общие функции сортировки могут сказать, что строка '9kg'
меньше, чем строка '11kg'
или '3V'
меньше, чем '18V'
** ИЗМЕНИТЬ следующий комментарий:
Ах, да, и я вижу, что Magento не имеет числового типа ввода для типа входа в Catalog Input Type for Store Owner
. Я думаю, что вы должны закодировать свою собственную сортировку в .phtml или связанном блочном php-классе (или если вы заранее знаете весы, это выпадающее меню, например 1,2,3,4 … или 1,1, 1,2, 1,3 .. .4.1, 4.2, 4.3 … 19.9), тогда вы можете указать Magento позицию.
Вы можете уйти с типом ввода Date
или даже с Fixed product tax
типом ввода Fixed product tax
но я считаю, что он просит проблемы (и много тестирования).
В плане B может быть добавлен XML-код, который определяет новый тип ввода данных для типа входа в Catalog Input Type for Store Owner
но я оставил бы это разработчикам Magento, возможно, у них есть веская причина для хранения значений атрибутов в виде строк.
Если вы используете системный атрибут Weight
то это фиксируется как text
типа ввода, и я думаю, что у вас нет другого выбора, кроме кодирования вашего собственного вида.
Я только что нашел
//file: app/code/core/Mage/Core/Model/Locale.php //class: Mage_Core_Model_Locale //... /* * @param string|float|int $value * @return float|null */ public function getNumber($value){ //...
Это может быть полезно. Я не думаю, что вам понадобится много времени, чтобы закодировать свой собственный вид.
Относительно ситуации «Атрибут с числовым значением» выше. У меня была та же проблема, и то, что я сделал, добавляло керосину «0» перед моими ценностями.
Например, мои значения: 208, 209, 355, 1152 и 1153.
Я добавил ceros: 00208, 00209, 00355, 01152 и 01153.
Он работает сейчас!
Этот пост также помог мне:
http://blog.adin.pro/2014-04-30/magento-custom-sort-on-grid-sort-increment_id-by-numeric-not-alpha/
Надеюсь, эта помощь!