Сортировка продуктов Magento 1.8 по цене неоднородна для отдельных и настраиваемых продуктов?
Взгляните на http://goo.gl/N2ZzzZ
Если я выполняю сортировку по цене, ASC или DESC, сортировка продуктов происходит повсюду (просто сравните значения в долларах).
Вероятно, потому, что некоторые продукты являются отдельными продуктами, а некоторые настраиваются с несколькими продуктами, определенными в них.
Я думаю, что Magento берет самый дорогой продукт в этих настраиваемых продуктах, а затем использует его для сортировки, но если я закажу продукты от min до макс, тогда все выключено.
Есть идеи, можно ли это как-то исправить?
1 answers
Я не могу дать вам четкого ответа, но я могу подсказать вам, с чего начать.
В списке продуктов используются цены из таблицы индекса цен catalog_product_index_price
.
При сортировке по цене для сортировки используется столбец min_price
.
Вы можете увидеть это в Mage_Catalog_Model_Resource_Product_Collection::addAttributeToSort
в разделе if($attribute == 'price')
:
$this->addPriceData();
$this->getSelect()->order("price_index.min_price {$dir}");
Теперь сумасшедшая часть.
Таблица индекса цен заполняется индексатором.
Цена каждого вида товара рассчитывается немного по-разному.
Классы, которые вычисляют цены, расположены в app/code/core/Mage/Catalog/Model/Resource/Product/Indexer/Price
. каждый класс соответствует типу продукта. Если для определенного типа продукта нет класса (например, виртуального), используется Default.php
.
Для продуктов пакета используется класс app/code/core/Mage/Bundle/Model/Resource/Indexer/Price.php
, а для загружаемых app/code/core/Mage/Downloadable/Model/Resource/Indexer/Price.php
У каждого класса есть метод, называемый reindexEntity
. Это тот, кто делает грязную работу.
Этот метод вызывает различные методы в зависимости от типа продукта, которые вычисляют и извлекают цены.
В каждом классе (специально настраиваемом, сгруппированном и связанном) есть есть несколько огромных запросов, чтобы узнать цены.
К сожалению, я не могу толком объяснить, что делает каждый запрос, потому что на первый взгляд они кажутся мне драконами.
Но вы можете запускать процессы индексатора и регистрировать запросы и результаты, если хотите посмотреть, что они делают.
Кроме того, если вы хотите изменить процесс индексирования, вам необходимо изменить эти классы и методы. Но будьте очень осторожны.