Drupal 6 партия не выполняется - PullRequest
0 голосов
/ 12 апреля 2011

Кто-нибудь может предложить некоторые идеи по этому поводу?По сути, модуль, который я создаю, имеет форму (согласно function_email_solicitors_compose), и при отправке мы, очевидно, направляемся в form_emails_solicitors_compose_submit.Здесь я определяю пакет в $ batch, а batch_set вышеупомянутый пакет.В документации на drupal сказано, что мне не нужно запускать batch_process (), если он вызывается из form_submit, что и есть, но я пробовал с и без.Все тесты показали, что он доходит до определения партии, но никогда не идет дальше.email_solicitors_batch_iteration никогда не запускается.Любые идеи?

В качестве дополнительного бита информации, batch_get возвращает следующее:

Array
(
    [sets] => Array
        (
            [0] => Array
                (
                    [sandbox] => Array
                        (
                        )

                    [results] => Array
                        (
                        )

                    [success] => 
                    [title] => Emailing.
                    [operations] => Array
                        (
                            [0] => Array
                                (
                                    [0] =>

email_solicitors_batch_iteration [1] => Массив ([0] => [1]=>)

                                )

                        )

                    [finished] => my_finished_callback
                    [init_message] => Initializing.<br/>&nbsp;
                    [progress_message] => Remaining

@ осталось от @total.[error_message] => Произошла ошибка.[всего] => 1)

        )

)

Код:

function email_solicitors_compose(){
    $form['email_solicitors_subject'] = array(
        '#type' => 'textfield',
        '#title' => t('Subject'),
        '#description' => t('Enter the subject of your email'),
        '#default_value' => 'Subject',
        '#size' => 30
    );
    $form['email_solicitors_message'] = array(
        '#type' => 'textarea',
        '#title' => t('Message'),
        '#description' => t('Write your message here. <strong>Please note that we will automatically add "Dear #name", which will be personalised to the solicitor.</strong>'),
        '#default_value' => '',
    );
    $form['email_solicitors_submit'] = array(
        '#type' => 'submit',
        '#title' => t('Submit'),
        '#description' => t('Sumbit this form.'),
        '#default_value' => 'Submit',
    );
    return $form;
}//function email_solicitors_compose


function email_solicitors_compose_submit($form_state)
{
    $batch = array(
        'title' => t('Sending emails to solicitors'),
        'operations' => array(
            array('email_solicitors_batch_iteration', array())
        ), 
        'finished' => 'email_solicitors_batch_finished', //run this when we're finished
        'init_message' => t('Preparing to send emails'), //initialisation message
        'progress_message' => t('Sent @current out of @total messages.'),
        'error_message' => t('Sorry, something went wrong when sending emails.'),
    );// create batch array
    $info=print_r($batch,TRUE);
    drupal_set_message($info);
    batch_set($batch);
    batch_process();
}//function email_solicitors_compose_submit


function email_solicitors_batch_iteration(&$context)
{
    // Initialize sandbox the first time through.
    if (!isset($context['sandbox']['progress'])) {
        $context['sandbox']['progress'] = 0;
        $context['sandbox']['current_user_id'] = 0;
        $context['sandbox']['max'] = db_result(db_query('SELECT COUNT(DISTINCT field_solicitor_email_value) FROM content_type_solicitor'));
    }
    $comment="On item ".$context['sandbox']['progress'];
    drupal_set_message ($comment);
}//function email_solicitors_batch_iteration

function email_solicitors_batch_finished (&$context)
{
    die ('woohoo we finished');
}

Ответы [ 4 ]

3 голосов
/ 16 сентября 2011

В качестве дополнения к ответу, который дал Клайв, вы можете рассмотреть возможность добавления параметра "file" в пакетный массив. Это сообщит API, где находится функция.

Пример:

   $batch = array(
        'title' => t('Sending emails to solicitors'),
        'operations' => array(
            array('email_solicitors_batch_iteration', array())
        ), 
        'finished' => 'email_solicitors_batch_finished', //run this when we're finished
        'init_message' => t('Preparing to send emails'), //initialisation message
        'progress_message' => t('Sent @current out of @total messages.'),
        'error_message' => t('Sorry, something went wrong when sending emails.'),
        'file' => drupal_get_path('module', '<module_name>').'/path_to_include_file.inc',
    );

у меня сработало :) 1006 *

3 голосов
/ 06 июля 2011

На всякий случай, если кто-то все еще борется с этим, предыдущие два комментария неверны, вам не нужно явно устанавливать переменную $ context ['Finished'] (см. Модуль примеров, batch_example).Причина, по которой он не работает, заключается в том, что функция пакетной операции находится в файле, не включенном в загрузочную версию Drupal по умолчанию.Если вы переместите функцию пакетной операции из включаемого файла в файл модуля включенного модуля, он будет работать.

0 голосов
/ 12 апреля 2011

Вам не нужно вызывать batch_process (), просто batch_set () в обратном вызове submit - это все, что вам нужно.См., Например, http://api.worldempire.ch/api/privatemsg/privatemsg_filter--privatemsg_filter.admin.inc/function/privatemsg_filter_inbox_rebuid_form_submit/7-1.

И, как сказал Артусамак, ваша пакетная реализация неполна и приведет к бесконечному циклу.

0 голосов
/ 12 апреля 2011

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

  // Update our progress information.
  $context['sandbox']['progress']++;
  $context['sandbox']['current_node'] = $row['nid'];
  $context['message'] = t('Calcul des votes pour %node', array('%node' => $row['title']));

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