0

私はマジェントに非常に慣れていないので、以下のコードを見てください。異なる基準で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

この問題で私を助けてくれてありがとう。

私は解決策を見つけました。それはシンプルで、新しい製品を _productCollection オブジェクトに簡単に追加できる addItem() があります。

唯一のトリックは、空のコレクションをロードすることです

//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 に答える
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 に答える