Фильтр для популярных товаров по категориям в Magento - PullRequest
3 голосов
/ 29 марта 2011

То, что мы пытаемся сделать, кажется достаточно простым, мы хотим показать популярные продукты из каждой категории в нашем меню.Мы рассчитываем получить 5 таких продуктов, поскольку именно для этого предназначен пользовательский интерфейс.Мы бы хотели, чтобы они были отсортированы по популярности, и я считаю, что это число просмотров продукта в Magento.

Во многих случаях запрашиваемая категория меню не имеет продуктов для себя.Таким образом, он должен помочь в продвижении товаров для детей.Пример одной ветки нашей разметки категории:

  • Мужская, № 2 (без предметов)
    • Рубашки, № 5 (с предметами)
    • Аксессуары, #6 (есть предметы)
    • Штаны, # 7 (есть предметы)
    • И т.д., # 8 (есть предметы)

Что этоВ настоящее время код возвращает один и тот же список популярных продуктов независимо от категории, которую мы передаем в фильтр.Удаление -> addCategoryFilter (...) эффективно возвращает те же результаты.Я подозреваю, что если мы сможем решить, как фильтровать по категориям, все остальное встанет на свои места.

$storeId = 1;
$category; // Category Object for id = 2 passed to this code
$productCount = 5;

$products = Mage::getResourceModel('reports/product_collection')
->addOrderedQty()
->addAttributeToSelect('*')
->addAttributeToSelect(array('name','small_image'))
->setStoreId($storeId)
->addStoreFilter($storeId)
->addCategoryFilter($category)
->addViewsCount()
->setPageSize($productCount);

Мы попробовали несколько вариантов этого.Я не уверен, учитывает ли метод addCategoryFilter (...) дочерние категории или нет.Если нет, то это должно быть достаточно просто для запроса и решения.Конечно, в нынешнем виде он всегда возвращает одни и те же продукты без фильтрации по категориям ... обо всем по порядку.

Running Magento 1.4.0.1

Быстрый просмотрв данных для продуктов показаны эти ключи в $ products-> getFirstItem () -> getData ():

Array
(
[0] => entity_id
[1] => entity_type_id
[2] => attribute_set_id
[3] => type_id
[4] => sku
[5] => has_options
[6] => required_options
[7] => created_at
[8] => updated_at
[9] => name
[10] => url_key
[11] => gift_message_available
[12] => meta_title
[13] => meta_description
[14] => image
[15] => small_image
[16] => thumbnail
[17] => custom_design
[18] => page_layout
[19] => options_container
[20] => url_path
[21] => image_label
[22] => thumbnail_label
[23] => small_image_label
[24] => description
[25] => short_description
[26] => meta_keyword
[27] => custom_layout_update
[28] => weight
[29] => price
[30] => special_price
[31] => cost
[32] => news_from_date
[33] => news_to_date
[34] => special_from_date
[35] => special_to_date
[36] => custom_design_from
[37] => custom_design_to
[38] => exclusive
[39] => size
[40] => color
[41] => status
[42] => visibility
[43] => is_imported
[44] => tax_class_id
[45] => enable_googlecheckout
[46] => is_recurring
[47] => is_salable
[48] => stock_item
) 

К сожалению, no category_ids

Ответы [ 2 ]

1 голос
/ 30 марта 2011

Хорошо, я нашел ответ, который в основном работает из-за отсутствия работы и / или фильтрации по нескольким категориям. Это грязно, но работает. Он основан на сообщении в блоге здесь: http://asia -connect.com.vn / 2009/07 / magento-filter-by-множественные категории /

Не могу сказать, что доволен этим решением. Я не могу понять, почему Magento убрал бы возможность выполнять фильтрацию по категориям полезным способом. Тот факт, что он вообще ничего не фильтровал, только усугублял мои проблемы. Не стесняйтесь вступать с более разумным решением. Я бы с удовольствием заменил это решение на него.

$products = Mage::getResourceModel('reports/product_collection')
        ->addOrderedQty()
        ->addAttributeToSelect('*')
        ->addAttributeToSelect(array('name','small_image'))
        ->setStoreId($storeId)
        ->addStoreFilter($storeId)
//        ->addCategoryFilter($category)
        ->addViewsCount()
        ->setPageSize($productCount);

$alias = 'cat_index';
$categoryCondition = $products->getConnection()->quoteInto(
        $alias.'.product_id=e.entity_id AND '.$alias.'.store_id=? AND ',
        $storeId
);
$cats = array( $category->getId() );
foreach($category->getChildren() as $catChild) {
        $cats[] = $catChild->getId();
}


$categoryCondition.= $alias.'.category_id IN ('.implode(',',$cats).')';

$products->getSelect()->joinInner(
        array($alias => $products->getTable('catalog/category_product_index')),
        $categoryCondition,
        array('position'=>'position')
);

$products->_categoryIndexJoined = true;
0 голосов
/ 29 марта 2011

Вы можете использовать addCategoryFilter, если у вас есть только одна категория. Идентификаторы категории хранятся для продукта в виде запятой Таким образом, чтобы отфильтровать коллекцию товаров по нескольким категориям, вы должны использовать:

addAttributeToFilter('category_ids',array('finset'=>$categoryIds));

$ categoryIds может быть отдельным идентификатором категории или разделенным запятыми идентификаторами категории.

Следующий код фильтрует коллекцию товаров по двум идентификаторам категорий (10 и 15).

$_productCollection = Mage::getResourceModel('reports/product_collection')
   ->addAttributeToSelect('*')
   ->addAttributeToFilter('category_ids',array('finset'=>'10,15'));

когда мы используем finset, функция mysql find_in_set используется в запросе sql функцией Magento.mysql find_in_set:

FIND_IN_SET () ищет первое вхождение строки в другой строке, содержащей значения, разделенные запятыми.

SELECT FIND_IN_SET('b','a,b,c,d'); // result = 2
...