Magento - addStoreFilter不工作?

时间:2011-02-21 17:44:44

标签: magento

在Magento中获取产品集合时,我希望StoreFilter能够做到这一点,按当前商店进行过滤。但我无法让它发挥作用。

假设我设置了2个商店:enter image description here

两家商店都有不同的根类别。 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是正确的。

4 个答案:

答案 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个产品