php - Magento:构建库存中所有可配置产品的自定义产品集合

标签 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. 创建库存商品集合,仅抓取库存商品。

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

  3. 使用可配置过滤器创建产品集合,并使用收集的产品 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 集合。查看方法上的文档 block 。

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

关于php - Magento:构建库存中所有可配置产品的自定义产品集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16328651/

相关文章:

magento - PayPal 网关拒绝了请求。字段格式错误 : 10431-Item amount is invalid

javascript - 在目录中打开/保存 Excel 文件

php - 在 <a> 标签内添加一个 <div>

php - 使用 POST 提交表单后数据未显示

shell - 在 Magento shell 脚本中使用 getUrl

forms - Magento,在网格和表单后端添加并设置一个复选框

magento - 使用自定义渲染器过滤网格

magento - 如何在 magento 中将产品从子类别移动到其根类别

php - 使用 Javascript 将图像大小变量传递到 PHP 页面

php - 如何在sql查询中使用Arraylist?