2010-09-01 3 views
0

Я использовал следующий код, чтобы получить весь список производителей.Magento: как фильтровать результат Mage :: getResourceModel ('eav/entity_attribute_collection') по категориям

$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 фильтроваться по категориям?

Спасибо.

ответ

0

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

$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() должен помочь вам там.

НТН, 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

+0

Я сделал так, но производительность не соответствовала предыдущему методу. Любые другие thoght? Спасибо – Young

+0

исправленный ответ выше. –

+0

Спасибо! Я попробую и дам вам знать, как это улучшает производительность. – Young

0

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

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

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

Смежные вопросы