我在使用 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
感谢您的帮助!
以下是获取某个类别的所有制造商的方法:
$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);
希望这有用。
干杯!
据我所知,您已经实现了产品属性收集 不依赖于给定的类别或产品集合。
我给您的建议是按照给定类别收集产品,例如:
$layer = $this->getLayer();
$productCollection = $layer->getProductCollection();
然后迭代它并获取给定类别的所有属性值。 缓存结果。 在 magento 中也完成了完全相同的操作(当然是以“magento 方式”)
花了很长时间,但我的回答可能会对某人有所帮助。
如果您需要在类别页面上获取类别过滤器,您可能会得到错误的结果。
我的代码基于代码@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');
如果你想在厂商页面添加分层导航。请添加制造商作为类别,并使用以下 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();
}