首页 > 解决方案 > 在循环中过滤产品集合并检索库存数量

问题描述

我正在尝试编写一个库存导入脚本来从远程 XML 提要更新库存,但我无法过滤我的产品集合以获取当前的库存数量。

我在提要中没有产品 ID 或 SKU,但有产品属性,所有这些属性结合起来找到唯一的产品记录,因此我不得不使用它们来过滤我的收藏。

这是 XML 提要的示例

<?xml version="1.0" encoding="UTF-8"?>
<STOREITEMS>
<PRODUCT ITEM="786766786">
<STOCK>8</STOCK>
</PRODUCT>
<PRODUCT ITEM="766766867">
<STOCK>0</STOCK>
</PRODUCT>
<PRODUCT ITEM="768767868">
<STOCK Size="S/M" Color="White">2</STOCK>
<STOCK Size="M/L" Color="White">2</STOCK>
<STOCK Size="S/M" Color="Black">2</STOCK>
<STOCK Size="M/L" Color="Black">2</STOCK>
</PRODUCT>
<PRODUCT ITEM="897897897">
<STOCK>2</STOCK>
</PRODUCT>
</STOREITEMS>

因此,在示例中检索独特产品所需的属性将是“item”、“size”和“color”。

到目前为止我的代码看起来像这样

libxml_use_internal_errors(true);

$products = Mage::getResourceModel('catalog/product_collection')->addAttributeToSelect('*');

$xmldata = simplexml_load_file($remotefeed);
    
foreach ($xmldata->children() as $product) {

    $products->addFieldToFilter('item', strtolower($product['ITEM']));

    foreach ($product->STOCK as $feedQty) {

        $atts = $feedQty->attributes();

        if (!empty($atts)) {
            foreach ($atts as $key => $value) {
                $products->addFieldToFilter(strtolower($key), strtolower($value));
            }
        }

        $product = $products->load()->getFirstItem();
           
        $stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product);

        $stockItem->setQty($feedQty);
        $stockItem->save();
    }
}

正如我所说,我无法过滤产品集合并获得当前库存 - $mageQty 根本没有返回任何东西。

我知道我很可能在这里犯了几个错误,但到目前为止还没有在网上找到任何有帮助的指导 - 谁能告诉我我哪里出错了?

标签: phpsimplexmlmagento-1.9

解决方案


我不完全清楚您要做什么,但是如果其中一部分是从每个<STOCK>节点中提取文本值,则以下内容会将它们提取到一个数组中,您以后可以将其用于任何目的。

由于您正在处理 xml,因此 xpath 是提取数据的最佳方式:

$string = <<<XML
//[your xml above]
XML;

$xml = simplexml_load_string($string);
$stocks = $xml->xpath("//PRODUCT/STOCK//text()");
foreach ($stocks as $stock) {
echo $stock , ' ';}

输出:

8 0 2 2 2 2 2 

推荐阅读