0

我对 magento 很陌生,请查看下面的代码,我正在尝试在不同的基础上重新排列 productCollection。

$this->_productCollection = $layer->getProductCollection();   
$rearraggedProductCollection=array();

foreach($this->_productCollection as $product)
{

  if($product->getTypeId()=="simple")
  {   
     array_push($rearraggedProductCollection,$product); 
  }

 }
$this->_productCollection = $rearraggedProductCollection;

但这不起作用,任何人的帮助将不胜感激。

4

3 回答 3

1

为什么不对集合应用过滤器?

$this->_productCollection->addAttributeToFilter('type_id', array('eq' => 'simple'))
于 2012-11-16T10:01:39.503 回答
0

我认为您正在寻找的是PHP Clone

foreach($this->_productCollection as $product) {

    if($product->getTypeId()=="simple") {   
        array_push($rearraggedProductCollection, clone $product); 
    }

}

我怀疑以下陈述,我不确定您是否可以重置这样的对象。

$this->_productCollection = $rearraggedProductCollection;

您能否确认您的数组设置正确,将对象视为数组可能会导致一些奇怪的行为。

var_dump每个阶段并尝试找出出错的地方

于 2012-11-16T11:29:51.147 回答
0

谢谢大家帮我解决这个问题。

我找到了解决方案,它很简单,并且有一个 addItem() 可以轻松帮助将新产品添加到 _productCollection 对象。

我唯一的窍门是加载一个空集合

//load an empty collection (filter-less collections will auto-lazy-load everything)
$merged = Mage::getModel('catalog/product')->getCollection()->addFieldToFilter('entity_id',-1);

并且在将产品添加到空表时,我们需要检查产品 ID 不重复,magento 不允许将重复的产品添加到产品集合中

if(!$merged->getItemById($product->getId())) 
{
  $merged->addItem($product);
} 

根据我的要求,整个代码如下

$this->_productCollection = $layer->getProductCollection();

//load an empty collection (filter-less collections will auto-lazy-load everything)
$merged = Mage::getModel('catalog/product')->getCollection()->addFieldToFilter('entity_id',-1);


                /**** Sorting the backorder product first ****/
                foreach($this->_productCollection as $product)
                {
                   if($product->getTypeId()=="simple" && $product->isSaleable())
                    {
                       if(!$merged->getItemById($product->getId())) 
                        {
                            $merged->addItem($product);
                        }        
                    }
                }

                /**** Sorting the avilable product second ****/
                foreach($this->_productCollection as $product)
                {
                   if($product->getTypeId()=="configurable" && $product->isSaleable())
                    {
                       if(!$merged->getItemById($product->getId())) 
                        {
                            $merged->addItem($product);
                        }        
                    }
                }

                 /**** Sorting the sold out product last ****/
                foreach($this->_productCollection as $product)
                {
                   if(!$product->isSaleable())
                    {
                       if(!$merged->getItemById($product->getId())) 
                        {
                            $merged->addItem($product);
                        }        
                    }
                } 

                /* Now assigning to the mergerd collection to the product Collection */
                $this->_productCollection = $merged;
于 2012-11-16T12:41:57.620 回答