在Magento中获取产品集合时,我希望StoreFilter能够做到这一点,按当前商店进行过滤。但我无法让它发挥作用。
假设我设置了2个商店:
两家商店都有不同的根类别。 Main Store是默认的样本数据,Store2只添加了一个产品。我原以为使用商店过滤器,只会显示当前商店根类别中的产品。但我正在展示每一件产品。我正在通过将以下内容放在我的类别视图模板中来测试它:
$store_id = Mage::app()->getStore()->getId();
$_testproductCollection = Mage::getResourceModel('reports/product_collection')
->setStoreId($storeId)
->addStoreFilter($store_id)
->addAttributeToSelect('*');
$_testproductCollection->load();
foreach($_testproductCollection as $_testproduct){
echo $this->htmlEscape($_testproduct->getName());
};
如果我回复商店ID,它会给我正确的号码。我在商店2中只有一种产品,为什么我要回收所有商店的所有商品?我可以将主商店中的每个产品设置为不在Store2中显示,然后添加可见性过滤器,但这将需要永远。
另外,我刚注意到,如果我回应产品商店ID,我会得到当前的ID,而不是它分配给的商店:
echo $_testproduct->getStoreId()
发生了什么事?
更新(2011年4月8日): 好的,所以我尝试加入字段以便包含store_id(如下所示),代码部分 {{table}}。store_id = 1 只是将所有产品设置为store_id 1.如何才能获得与产品相关的store_id?
$_testproductCollection = Mage::getResourceModel('catalog/product_collection');
$_testproductCollection->joinField('store_id', 'catalog_category_product_index', 'store_id', 'product_id=entity_id', '{{table}}.store_id = 1', 'left');
$_testproductCollection->getSelect()->distinct(true);
$_testproductCollection->addAttributeToSelect('*')->load();
foreach($_testproductCollection as $_testproduct){
echo $this->htmlEscape($_testproduct->getName())."<br/>";
echo "STORE IS ".$_testproduct->getData('store_id')."<br/>";
};
如果我检查数据库的 catalog_category_product_index 表,则store_id是正确的。
答案 0 :(得分:4)
$_testproductCollection
应该如下$_testproductCollection = Mage::getResourceModel('reports/product_collection')->addAttributeToSelect('*')->addStoreFilter()
。
如果您从该集合中打印SELECT
您将看到没有任何商店列,因此addStoreFilter()
无法应用WHERE
。
您应该在您的收藏中使用joinField()
,并在store_id
表格中添加catalog_product_entity_varchar
列。
修改强>
很抱歉让你久等;)
$collection = Mage::getResourceModel('catalog/product_collection');
$collection->joinField('store_id', 'catalog_category_product_index', 'store_id', 'product_id=entity_id', '{{table}}.store_id = 1', 'left');
$collection->getSelect()->distinct(true);
这应该可以解决问题,但为了确定,请检查您是否获得了正确的产品:)
答案 1 :(得分:3)
这对我有用:
Mage::app()->setCurrentStore($storeId);
$productCollection = Mage::getModel('catalog/product')
->getCollection()
->addStoreFilter()
->addAttributeToSelect(array('sku','price'));
答案 2 :(得分:2)
好吧,我认为这样做有效,没有经过太多测试,但似乎已经完成了诀窍。您需要首先获取商店根类别ID,然后加入一些字段,以便您可以访问产品“category_id”,然后使用以下内容进行过滤:
$_rootcatID = Mage::app()->getStore()->getRootCategoryId();
$_testproductCollection = Mage::getResourceModel('catalog/product_collection')
->joinField('category_id','catalog/category_product','category_id','product_id=entity_id',null,'left')
->addAttributeToFilter('category_id', array('in' => $_rootcatID))
->addAttributeToSelect('*');
$_testproductCollection->load();
foreach($_testproductCollection as $_testproduct){
echo $this->htmlEscape($_testproduct->getName())."<br/>";
};
答案 3 :(得分:0)
我认为
您不需要进行任何连接,因为magento的setStoreId()可以正常工作。
$collection = Mage::getModel("catalog/product")
->getCollection()
->setStoreId(1) //change store Id according your needs
->addAttributeToSelect(array('name','url','sku'))
->setPageSize(20);
这将从商店ID 1获得最多20个产品