【问题标题】:Run Magento 1.9.1.0 Dataflow Import Profile Programmatically以编程方式运行 Magento 1.9.1.0 数据流导入配置文件
【发布时间】:2015-09-06 03:46:18
【问题描述】:

我试图让这个工作,但它似乎无法找到解决方案。我正在寻找运行 ID = 3 并且已配置导入文件名的现有数据流配置文件。

我所做的所有研究都导致了以下代码的一些变化:

public function importProducts($profile_id = 3)
{

    require_once('../app/Mage.php');

    Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

    // Instantiate a session for the "root" user.
    $userModel = Mage::getModel('admin/user');
    $userModel->setUserId(0);
    Mage::getSingleton('admin/session')->setUser($userModel);

    // Load the dataflow profile.
    $profile = Mage::getModel('dataflow/profile');
    $profile->load($profile_id);
    if (!$profile->getId()) {
        exit("Profile with id #{$profile_id} does not exist.");
    }

    $profile->run();

    $batchModel = Mage::getSingleton('dataflow/batch');

    // Reporting.
    $direction = ucwords($profile->getDirection());
    $success = "{$direction} with id #{$batchModel->getId()} completed succesfully.\n";

    echo $success;

    return true;
}

从 Magento 后端运行有问题的配置文件 (ID = 3) 效果很好,只是似乎无法从上面的 PHP 函数中触发它。

我正在寻找一种以编程方式触发“导入所有产品”数据流配置文件的方法。

我遇到但没有成功的其他帖子、问题和网站:

我们将不胜感激任何和所有的帮助!

谢谢!

