首页 文章

以编程方式更新后缺少Magento产品

提问于
浏览
2

我在编程上以Magento批量更新产品时遇到了一个奇怪的问题 .

我有一个脚本,它获得了一个类别模型,然后是一个由制造商过滤的该类别产品的产品集合(所以我在给定类别中由制造商更新所有产品) . 然后,我遍历产品并更新属性(大小调整表),并保存产品 .

这是执行此操作的功能:

<?php

function updateManufacturerSizingTable($store, $categoryId, $manufacturerId, $tableHtml) {
        $categoryObject = Mage::getModel('catalog/category')->load($categoryId);

        $collection = Mage::getResourceModel('catalog/product_collection')
                                        ->addCategoryFilter($categoryObject)
                                        ->addAttributeToSelect('*')
                                        ->addAttributeToFilter('manufacturer', $manufacturerId)
                                        ->setStore($store)
                                        ->addStoreFilter($store)
                                        ->setOrder('name')
                                        ->load();

        foreach ($collection as $product) {
                $data = $product->getData();
                echo '--> Updating ' . $data['name']. PHP_EOL;
                $product->setData('sizing', $tableHtml);
                $product->save();
        }
}

?>

它工作正常,但它对前端的Magento类别(更新脚本中涉及的类别)产生了奇怪的副作用 . 看似随意,产品将从它们所属的一些(不是全部)类别中消失 . 例如,产品将属于A类和B类,其中B是A的子级,并且在大小更新大小属性后将出现在A但不是B中 .

我认为这与索引有关 . 我已经尝试过使用命令行reindex

php path/to/mage/shell/indexer.php reindexall

它似乎执行正常,并更新index_process表中的时间戳 . 但是,所有索引都显示为'Pending',而.lock文件存在于var / locks中,并且没有任何条目可以index_event报告有关reindex的任何内容 .

我已经将代码添加到批量更新脚本中,该脚本在更新,执行更新,执行reindexAll以及将索引恢复到实时之前将索引转换为手动 . 它工作(如同,没有报告错误),但类别列表仍然在前端打破/怪异 .

<?php

/* Set indexing to manual for the updating */
echo '== Disabling indexing before the import ==' . PHP_EOL;
$processes = Mage::getSingleton('index/indexer')->getProcessesCollection();
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_MANUAL));
$processes->walk('save');

echo '== Beginning update ==' . PHP_EOL;

/* In a loop call the updateManufacturerSizingTable function */

echo '== Reindexing and re-enabling indexing  ==' . PHP_EOL;
/* Set indexing back to on-save and reindex */
$processes->walk('reindexAll');
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_REAL_TIME));
$processes->walk('save');

?>

就在我写完这篇文章并刷新一个以前没有产品展示的类别页面时(由于这个问题),产品已经退回 . index_event中没有新条目,index_process仍然报告运行命令行reindexall时设置的相同时间戳 .

是否有可能重新索引实际上并未在reindexall进程中运行,并且它可能正在其他地方执行?这可能解释了为什么它会在脚本运行后逐步恢复损坏的类别(很长一段时间后,我们谈论了差不多一个小时),但Magento没有报告索引处理的任何地方?

1 回答

  • 1

    更新产品时,您需要将商店ID设置为Admin,尝试添加

    Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Mode‌l_App::ADMIN_STORE_ID));
    

相关问题