Magento: как отфильтровать результат Mage :: getResourceModel ('eav / entity_attribute_collection') по категории - PullRequest
0 голосов
/ 01 сентября 2010

Я использовал следующий код, чтобы получить полный список производителей.

    $currentCategory = Mage::registry('current_category');
    $product = Mage::getModel('catalog/product');       
    $attributes = Mage::getResourceModel('eav/entity_attribute_collection')->setEntityTypeFilter($product->getResource()->getTypeId())->addFieldToFilter('attribute_code', 'brand_name');      
    $attribute = $attributes->getFirstItem()->setEntity($product->getResource());       
    $manufacturers = $attribute->getSource()->getAllOptions(false);      

Теперь, как я могу получить список производителей, которые относятся к определенной категории?Я долго копался, чтобы найти способ ограничить результат категорией, но не повезло.Может ли ResourceModel фильтроваться по категориям?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 сентября 2010

Спасибо за хороший способ получить идентификатор опции для атрибута.Это действительно очень помогло мне!Вот что я в итоге сделал, чтобы получить идентификатор опции и ее текстовое значение:

$currentCategory = Mage::registry('current_category');
$products = $currentCategory->getProductCollection();
$products->addAttributeToSelect('brand_name');
$products->load();  //execute the query
$manufacturers = $products->toArray(array('brand_name'));   
$temp = array();
foreach($manufacturers as $v) {
    $temp[] = $v['brand_name'];
}
$brands = implode(",",array_unique($temp));
$write = Mage::getSingleton('core/resource')->getConnection('core_write');
$readresult=$write->query("SELECT eav_attribute_option_value.option_id, eav_attribute_option_value.value FROM eav_attribute_option_value INNER JOIN eav_attribute_option ON eav_attribute_option_value.option_id=eav_attribute_option.option_id WHERE eav_attribute_option.attribute_id=505 AND eav_attribute_option_value.option_id IN (".$brands.")");

while ($row = $readresult->fetch() ) {
    $brandlist[] = array('value'=>$row['option_id'], 'label'=>$row['value']);
}

Массив brandlist будет иметь идентификатор опции и значение, чтобы я мог использовать его для ссылки.

Еще раз спасибо.

0 голосов
/ 01 сентября 2010

Я думаю, вам лучше начать с набора продуктов из категории, а затем получить атрибуты, соответствующие этим продуктам.Что-то вроде:

$currentCategory = Mage::registry('current_category');
$products = $currentCategory->getProductCollection();
foreach($products as $product):
  $product = Mage::getModel('catalog/product')->load($product->getId());
  $manufacturers[] = $product->getBrandName();      
endforeach;

Вам потребуется дедупликация массива, но array_unique() должен помочь вам в этом.

HTH, JD

EDIT

Это избавит от необходимости загружать каждый продукт, должно повысить производительность:

$currentCategory = Mage::registry('current_category');
$products = $currentCategory->getProductCollection();
$products->addAttributeToSelect('brand_name');
$products->load();  //execute the query
$manufacturers = $products->toArray(array('brand_name'));

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

JD

...