我正在开发一个Magento扩展,允许用户将不同网上商店解决方案中的类别,产品和其他类型的数据导入Magento。为了实现这一目标,我设置了几个负责导入的DataFlow高级配置文件。
到目前为止它工作正常,但配置文件需要以适当的顺序运行(第一类,然后是产品等)。为了使非技术用户尽可能轻松,并尽量减少人为错误的可能性,我想按顺序自动运行配置文件。理想情况下,您只需按一个“运行配置文件”按钮,然后观察草生长几个小时,同时DataFlow处理配置文件。
我似乎无法实现这一目标。我的主要问题是 - 这可能吗?如果是,那怎么样?
我尝试在同一个XML文件中组合多个配置文件(字面意思只是在一个XML中复制粘贴2个配置文件),但这不起作用。解析了输入文件,但不管怎样,负责实际导入的Adapter类都没有运行。
有没有办法告诉个人资料在完成时开始另一个个人资料(例如通过“完成”方法)? 或者我应该写一个小的控制面板,你可以点击“运行”按钮然后控制面板通过一些AJAX巫毒来处理序列?
遗憾的是,使用命令行脚本不是一种选择,也没有使用Magmi。
为了完整起见,我必须提及所有配置文件包括:
答案 0 :(得分:3)
这就是我将一个配置文件作为更大的cron作业的一部分运行的方式。它应该很容易使它运行几个配置文件。你应该可以通过按下按钮来运行它。 此脚本伪造管理员用户登录后端并按下某些按钮。它看起来有点复杂,但这是其他一些方法无法正常工作后唯一的工作方法,因为脚本是作为一个cron作业运行的。
将两个脚本文件放在magento根目录的shell文件夹中:
mag_import.php:
<?php
/**
* Path to the root of your magento installation
*/
$root = '/absolute/path/to/your/magento/root/';
/**
* Url to your magento shop.
*/
$url = 'http://www.mygreatwebshop.url/';
/**
* relative path from the magento root to the login file.
*/
$login = 'shell/mag_login.php';
/**
* name of the logfile, will be places in magentoroot/var/log/
*/
$logFileName = 'import.log';
/**
* how many products will be parsed at each post. Usually 10-50.
*/
$atOnce = 25;
/**
* Dataflow profile id
*/
$profileId = 8;
/**
* DO NOT EDIT BELOW THIS LINE
*/
function convert($size) {
$unit = array('b', 'kb', 'mb', 'gb', 'tb', 'pb');
return @round($size / pow(1024, ($i = floor(log($size, 1024)))), 2) . ' ' . $unit[$i];
}
set_time_limit(0);
if (!isset($profileId)) {
exit("\nPlease specify a profile id. You can find it in the admin panel->Import/Export->Profiles.\nUsage: \n\t\t php -f $argv[0] PROFILE_ID\n\t example: php -f $argv[0] 7\n");
}
$recordCount = 0;
require_once $root . 'app/Mage.php';
ob_implicit_flush();
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
//starting the import
Mage::log("\n\n", null, $logFileName);
Mage::log(convert(memory_get_usage()) . " - " . "STARTING IMPORT", null, $logFileName);
$profile = Mage::getModel('dataflow/profile');
$userModel = Mage::getModel('admin/user');
$userModel->setUserId(0);
Mage::getSingleton('admin/session')->setUser($userModel);
if ($profileId) {
$profile->load($profileId);
if (!$profile->getId()) {
Mage::getSingleton('adminhtml/session')->addError('ERROR: Could not load profile');
}
}
/**
* get the login information.
*/
exec("/usr/bin/php -f {$root}{$login}", $result);
$loginInformation = json_decode($result[0]);
$sessionId = $loginInformation->sessionId;
$formKey = $loginInformation->formKey;
//clean dataflow_batch_import table so it doesn't get amazingly big.
$db = Mage::getSingleton('core/resource')->getConnection('core_write');
$db->query("TRUNCATE TABLE `dataflow_batch_import`");
Mage::log(convert(memory_get_usage()) . " - " . "Table dataflow_batch_import cleaned", null, $logFileName);
//load profile
if ($profileId) {
$profile->load($profileId);
if (!$profile->getId()) {
Mage::getSingleton('adminhtml/session')->addError('ERROR: Could not load profile');
}
}
Mage::register('current_convert_profile', $profile);
//run the profile
Mage::log(convert(memory_get_usage()) . " - " . "Preparing profile...", null, $logFileName);
$profile->run();
Mage::log(convert(memory_get_usage()) . " - " . "...Done", null, $logFileName);
//get to work
$batchModel = Mage::getSingleton('dataflow/batch');
if ($batchModel->getId()) {
//echo "getId ok\n";
if ($batchModel->getAdapter()) {
//echo "getAdapter ok\n";
$batchId = $batchModel->getId();
Mage::log(convert(memory_get_usage()) . " - " . "Loaded batch id $batchId", null, $logFileName);
$batchImportModel = $batchModel->getBatchImportModel();
$importIds = $batchImportModel->getIdCollection();
$batchModel = Mage::getModel('dataflow/batch')->load($batchId);
$adapter = Mage::getModel($batchModel->getAdapter());
$postdata = array();
$postnum = 0;
$totalproducts = count($importIds);
Mage::log(convert(memory_get_usage()) . " - 0/{$totalproducts}", null, $logFileName);
foreach ($importIds as $importId) {
//echo "importing $importId\n";
$recordCount++;
$postdata[] = "rows[]=$importId";
//echo "$importId ";
if ($recordCount % $atOnce == 0 || $recordCount == $totalproducts) {
$postnum++;
$postdata[] = "batch_id=$batchId";
$postdata[] = "form_key=$formKey";
$postdatastring = implode('&', $postdata);
$postdata = array();
//print_r($postdatastring);
Mage::log(convert(memory_get_usage()) . " - Start cURL request #$postnum", null, $logFileName);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url . "index.php/admin/system_convert_profile/batchRun/?isAjax=true");
curl_setopt($ch, CURLOPT_TIMEOUT, 200);
curl_setopt($ch, CURLOPT_COOKIE, "adminhtml=$sessionId");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdatastring);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$buffer = curl_exec($ch);
if (empty($buffer)) {
Mage::log(convert(memory_get_usage()) . " - {$recordCount}/{$totalproducts} - Response is empty - ERROR" . curl_error($ch), null, $logFileName);
} else {
$result = json_decode($buffer);
Mage::log(convert(memory_get_usage()) . " - {$recordCount}/{$totalproducts} [$buffer]", null, $logFileName);
if (@count($result->errors)) {
foreach ($result->errors as $error) {
Mage::log(convert(memory_get_usage()) . " - ERROR: $error", null, $logFileName);
}
}
}
curl_close($ch);
}
}
foreach ($profile->getExceptions() as $e) {
Mage::log(convert(memory_get_usage()) . " - " . $e->getMessage(), null, $logFileName);
}
}
}
Mage::log(convert(memory_get_usage()) . " - " . "Completed!", null, $logFileName);
?>
mag_login.php:
<?php
/**
* Path to the root of your magento installation.
* include traing slash.
*/
$root = '/absolute/path/to/your/magento/root/'
/**
* Backend username that has the rights to import products.
*/
$username = "username";
/**
* Password
*/
$password = "password";
/**
* DO NOT EDIT BELOW THIS LINE
*/
require_once $root.'app/Mage.php';
umask(0);
Mage::app();
$user = Mage::getModel('admin/user');
if ($user->authenticate($username, $password))
{
Mage::getSingleton('admin/session')->setUser($user);
if ($user->getId())
{
if (Mage::getSingleton('adminhtml/url')->useSecretKey()) {
Mage::getSingleton('adminhtml/url')->renewSecretUrls();
}
$session = Mage::getSingleton("admin/session");
//Change the owner of the session file on root/var/session/ to the user that runs the webserver
//exec("chown nobody:nobody {$root}var/session/sess_".$session->getEncryptedSessionId());
echo json_encode(array('sessionId' => $session->getEncryptedSessionId(), 'formKey' => Mage::getSingleton('core/session')->getFormKey()));
}
}
?>
我不久前找到了这些脚本,并根据自己的需要对其进行了修改。
答案 1 :(得分:-1)
我找到了这个解决方案:http://www.maximehuran.fr/lancer-plusieurs-dataflow-magento-en-sequence-dans-un-cron/
在每个数据流之后放置此代码
<?php
Mage::getSingleton('dataflow/batch')->delete();
$registryKey = '_singleton/dataflow/batch';
if (Mage::registry($registryKey)) {
Mage::unregister($registryKey);
}