Как получить всех производителей для категории в Magento - PullRequest
1 голос
/ 16 мая 2011

У меня такая проблема с Magento CMS. Мне нужно найти всех производителей для категории. На первый взгляд, это не проблема, потому что есть Блок фильтров и Слой навигации , из которого вы можете выбрать необходимые методы.

Прежде всего я создаю публичный метод в переопределенной модели категории /app/code/local/Mage/ Catalog/Model/Category.php

public function getManufacturers()
 {
        $collection = Mage::getResourceModel('catalog/product_attribute_collection')
            ->setItemObjectClass('catalog/resource_eav_attribute');

        $setIds = $this->getProductCollection()->getSetIds();

        $collection->getSelect()->distinct(true);
        $collection
            ->setAttributeSetFilter($setIds)
            ->addStoreLabel(Mage::app()->getStore()->getId())
            ->setOrder('position', 'ASC');
        $collection->addIsFilterableFilter();;
        $collection->load();

        return $collection; 
 }

Я вызываю этот метод в шаблоне категории:

$manufscturers = $_category->getManufacturers();

Итак, мы получаем огромный объект Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Attribute_Collection.

Тогда:

$items = $manufscturers->getItems();

И мы получаем объект Mage_Catalog_Model_Resource_Eav_Attribute.

Тогда я не знаю, что делать. Это тупик. Может это неправильный путь?

Версия Magento - 1.4.0.1

Спасибо за вашу помощь!

Ответы [ 4 ]

2 голосов
/ 01 марта 2012

Вот как вы должны получить всех производителей для категории:

$category           = Mage::registry('current_category');
$layer              = Mage::getSingleton('catalog/layer');
$layer->setCurrentCategory($category);
$attributes = $layer->getFilterableAttributes();
$manufacturers = array();
foreach ($attributes as $attribute) {
    if ($attribute->getAttributeCode() == 'manufacturer') {
        $filterBlockName = 'catalog/layer_filter_attribute';
        $result = Mage::app()->getLayout()->createBlock($filterBlockName)->setLayer($layer)->setAttributeModel($attribute)->init();
        foreach($result->getItems() as $option) {
            $manufacturers[$option->getValue()] = $option->getLabel();
        }
    }
}
var_dump($manufacturers);

Надеюсь, это было полезно.Ура! * * 1004

1 голос
/ 26 октября 2016

Если вы хотите добавить многоуровневую навигацию на странице производителя.Добавьте производителя в качестве категорий и используйте следующие сценарии magento для создания категорий и программного назначения продуктов.

http://www.pearlbells.co.uk/how-to-create-new-categories-and-assigned-products-to-category-programmatically-magento/

$attrLabel = 'manufacturer';
$attr = $product->getResource()->getAttribute($attrLabel);
$manufacturer_id = $attr->getSource()->getOptionId($manufacturer);
$newproducts = $product->getCollection()->addAttributeToFilter(array(array('attribute'=>'manufacturer', 'eq'=> $manufacturer_id)));

Для назначения продуктов

$newCategory = array( $list[0] , $list[$key]); 
foreach($newproducts as $prod)
{
$prod->setCategoryIds(
        array_merge($prod->getCategoryIds(), $newCategory)
     );
$prod->save();
}
1 голос
/ 17 июля 2016

Это заняло много времени, но мой ответ может кому-то помочь.

Если вам нужен фильтр категорий на странице категорий, вы можете получить неверный результат.

Мой код основан на коде @ MagePsycho

public function getCategoryAttributeFilter($category, $attributeCode)
{
    /** @var Mage_Catalog_Model_Layer $layer */
    $layer = Mage::getModel('catalog/layer');
    $layer->setCurrentCategory($category);
    $attributes = $layer->getFilterableAttributes();

    $request = Mage::app()->getRequest();
    Mage::app()->setRequest($newRequest = new Mage_Core_Controller_Request_Http());
    $newRequest->setParam($attributeCode, false);

    $items = array();
    foreach ($attributes as $attribute) {
        if ($attribute->getAttributeCode() == $attributeCode) {
            $filterBlockName = 'catalog/layer_filter_attribute';
            /** @var Mage_Catalog_Block_Layer_Filter_Attribute $block */
            $block = Mage::app()->getLayout()->createBlock($filterBlockName);
            $result = $block->setLayer($layer)->setAttributeModel($attribute)->init();
            foreach($result->getItems() as $option) {
                $manufacturers[$option->getValue()] = $option->getLabel();
            }
            //$items = $result->getItems();
            break;
        }
    }
    Mage::app()->setRequest($request);

    Zend_Debug::dump($manufacturers);

    return $items;
}
$category = Mage::getModel('catalog/category')->load(/*category id here*/);
$helper->getCategoryAttributeFilter($category, 'brand');
1 голос
/ 16 мая 2011

Насколько я вижу, вы достигли коллекции атрибутов продукта, которая не зависит от категории или коллекции.

Советую вам взять коллекцию продуктов для данной категории, например:

$layer = $this->getLayer();
$productCollection = $layer->getProductCollection();

итерируйте его и получите все значения атрибутов для данной категории. Кэшируйте результаты. Точно так же, как и в magento («magento way»).

...