Magento:构建库存中所有可配置产品的定制产品系列

时间:2013-05-02 00:42:03

标签: php magento magento-1.7

我正在尝试构建所有可配置产品的产品系列,这些产品是“库存”或“可销售”。这些需要使用两种不同的型号。我的工作方法是:

$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

1 个答案:

答案 0 :(得分:2)

我对“库存系统更精细的细节”的方法是

  1. 创建库存项目集合,仅获取库存项目。

  2. 使用该集合创建一个instock产品ID数组

  3. 使用可配置的过滤器创建产品集合,使用收集的产品ID创建entity_id过滤器

  4. 该代码看起来像这样。

    //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集合。看一下方法的doc块。

    /**
     * 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;
    }