【问题标题】:Magento - addStoreFilter not working?Magento - addStoreFilter 不起作用?
【发布时间】:2011-02-21 17:44:44
【问题描述】:

在 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 中只有一种产品,那么为什么我将所有商店的所有产品都退回?我可以将 Main Store 中的每个产品都设置为不在 Store2 中显示,然后添加可见性过滤器,但这会花很长时间。

另外,我刚刚注意到,如果我回显产品商店 ID,我会得到当前 ID,而不是分配给它的商店:

echo $_testproduct->getStoreId()

发生了什么事?

更新(2011 年 4 月 8 日): 好的,所以我尝试加入字段以便包含 store_id(如下所示),代码部分 {{table}}.store_id = 1 只是将所有产品设置为具有 store_id of 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 是正确的。

【问题讨论】:

  • 什么版本的magento?
  • 目前有没有解决方案,遇到同样的问题。我绝对需要一个特殊的 storeview 的 productcollection。我有一个网站,4 个商店视图(2 家商店的 2 种语言),它们划分了一些类别,而另一些则没有。我是 magento 的新手,所以我不明白 joinField() 的事情。有没有例子或其他解决方案。
  • 见这里 - stackoverflow.com/questions/5078752/… - 我最终改为按根类别过滤。
  • 按 root 过滤是非常错误的,所以现在回到这个试图弄清楚它是否会工作......请参阅上面的更新
  • 我的按商店进行类别过滤的解决方案)[stackoverflow.com/a/19284088/1266559][1] [1]:stackoverflow.com/a/19284088/1266559

标签: magento


【解决方案1】:

$_testproductCollection 应该看起来像这样$_testproductCollection = Mage::getResourceModel('reports/product_collection')-&gt;addAttributeToSelect('*')-&gt;addStoreFilter()

如果您从该集合中打印SELECT,您将看到没有任何存储列,因此addStoreFilter() 无法应用WHERE

您应该在您的收藏中使用joinField(),并从catalog_product_entity_varchar 表中添加store_id 列。

编辑

抱歉让您久等了;)

$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);

这应该可以解决问题,但为了确定,请检查您是否获得了正确的产品 :)

【讨论】:

  • addStoreFilter 不会对商店的根类别或类似内容添加任何检查,它只会过滤产品的非全局属性。这仅对在管理员中使用“选择商店视图”框时已编辑的产品有影响。 store_id 本身并不是一个属性,它只是其他属性的一个属性。
  • 这就是为什么我建议joinField() 并缩短资源模型加载调用。
  • 我当时在想,也许按根类别过滤是可行的方法,因为这几乎可以完成同样的事情,但这似乎也不起作用 - 见这里 - stackoverflow.com/questions/5078752/…
  • 您能否举例说明如何加入这些字段?我在网上找到了一些示例,但还没有设法将可行的东西拼凑在一起!
【解决方案2】:

这对我有用:

Mage::app()->setCurrentStore($storeId); 
$productCollection = Mage::getModel('catalog/product')
            ->getCollection()
            ->addStoreFilter()
            ->addAttributeToSelect(array('sku','price'));

【讨论】:

  • 这在您按商店特定属性选择/过滤时特别有用。在那种情况下,使用 -&gt;setStoreId($storeId) 似乎不会产生正确的查询。
【解决方案3】:

好的,我认为这可行,尚未进行太多测试,但似乎已经成功了。您需要首先获取您的商店根类别 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/>"; 
};

【讨论】:

    【解决方案4】:

    我认为

    你不需要做任何连接,因为 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 种产品

    【讨论】:

      猜你喜欢
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-21
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多