2015-06-20 2 views
5

Я попытался заставить это работать, но он не может найти решение. Я ищу, чтобы запустить существующий профиль потока данных, который имеет ID = 3, и имеет уже имя файла импорта.Run Magento 1.9.1.0 Профиль импорта данных потока Programmatically

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

Running профиль в вопросе (ID = 3) из Бэкэндинг Magento отлично работает, просто не может показаться, что он может вызвать это из функции PHP выше.

Я ищу способ запуска программного профиля «Импорт всех продуктов» программно.

Другие сообщения, вопросы и сайты я сталкивался, но не имели никакого успеха с ними:

Любой и вся помощь будет высоко оценена!

Спасибо!

ответ

5

После многих разочарований, вот ответ, который работает:

Обратите внимание, что в этом случае я сконфигурированный по умолчанию Magento DataFlow профиль в течение Импорта Всех продуктов (ID: 3) для чтения в формате импорт XML , из предопределенного файла. Это файл, который я создаю по мере необходимости до запуска операций импорта. (Смотрите на скриншот в вопросе выше)

После того, как вы ваш профиль, созданный вам нужно 2 файла:

  • importer.php
  • batch_importer_processor.php

Вы можете поместите файлы в каталог /magento/root/shell/ или настройте пути по мере необходимости, если вы включаете их в отдельное место. После того, как в каталоге, вы можете вызвать вызвать операцию через хрон с помощью:

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 и установите переменную $ profile_id с требуемым значением.

Я включил вызовы в журнал Magento (Mage :: log) с соответствующими инструкциями эха ниже, если вы предпочитаете этот маршрут. При необходимости отредактируйте. Журналы должны быть сохранены в каталоге /magento/root/var/log/. Не забудьте включить эту функцию в интерфейсе Magento, перейдя на:

  • Система> Конфигурация> Дополнительно> Разработчик> Log Settings

и настройка включена в "Да" смотрите ниже:

Magento Developer Logging Functionality

После запуска файла importer.php, вы должны иметь 2 файла журнала в /Magento/корень/вар/журнал/ каталог:

  • system.log
  • magento_import.log

Вы также можете иметь exception.log файл, который всегда включен.

Это единственное решение, которое я нашел для работы с Magento 1.9.1.0, спасибо Андрею за вдохновение.

Любые мысли или улучшения всегда приветствуются.

+0

Это сработало для меня с одной модификацией: я установил $ username для имени пользователя admin перед строкой '$ user = Mage :: getModel ('admin/user') -> loadByUsername ($ username);' – boot13

Смежные вопросы