Drupal内容或用户迁移

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,即可自动运行。

Drupal内容或用户迁移
标题

3、总结
drupal batch api或者feeds模块都可以实现Drupal内容或用户迁移,总体来说,如果您导入的数据比较简单,那么建议您使用fees模块,如果feeds模块不能实现,那么,您有必要看看这篇文章。