пользовательский атрибут да/нет добавить для сортировки по в списке продуктов
У меня есть один атрибут, называемый самым популярным с конфигурацией defatul Да/нет от magento, за которым я следовал
1) Для добавления с помощью бэкенда Magento вам необходимо выполнить следующие действия
А) Перейти Catalog->Attributes->Manage Attributes
Б) Выберите атрибут, который вы хотите добавить, в опции Сортировать по. Предположим, вам нужно добавить опцию Сортировки по популярности.
C) Перейдите к атрибуту бренда и отметьте "Используется для сортировки в списке товаров".
D) Сделай так, чтобы это было ДА
Но все равно я этого не понял работа.
У меня есть коллекция трассировки magento с этой сортировкой, но она не добавляет никакого порядка в коллекцию, как показано ниже для популярной сортировки,
SELECT `e`.*, `search_result`.`relevance`, `price_index`.`price`, `price_index`.`tax_class_id`, `price_index`.`final_price`, IF(price_index.tier_price IS NOT NULL, LEAST(price_index.min_price, price_index.tier_price), price_index.min_price) AS `minimal_price`, `price_index`.`min_price`, `price_index`.`max_price`, `price_index`.`tier_price`, `cat_index`.`position` AS `cat_index_position` FROM `catalog_product_entity` AS `e` INNER JOIN `catalogsearch_result` AS `search_result` ON search_result.product_id=e.entity_id AND search_result.query_id='2' INNER JOIN `catalog_product_index_price` AS `price_index` ON price_index.entity_id = e.entity_id AND price_index.website_id = '1' AND price_index.customer_group_id = 0 INNER JOIN `catalog_category_product_index` AS `cat_index` ON cat_index.product_id=e.entity_id AND cat_index.store_id='1' AND cat_index.visibility IN(3, 4) AND cat_index.category_id = '2' LIMIT 12
Сортировка цен правильна, как показано ниже
SELECT `e`.*, `search_result`.`relevance`, `price_index`.`price`, `price_index`.`tax_class_id`, `price_index`.`final_price`, IF(price_index.tier_price IS NOT NULL, LEAST(price_index.min_price, price_index.tier_price), price_index.min_price) AS `minimal_price`, `price_index`.`min_price`, `price_index`.`max_price`, `price_index`.`tier_price`, `cat_index`.`position` AS `cat_index_position` FROM `catalog_product_entity` AS `e` INNER JOIN `catalogsearch_result` AS `search_result` ON search_result.product_id=e.entity_id AND search_result.query_id='2' INNER JOIN `catalog_product_index_price` AS `price_index` ON price_index.entity_id = e.entity_id AND price_index.website_id = '1' AND price_index.customer_group_id = 0 INNER JOIN `catalog_category_product_index` AS `cat_index` ON cat_index.product_id=e.entity_id AND cat_index.store_id='1' AND cat_index.visibility IN(3, 4) AND cat_index.category_id = '2' ORDER BY `price_index`.`min_price` asc LIMIT 12
Есть ли какое-либо решение, чтобы заставить это работать?
Ваша помощь будет очень признательна.
2 answers
Распечатав запрос, который фактически извлекает значения для поля Product Listing Sort By
, мы можем увидеть, каким критериям должен соответствовать атрибут
SELECT `main_table`.*,
IF(al.value IS NULL, main_table.frontend_label, al.value) as `store_label`
FROM
`eav_attribute` AS `main_table`
INNER JOIN
`catalog_eav_attribute` AS `additional_table`
ON
main_table.attribute_id = additional_table.attribute_id
LEFT JOIN
`eav_attribute_label` AS `al`
ON
al.attribute_id = main_table.attribute_id
AND
al.store_id = 0 WHERE (
main_table.entity_type_id = 4
)
AND
(
additional_table.used_for_sort_by = 1
)
Он проверяет наличие type_id
, которое должно быть для продуктов, идентификатор магазина, который должен быть глобальным, и used_for_sort_by
должен быть 1.
Только что попробовал, и мой атрибут действительно отображается в раскрывающемся списке.
Поскольку сортировка на интерфейсе выполняется в порядке возрастания, пожалуйста, имейте в виду, что для продуктов с этим атрибутом установлено значение нет придет первым.
После отладки и обратной трассировки найдите способ добавить сортировку в логический атрибут для переопределения Mage_Eav_Model_Entity_Attribute_Source_Boolean
Config.xml
<config>
<global>
<models>
<eav>
<rewrite>
<entity_attribute_source_boolean>Yournamespace_Eav_Model_Entity_Attribute_Source_Boolean</entity_attribute_source_boolean>
</rewrite>
</eav>
</models>
</global>
</config>
Модель Boolean.php
class Yournamespace_Eav_Model_Entity_Attribute_Source_Boolean extends Mage_Eav_Model_Entity_Attribute_Source_Boolean
{
/**
* Add Value Sort To Collection Select
*
* @param Mage_Eav_Model_Entity_Collection_Abstract $collection
* @param string $dir
*
* @return Mage_Eav_Model_Entity_Attribute_Source_Table
*/
public function addValueSortToCollection($collection, $dir = Varien_Db_Select::SQL_ASC)
{
$valueTable1 = $this->getAttribute()->getAttributeCode() . '_t1';
$valueTable2 = $this->getAttribute()->getAttributeCode() . '_t2';
$collection->getSelect()
->joinLeft(
array($valueTable1 => $this->getAttribute()->getBackend()->getTable()), "e.entity_id={$valueTable1}.entity_id"
. " AND {$valueTable1}.attribute_id='{$this->getAttribute()->getId()}'"
. " AND {$valueTable1}.store_id=0", array())
->joinLeft(
array($valueTable2 => $this->getAttribute()->getBackend()->getTable()), "e.entity_id={$valueTable2}.entity_id"
. " AND {$valueTable2}.attribute_id='{$this->getAttribute()->getId()}'"
. " AND {$valueTable2}.store_id='{$collection->getStoreId()}'", array()
);
$valueExpr = $collection->getSelect()->getAdapter()
->getCheckSql("{$valueTable2}.value_id > 0", "{$valueTable2}.value", "{$valueTable1}.value");
Mage::getResourceModel('eav/entity_attribute_option')
->addOptionValueToCollection($collection, $this->getAttribute(), $valueExpr);
$collection->getSelect()
->order("{$this->getAttribute()->getAttributeCode()} {$dir}");
return $this;
}
}
Надеюсь, это кому-нибудь обязательно поможет.