【问题讨论】:

    标签: php xml magento import dataflow


    【解决方案1】:

    经过一番挫折,以下是有效的答案:

    请注意,在这种情况下,我为 导入所有产品 (ID: 3) 配置了默认的 Magento 数据流配置文件,以便从预定义的文件以 XML 导入格式读取。这是我在运行导入操作之前根据需要创建的文件。 (参考上题截图)

    创建个人资料后,您需要 2 个文件:

    • importer.php
    • batch_importer_processor.php

    您可以将文件放在 /magento/root/shell/ 目录中,或者如果您要包含在单独的位置,则根据需要调整路径。进入目录后,您可以使用以下命令通过 cron 调用触发操作:

        php -f /path/to/magento/root/directory/shell/importer.php
    

    上面的-f参数是“解析并执行”被调用的文件。

    每个文件的来源是:

    importer.php

    <?php         
    
        require_once '../app/Mage.php';
    
        set_time_limit(0);
        ini_set('memory_limit', '128M');
    
        $root       = "/path/to/your/magento/root/directory/";
        $logFile    = 'magento_import.log';
    
        umask(0);
        $app = Mage::app('default');
    
        Mage::log("========================== BEGIN IMPORT ==========================", null, $logFile);
        //echo "========================== BEGIN IMPORT ==========================\n";
    
        // Login Admin User
    
        Mage::getSingleton('core/session', array('name' => 'adminhtml'));
    
        $user = Mage::getModel('admin/user')->loadByUsername($username);
    
        if (Mage::getSingleton('adminhtml/url')->useSecretKey()) {
          Mage::getSingleton('adminhtml/url')->renewSecretUrls();
        }
    
        $session = Mage::getSingleton('admin/session');
        $session->setIsFirstVisit(true);
        $session->setUser($user);
        $session->setAcl(Mage::getResourceModel('admin/acl')->loadAcl());
        Mage::dispatchEvent('admin_session_user_login_success',array('user'=>$user));
    
        if ($session->isLoggedIn()) {
    
            Mage::log("User '" . $username . "' logged in.", null, $logFile);
            //echo "User '" . $username . "' logged in.\n";
    
        } else {
    
            Mage::log("ERROR: Could not login as user '" . $username . "'.", null, $logFile);
            //echo "ERROR: Could not login as user '" . $username . "'.\n";
    
        }
    
        // Load DataFlow Profile
    
        $profile_id = 3;
    
        $profile = Mage::getModel('dataflow/profile');
    
        $profile->load($profile_id);
    
        if (!$profile->getId()) {
    
            Mage::log("ERROR: Profile with ID #{$profile_id} does not exist.", null, $logFile);
            //echo "ERROR: Profile with ID #{$profile_id} does not exist.\n";
            exit;
    
        }
    
        Mage::register('current_convert_profile', $profile);
    
        $profile->run();
    
        // Begin Bactch Processing
    
        // Limit of products per batch (max: 50)
        $batchLimit = 50;
    
        function convert($size)
        {
    
            $unit=array('b','kb','mb','gb','tb','pb');
    
            return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
    
        }
    
        $batchModel = Mage::getSingleton('dataflow/batch');
    
        if (!$batchModel->getId()) {
    
            Mage::log(convert(memory_get_usage()) . " - ERROR: Can't get batchModel", null, $logFile);
            //echo convert(memory_get_usage()) . " - ERROR: Can't get batchModel\n";
            exit;
    
        }
    
        if (!$batchModel->getAdapter()) {
    
            Mage::log(convert(memory_get_usage()) . " - ERROR: Can't getAdapter", null, $logFile);
            //echo convert(memory_get_usage()) . " - ERROR: Can't getAdapter\n";
            exit;
    
        }
    
        $batchId            = $batchModel->getId();
        $batchImportModel   = $batchModel->getBatchImportModel();
        $importIds          = $batchImportModel->getIdCollection();
    
        $recordCount        = null;
        $totalproducts      = count($importIds);
    
        $saved              = 0;
        $batchArrayIds      = array();
    
        foreach ($importIds as $importId) {
    
            $recordCount++;
    
            $batchArrayIds[] = $importId;
    
            if ($recordCount%$batchLimit == 0 || $recordCount == $totalproducts) {
    
                $paramsArr  = array('batchid' => $batchId, 'ids' => $batchArrayIds);
                $params     = json_encode($paramsArr);
                $result     = array();
    
                exec("php -f {$root}shell/batch_import_processor.php '{$params}'", $result);
    
                $saved += $result[0];
    
                Mage::log(convert(memory_get_usage()) . " - processed {$recordCount}/$totalproducts. Saved {$result[0]} products.", null, $logFile);
                //echo convert(memory_get_usage()) . " - processed {$recordCount}/$totalproducts. Saved {$result[0]} products.\n";
    
                $batchArrayIds = array();
    
            }
    
        }
    
    
        $batchModel = Mage::getModel('dataflow/batch')->load($batchId);
    
        try {
    
            $batchModel->beforeFinish();
    
        } catch (Mage_Core_Exception $e) {
    
            Mage::log(convert(memory_get_usage()) . " - ERROR: ". $e->getMessage(), null, $logFile);
            //echo convert(memory_get_usage()) . " - ERROR: ". $e->getMessage() . "\n";
    
        } catch (Exception $e) {
    
            Mage::log(convert(memory_get_usage()) . " - ERROR: An error occurred while finishing process. Please refresh the cache" . $e->getMessage(), null, $logFile);
            //echo convert(memory_get_usage()) . " - ERROR: An error occurred while finishing process. Please refresh the cache" . $e->getMessage() . "\n";
    
        }
    
        $batchModel->delete();
    
        // Output Debugging Info
        foreach ($profile->getExceptions() as $e) {
    
            Mage::log(convert(memory_get_usage()) . " - " . $e->getMessage(), null, $logFile);
            //echo convert(memory_get_usage()) . " - " . $e->getMessage() . "\n";
    
        }
    
        Mage::log("IMPORT COMPLETE.", null, $logFile);
        //echo "IMPORT COMPLETE.\n";
    
    ?>
    

    batch_import_processor.php

    <?php
    
        $root       = '/your/path/to/magento/root/directory/';
        $logFile    = 'magento_import.log';
    
        require_once $root . 'app/Mage.php';
    
        set_time_limit(0);
        ini_set('memory_limit', '128M');
    
        ob_implicit_flush();
    
        Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
    
        $params             = $argv[1];
        $paramsArray        = json_decode($params, true);
        $batchId            = $paramsArray['batchid'];
        $importIds          = $paramsArray['ids'];
    
        $saved              = 0;
        $batchModel         = Mage::getModel('dataflow/batch')->load($batchId);
        $batchImportModel   = $batchModel->getBatchImportModel();
        $adapter            = Mage::getModel($batchModel->getAdapter());
    
        $adapter->setBatchParams($batchModel->getParams());
    
        foreach ($importIds as $importId) { 
    
            $batchImportModel->load($importId);
    
            if (!$batchImportModel->getId()) {
    
                Mage::log(convert(memory_get_usage()) . " - ERROR: Skip undefined row {$importId}", null, $logFile);
                //echo convert(memory_get_usage()) . " - ERROR: Skip undefined row {$importId}\n";
                continue;
    
            }
    
            try {
    
                $importData = $batchImportModel->getBatchData();
                $adapter->saveRow($importData);
    
            } catch (Exception $e) {
    
                Mage::log("Exception : " . $e, null, $logFile);
                //echo "Exception : " . $e;
                continue;
    
            }
    
            $saved ++;
    
        }
    
        if (method_exists($adapter, 'getEventPrefix')) {
    
            // Event to process rules relationships after import
            Mage::dispatchEvent($adapter->getEventPrefix() . '_finish_before', array(
            'adapter' => $adapter
            ));
    
            // Clear affected ids for possible reuse
            $adapter->clearAffectedEntityIds();
    
        }
    
        Mage::log("Total Products to Import: " . $saved, null, $logFile);
        echo $saved;
    
    ?>
    

    添加到此代码中并不难,因此如果需要,您可以按顺序运行多个配置文件。否则,请务必从 Magento 后端获取配置文件 ID,并将 $profile_id 变量设置为所需的值。

    如果您更喜欢这条路线,我已经包含了对 Magento Log (Mage::log) 的调用以及下面的相应 echo 语句。根据需要进行编辑。日志应保存在 /magento/root/var/log/ 目录中。请务必在 Magento 后端启用此功能,方法是:

    • 系统 > 配置 > 高级 > 开发人员 > 日志设置

    并将设置启用为“是”,如下所示:

    运行 importer.php 文件后,您应该在 /magento/root/var/log/ 目录中有 2 个日志文件:

    • system.log
    • magento_import.log

    您可能还拥有始终启用的 exception.log 文件。

    这是我发现使用 Magento 1.9.1.0 的唯一解决方案,感谢 Andrey 的启发。

    欢迎任何想法或改进。

    【讨论】:

    • 这对我有用,但有一个修改:我在 $user = Mage::getModel('admin/user')-&gt;loadByUsername($username); 行之前将 $username 设置为管理员用户名
    猜你喜欢
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 2013-07-31
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    相关资源
    最近更新 更多