2013-02-17 43 views
0

我有产品标签的数组,我想找到的这些标签分配给所有的产品(即返回有标签的所有产品“大”和“红”)。我目前正在使用以下内容,但不能按预期工作。如何通过Magento中的多个标签过滤productCollection?

$this->_productCollection = Mage::getResourceModel('tag/product_collection') 
    ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes()) 
    ->addStoreFilter(Mage::app()->getStore()->getId()) 
    ->addMinimalPrice() 
    ->addUrlRewrite() 
    ->setActiveFilter(); 

foreach ($tags as $tagName) { 
    $tagId = Mage::getModel('tag/tag')->loadByName($tagName)->getId(); 
    $this->_productCollection->addTagFilter($tagId); 
} 

看起来addTagFilter()只适用于一次,而不适用于多个标签。我也曾尝试

$this->_productCollection->getSelect()->Where('relation.tag_id=?', $tagId); 

但同样,添加多个Where(relation.tag_id=?, $tagId)不会出现工作。

回答

0

你一定要收集所有标记ID阵列中的那么

$this->_productCollection->getSelect()->where('relation.tag_id IN (?)', implode(',',$tagId); 
+0

这工作,但不正是我需要的。例如,如果我想获得分配了“红色”和“大”标签的产品,我可能会得到一个只有“红色”标签的产品,但不是“大”。我只想要兼得的产品。 – 2013-02-17 22:21:20

+0

是的,这是一个'OR'请求,为了让它使用'AND',你需要一些更复杂的东西,我会调查 – dagfr 2013-02-18 07:47:25

+1

你可以尝试使用第一个标签获得所有产品,然后使用其他产品一个(与您尝试的第一个请求),然后比较集合以获得两个集合中的产品 – dagfr 2013-02-18 07:48:51

0

$ prodids =阵列(); //阵列产品ID $标签名=阵列( “Awesomeee”, “黑”); //你的标签名

     foreach ($tagName as $_tagname) { 
          $tagId=Mage::getModel('tag/tag')->loadByName($_tagname)->getId(); 
          $collections = Mage::getResourceModel('tag/product_collection') 
           ->addAttributeToSelect('sku') 
           ->addAttributeToSelect('name') 
           ->addTagFilter($tagId); 
          $productIDs = $collections->getData(); 

          foreach($productIDs as $_product){ 
           array_push($prodids,$_product['product_id']); 
          } 
         } 


         $collection = Mage::getModel('catalog/product') 
          ->getCollection() 
          ->addAttributeToSelect('*') 
          ->addAttributeToFilter('entity_id', array('in' => $prodids)); 

$ _productCollection = $集合; //最终产品收集

1

我碰到这个非常有趣的问题,来的时候我试图用VA过滤产品集合泰伦从多选属性创建的,因为它,因为它适用于任何其他属性没有工作那么容易,即

$product_collection->addAttributeToFilter('attribute_code',"some value") 

收集过滤器提供了一个过滤条件“finset”,它可以帮助我们过滤属性值在一套里面。

首先,我们需要获取的属性的不同值的ID,如下所示:

$attributeOptionArray=array(); 
$opts_attr = Mage::getModel('eav/config')->getAttribute('catalog_product', 'attribute_code'); 
foreach ($opts_attr->getSource()->getAllOptions(true, true) as $option){ 
$attributeOptionArray[$option['value']] = $option['label']; 
} 

接下来,我们需要使用这个数组属性值的整个产品选项过滤:

$product_collection=Mage::getModel("catalog/product")->getCollection(); 
$product_collection->addAttributeToFilter("attribute_code",array('finset'=>array_search("Some Option's label",$attributeOptionArray))); 

说明:

  1. 首先,我们将产品集合加载到变量

  2. 我们添加“attributeToFilter”,以指定过滤条件。

  3. 随着array_search条件,我们试图找到对应选项的标签的ID。

  4. 通过这个ID与finset条件进行筛选。

希望这会有所帮助。