Мой код пакетной обработки Drupal 7 повторяет последнюю итерацию пакетного процесса снова и снова.Может кто-нибудь помочь мне это исправить? - PullRequest
2 голосов
/ 06 февраля 2011

Я пытаюсь переместить данные из старой базы данных в новую.Мой код в настоящее время ничего не пишет (что нормально), но чтение повторяется снова и снова на последней записи, даже если $ context ['Закончено]] установлено в 1. Любая идея, что я делаю неправильно?

<?php
function ogamigrate_permission() {
  return array(
    'migrate to oga2' => array(
      'title' => t('OGA 1.x -> OGA 2.0 Data Migration'),
      'description' => t('Migrate data from the old site.'),
    ),
  );
}

function ogamigrate_menu() {
  $items['admin/ogamigrate'] = array(
    'page callback' => '_ogamigrate_batch',
    'access arguments' => array('migrate to oga2'),
  );

  $items['admin/ogamigrate/finished'] = array(
    'page callback' => '_ogamigrate_complete',
    'access arguments' => array('migrate to oga2'),
  );
  return $items;
}

function _ogamigrate_batch() {
  $batch = array(
    'title' => t('Migrating data from OGA 1'),
    'operations' => array(
      array('_ogamigrate_tags', array()),
      #array('my_function_2', array()),
   ),
    'finished' => '_ogamigrate_finished',
  );
  batch_set($batch);
  batch_process('admin/ogamigrate/finished');
}

function _ogamigrate_tags(&$context) {
  db_set_active('old');
  if (empty($context['sandbox'])) {
    $context['sandbox']['progress'] = 0;
    $context['sandbox']['current_tid'] = 0;
    $context['sandbox']['max'] = db_query('select max(tid) from {term_data} where vid in (3, 4, 6, 7, 10);')->fetchField();
  }

  error_log("migrating tid {$context['sandbox']['current_tid']} ({$context['finished']}");

  $limit = 5;

  $result = db_select('term_data')
  ->fields('term_data', array('tid', 'name', 'description'))
  ->condition('tid', $context['sandbox']['current_tid'], '>')
  ->condition('vid', array(3, 4, 6, 7, 10), 'in')
  ->orderBy('tid')
  ->range(0, $limit)
  ->execute();

  db_set_active('default');

  foreach ($result as $row) {
    #$node = node_load($row->nid, NULL, TRUE);
   error_log("Processing tid {$row->tid} / {$context['sandbox']['max']} ({$row->name})");
    $context['results'][] = $row->tid . ' : ' . $row->name;
    $context['sandbox']['progress']++;
    $context['sandbox']['current_tid'] = $row->tid;
    $context['message'] = $row->name;
  }

  if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
    $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
  }
}

function _ogamigrate_finished($success, $results, $operations) {
  error_log('finished');
  if ($success) {
    $message = format_plural(count($results), 'One item processed.', '@count item processed.');
  }
  else {
    $message = t('Finished with an error.');
  }
  drupal_set_message($message);
  /*
  // Providing data for the redirected page is done through $_SESSION.
  foreach ($results as $result) {
    $items[] = t('Loaded node %title.', array('%title' => $result));
  }
  $_SESSION['my_batch_results'] = $items;
  */
}

function _ogamigrate_complete() {
  return "<p>Migration complete.</p>";
}

1 Ответ

1 голос
/ 06 февраля 2011

Конечно, я трачу часы, пытаясь выяснить это, и в ту минуту, когда я публикую это, я выясняю, что я делаю неправильно.

Вот сделка: я увеличивал «прогресс» каждый раз, когда добавлялзапись, но так как я не включал каждый словарь таксономии, он фактически пропускал некоторые записи, что означает, что «прогресс» никогда не складывался в «макс», поскольку «макс» был идентификатором записи, а не простообщее количество записей.: Р

...