2013-05-02 86 views
3

我試圖構建「現貨」或「可銷售」的所有可配置產品的產品集合。這些需要使用兩種不同的型號。我的工作方法是:Magento:構建庫存中所有可配置產品的定製產品集合

$collectionConfigurable = Mage::getResourceModel('catalog/product_collection')->addAttributeToFilter('type_id', array('eq' => 'configurable')); 

foreach ($collectionConfigurable as $_configurableproduct) { 
    $product = Mage::getModel('catalog/product')->load($_configurableproduct->getId()); 

    if ($product->isSaleable()) { 
// do something 
} 
} 

但是這個劇本實在是太慢了,我有一種感覺它浪費了資源運行,因爲它會加載並通過各種配置的產品去。

我想要實現的是獲得$ collectionConfigurable,並使其僅限於庫存項目。

另一種資源引用此作爲獲取庫存項目的方法。

Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($this->_productCollection); 

但我不知道如何將它們合併或正確地使用它,我已經試過這樣:

$collectionConfigurable = Mage::getResourceModel('catalog/product_collection')->addAttributeToFilter('type_id', array('eq' => 'configurable')); 
$instockConfigs = Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($collectionconfigurable); 

這將返回與以下錯誤:

Fatal error: Call to a member function joinField() on a non-object in /srv/magento/app/code/core/Mage/CatalogInventory/Model/Resource/Stock.php on line 197 

回答

2

我「天真到股票系統的更好的細節」的做法將是到

  1. 創建庫存項目集合,僅抓取庫存項目。

  2. 使用所收集的產品ID

該代碼使用該集合來創建的inStock產品ID的數組

  • 與可配置過濾器創建一個產物收集,以及一個ENTITY_ID濾波器因爲這看起來像這樣。

    //create a stock item collection with a `is_in_stock` filter 
    $collection = Mage::getModel('cataloginventory/stock') 
    ->getItemCollection() 
    ->addFieldToFilter('is_in_stock'); 
    
    //capture the product ids of the in stock stock items 
    $product_ids = array(); 
    foreach($collection as $item) 
    { 
        $product_ids[] = $item->getProductId(); 
    } 
    
    $products = Mage::getModel('catalog/product') 
    ->getCollection() 
    ->addAttributeToSelect('*') 
    ->addFieldToFilter('entity_id',array('in'=>$product_ids)) 
    ->addFieldToFilter('type_id','configurable'); 
    
    foreach($products as $product) 
    { 
        var_dump($product->getData()); 
    } 
    

    這就是說,你的代碼是緩慢的,部分是因爲你重裝循環內的每個產品,產生了一系列新的SQL語句

    $product = Mage::getModel('catalog/product')->load($_configurableproduct->getId()); 
    

    此外,addInStockFilterToCollection只適用於一個Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Link_Product_Collection集合。看看該方法的文檔塊。

    /** 
    * Adds filtering for collection to return only in stock products 
    * 
    * @param Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Link_Product_Collection $collection 
    * @return Mage_CatalogInventory_Model_Stock $this 
    */ 
    public function addInStockFilterToCollection($collection) 
    { 
        $this->getResource()->setInStockFilterToCollection($collection); 
        return $this; 
    } 
    
  • +0

    恥辱,他們沒有鍵入暗示([儘管他們可能在新版本(http://docs.magentocommerce.com/Mage_CatalogInventory/Mage_CatalogInventory_Model_Stock.html#addInStockFilterToCollection)) – 2013-05-02 06:29:33

    +0

    @SteveRobbins傳統觀點它的類型提示帶來了性能開銷,特別是Magento的舊版PHP(5.2)目標。很容易明白爲什麼提供應用程序的團隊意味着廣泛部署會放棄類型提示以支持docblock提示。 – 2013-05-02 07:07:54

    相關問題