Magento: 构建所有可配置产品的现货自定义产品集合

3

我正在尝试构建一个产品集合,其中包含所有“有库存”或“可销售”的可配置产品。这需要使用两种不同的模型。我的工作方法是:

$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个回答

2

我对股票系统的细节不太熟悉,我的方法是:

  1. 创建一个库存商品集合,只获取有库存的商品。

  2. 使用该集合创建一个有库存产品ID数组。

  3. 创建一个产品集合,并使用可配置过滤器以及使用收集的产品ID的实体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;
}

真遗憾他们没有对此进行类型提示(尽管在更新版本中可能已经有了)。 - Steve Robbins
@SteveRobbins 传统智慧认为类型提示会带来性能开销,特别是在 Magento 目标的旧版本 PHP(5.2)中。很容易理解为什么一个面向广泛部署的应用程序团队会放弃类型提示,转而使用文档块提示。 - Alana Storm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接