Вы здесь

Как выполнить очередь через hook_menu?

1

Добрый вечер, прошу сразу отнестись ко мне с пониманием, знания программирования у меня слабые, так и API Drupal-а тоже
Однако личная задача и её нужно решить

Есть модуль использующий очереди, и необходимо сделать так, чтобы запуск создания и обработки очередей проходил при посещении определенного адреса, т.е. через hook_menu

На текущий момент сделал запуск создания очереди по hook_menu, но настройка колбэка и обработка самой очереди не работает, хотя чувствую что это и правильно, судя по коду почему она будет запускаться

/**
 * Implements hook_menu().
 */
function synch_users_from_external_database_menu() {
  $items['start'] = array(
    'title' => 'Start synch',
    'page callback' => 'start_synch_users_from_external_database',
    'access callback' => TRUE,
  );
  return $items;
}

function start_synch_users_from_external_database() {
  watchdog("synch_users_from_external_database","Start create queue");

  $queue = DrupalQueue::get('synch_users_from_external_database');  

  $conn=oci_connect("user", "password", "tnsname");
  $stid = oci_parse($conn, "SELECT username, fullname FROM \"User\" WHERE ROWNUM < 11");
  oci_execute($stid);

  while ($row = oci_fetch_array($stid)) {
    $queue->createItem($row);
    watchdog("synch_users_from_external_database","Add item to row" . $row['USERNAME']);
  }
}

/**
 * Implements hook_cron_queue_info()
 */
function synch_users_from_external_database_cron_queue_info() {
  $queues['synch_users_from_external_database'] = array(
    'worker callback' => 'synch_users_from_external_database_callback',
    'time' => 30,
    'skip on cron' => TRUE,
  );
  return $queues;
}

/**
 * Worker callback defined in hook_cron_queue_info()
 */
function synch_users_from_external_database_callback($row){
  watchdog("synch_users_from_external_database","Create user: ". $row["USERNAME"]);

Собственно Implements hook_cron_queue_info() уже работает.
Наверное потому, что само название cron говорит, что, что связано с запуском с помощью крона, но не факт.

Подскажите пожалуйста, в чём моя ошибка
Спасибо

Версия Drupal: 
7.x
Вопрос задан 29.11.2017 - 17:19

Ответы

1
  $queue_name = '...';
  $queues = module_invoke_all('cron_queue_info');
  $queue = DrupalQueue::get($queue_name);
  $queue_info = $queues[$queue_name];

  while ($item = $queue->claimItem()) {
    call_user_func($queue_info['worker callback'], $item->data);
    $queue->deleteItem($item);
  }
Ответ дан 29.11.2017 - 17:54
Аватар пользователя xandeadx
xandeadx
1471

Туда, где вы хотите выполнить очередь

Комментарий оставлен 30.11.2017 - 12:20