пользовательский атрибут да/нет добавить для сортировки по в списке продуктов


У меня есть один атрибут, называемый самым популярным с конфигурацией 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

Есть ли какое-либо решение, чтобы заставить это работать?

Ваша помощь будет очень признательна.

Author: liyakat, 2015-09-08

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.

Только что попробовал, и мой атрибут действительно отображается в раскрывающемся списке.

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

 1
Author: Sander Mangel, 2015-09-08 07:17:06

После отладки и обратной трассировки найдите способ добавить сортировку в логический атрибут для переопределения 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;
    }

}

Надеюсь, это кому-нибудь обязательно поможет.

 1
Author: liyakat, 2015-09-08 09:23:46