1、为什么要用Batch api进行Drupal内容或用户迁移。
在我们很多的实际项目,都会遇到需要从其他系统导入内容到Drupal系统中的需求,比如将老系统的用户数据导入到Drupal系统中,将老系统的新闻数据导入D如怕了系统中,甚至在导入过程中实现一些逻辑处理。一些Drupal的初学者会直接写在PHP文件里面处理,但这样涉及到PHP运行超时的问题,那么,我们就可以选择使用Batch api实现,也可以使用feeds模块。
1)使用batch api进行导入,优点:灵活性高;缺点:需要自己写一些代码
2)使用feeds模块进行导入,优点:只需要进行配置,缺点:灵活性不足,如果要处理导入过程中的数据变化或者逻辑,就不太容易。
这里我们先介绍batch api导入Drupal数据的方法。使用feeds模块导入的方法我将会在后续详细介绍。2、如何用Batch api进行数据迁移。
1)定义菜单
function get_data_from_oa_ontime_menu(){
$items['admin/config/inputdata'] = array(
'page callback' => 'import_maitou',
'type' => MENU_CALLBACK,
'file path' => drupal_get_path('module', 'system'),
'file' => 'system.admin.inc',
'access arguments' => array('access content') ,
'title' => '导入数据',
);
return $items;
}
2)导入数据
function import_maitou(){
$operations =array();
$client = new SoapClient("http://XXX.XXX.XX.XX/XXXX/XXXXXXX?WSDL",
array(
"stream_context" => stream_context_create(
array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
)
)
)
)
);
$i = 80;
while ($i > 70) {
$result = $client->FNGETMOREPAGEDATE('XXXX', 'XXXX', $i, 20);
$result = drupal_json_decode($result);
if($result['WsForQuery'][0]['status'] == true){
foreach ($result['data'] as $record) {
$operations[] = array(
'batch_example_process',
array(
$record['fldUnid'],
),
);
}
}
$i--;
}
$batch = array(
'operations' => $operations,
'init_message' => t('Batch is starting.'),
'finished' => 'batch_example_finished',
'title' => t('数据迁移中...'),
'init_message' => t('Example Batch is starting.'),
'progress_message' => t('Processed @current out of @total.'),
'error_message' => t('Example Batch has encountered an error.'),
);
batch_set($batch);
batch_process('relation_msci');
}
3)调用batch api
function batch_example_finished($success, $results, $operations) {
if ($success) {
$message = t('@count items successfully processed:', array('@count' => count($results)));
$message .= theme('item_list', array('items' => $results));
drupal_set_message($message);
watchdog('writingmaster', $message, $variables = array(), $severity = WATCHDOG_NOTICE, $link = NULL);
drupal_goto('node/1');
}
else {
$error_operation = reset($operations);
$message = t('An error occurred while processing %error_operation with arguments: @arguments', array('%error_operation' => $error_operation[0], '@arguments' => print_r($error_operation[1], TRUE)));
drupal_set_message($message, 'error');
}
}
function batch_example_process($fldUnid,&$context){
if (!isset($context['sandbox']['progress'])) {
$context['sandbox']['progress'] = 0;
$context['sandbox']['current_node'] = 0;
$context['sandbox']['max'] = 1;
}
$context['sandbox']['max'] = 1;
$newNode = get_xiangmu_data_from_oa_save_node($fldUnid);
$context['sandbox']['progress']++;
$context['sandbox']['current_node'] = $newNode->title;
$context['message'] = t('Now processing %node', array('%node' => $newNode->title));
if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
$context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
}
}
4)运行我们创建的batch(Drupal内容或用户迁移)任务
在地址栏中输入: admin/config/inputdata,即可自动运行。
3、总结
drupal batch api或者feeds模块都可以实现Drupal内容或用户迁移,总体来说,如果您导入的数据比较简单,那么建议您使用fees模块,如果feeds模块不能实现,那么,您有必要看看这篇文章。