2015-06-20 70 views
5

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

Magento Dataflow Profiles

Dataflow Profile Settings

所有我已经做了研究,导致下面的代码的一些变化:

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

运行相关个人资料(ID = 3)从Magento后端工作完美,似乎无法从上面的PHP函数中触发。

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

其他职位,问题和网站我碰到过,但曾与他们没有成功:

任何所有的帮助将非常感谢!

谢谢!

回答

5

太多的无奈之后,这里的作品答案:

注意,在这种情况下,我已经配置了默认的Magento数据流档案进口所有产品(ID:3)以XML导入格式阅读,从一个预定义的文件。这是我在运行导入操作之前根据需要创建的文件。

  • importer.php
  • batch_importer_processor.php

您可以:一旦你创建了概要文件,你需要2个文件(请参阅屏幕截图上面的问题)

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

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

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

来源为每个文件是:

进口商。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)调用。根据需要编辑。日志应保存在/magento/root/var/log/目录中。请务必前往,以便能够在Magento的后端此功能:

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

和设置启用“是”见下图:

Magento Developer Logging Functionality

运行importer.php文件后,你应该有2个日志文件在/Magento的/根/无功/日志/目录:

  • SYSTEM.LOG
  • magento_import.log

您还可能有exception.log文件,它始终处于启用状态。

这是我发现与Magento 1.9.1.0一起使用的唯一解决方案,非常感谢Andrey的灵感。

任何想法或改进总是受欢迎的。

+0

这对我来说有一个修改:我在$ user = Mage :: getModel('admin/user') - > loadByUsername($ username);行之前设置了$ username到admin用户名; – boot13

相关问题