<?php
function batch_test_menu() {
$items = array();
$items['batch-test'] = array(
'title' => 'Batch test',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'batch_test_simple_form',
),
'access callback' => TRUE,
);
$items['batch-test/simple'] = array(
'title' => 'Simple',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => 0,
);
$items['batch-test/multistep'] = array(
'title' => 'Multistep',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'batch_test_multistep_form',
),
'access callback' => TRUE,
'type' => MENU_LOCAL_TASK,
'weight' => 1,
);
$items['batch-test/chained'] = array(
'title' => 'Chained',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'batch_test_chained_form',
),
'access callback' => TRUE,
'type' => MENU_LOCAL_TASK,
'weight' => 2,
);
$items['batch-test/programmatic'] = array(
'title' => 'Programmatic',
'page callback' => 'batch_test_programmatic',
'access callback' => TRUE,
'type' => MENU_LOCAL_TASK,
'weight' => 3,
);
$items['batch-test/no-form'] = array(
'title' => 'Simple page',
'page callback' => 'batch_test_no_form',
'access callback' => TRUE,
'type' => MENU_LOCAL_TASK,
'weight' => 4,
);
$items['batch-test/large-percentage'] = array(
'title' => 'Simple page with batch over 100% complete',
'page callback' => 'batch_test_large_percentage',
'access callback' => TRUE,
'type' => MENU_LOCAL_TASK,
'weight' => 5,
);
$items['batch-test/nested-programmatic'] = array(
'title' => 'Nested programmatic',
'page callback' => 'batch_test_nested_drupal_form_submit',
'access callback' => TRUE,
'type' => MENU_LOCAL_TASK,
'weight' => 6,
);
$items['batch-test/redirect'] = array(
'title' => 'Redirect',
'page callback' => 'batch_test_redirect_page',
'access callback' => TRUE,
'type' => MENU_LOCAL_TASK,
'weight' => 7,
);
$items['admin/batch-test/test-theme'] = array(
'page callback' => 'batch_test_theme_batch',
'access callback' => TRUE,
'type' => MENU_CALLBACK,
);
return $items;
}
function batch_test_simple_form() {
$form['batch'] = array(
'#type' => 'select',
'#title' => 'Choose batch',
'#options' => array(
'batch_0' => 'batch 0',
'batch_1' => 'batch 1',
'batch_2' => 'batch 2',
'batch_3' => 'batch 3',
'batch_4' => 'batch 4',
),
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => 'Submit',
);
return $form;
}
function batch_test_simple_form_submit($form, &$form_state) {
batch_test_stack(NULL, TRUE);
$function = '_batch_test_' . $form_state['values']['batch'];
batch_set($function());
$form_state['redirect'] = 'batch-test/redirect';
}
function batch_test_multistep_form($form, &$form_state) {
if (empty($form_state['storage']['step'])) {
$form_state['storage']['step'] = 1;
}
$form['step_display'] = array(
'#markup' => 'step ' . $form_state['storage']['step'] . '<br/>',
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => 'Submit',
);
return $form;
}
function batch_test_multistep_form_submit($form, &$form_state) {
batch_test_stack(NULL, TRUE);
switch ($form_state['storage']['step']) {
case 1:
batch_set(_batch_test_batch_1());
break;
case 2:
batch_set(_batch_test_batch_2());
break;
}
if ($form_state['storage']['step'] < 2) {
$form_state['storage']['step']++;
$form_state['rebuild'] = TRUE;
}
$form_state['redirect'] = 'batch-test/redirect';
}
function batch_test_chained_form() {
$form['value'] = array(
'#type' => 'textfield',
'#title' => 'Value',
'#default_value' => 1,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => 'Submit',
);
$form['#submit'] = array(
'batch_test_chained_form_submit_1',
'batch_test_chained_form_submit_2',
'batch_test_chained_form_submit_3',
'batch_test_chained_form_submit_4',
);
return $form;
}
function batch_test_chained_form_submit_1($form, &$form_state) {
batch_test_stack(NULL, TRUE);
batch_test_stack('submit handler 1');
batch_test_stack('value = ' . $form_state['values']['value']);
$form_state['values']['value']++;
batch_set(_batch_test_batch_1());
$form_state['redirect'] = 'should/be/discarded';
}
function batch_test_chained_form_submit_2($form, &$form_state) {
batch_test_stack('submit handler 2');
batch_test_stack('value = ' . $form_state['values']['value']);
$form_state['values']['value']++;
batch_set(_batch_test_batch_2());
$form_state['redirect'] = 'should/be/discarded';
}
function batch_test_chained_form_submit_3($form, &$form_state) {
batch_test_stack('submit handler 3');
batch_test_stack('value = ' . $form_state['values']['value']);
$form_state['values']['value']++;
$form_state['redirect'] = 'should/be/discarded';
}
function batch_test_chained_form_submit_4($form, &$form_state) {
batch_test_stack('submit handler 4');
batch_test_stack('value = ' . $form_state['values']['value']);
$form_state['values']['value']++;
batch_set(_batch_test_batch_3());
$form_state['redirect'] = 'batch-test/redirect';
}
function batch_test_programmatic($value = 1) {
$form_state = array(
'values' => array(
'value' => $value,
),
);
drupal_form_submit('batch_test_chained_form', $form_state);
return 'Got out of a programmatic batched form.';
}
function batch_test_nested_drupal_form_submit($value = 1) {
$batch['operations'] = array(
array(
'_batch_test_nested_drupal_form_submit_callback',
array(
$value,
),
),
);
batch_set($batch);
batch_process('batch-test/redirect');
}
function _batch_test_nested_drupal_form_submit_callback($value) {
$state['values']['test_value'] = $value;
drupal_form_submit('batch_test_mock_form', $state);
}
function batch_test_mock_form($form, $form_state) {
$form['test_value'] = array(
'#type' => 'textfield',
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
return $form;
}
function batch_test_mock_form_submit($form, &$form_state) {
batch_test_stack('mock form submitted with value = ' . $form_state['values']['test_value']);
}
function batch_test_no_form() {
batch_test_stack(NULL, TRUE);
batch_set(_batch_test_batch_1());
batch_process('batch-test/redirect');
}
function batch_test_large_percentage() {
batch_test_stack(NULL, TRUE);
batch_set(_batch_test_batch_5());
batch_process('batch-test/redirect');
}
function batch_test_redirect_page() {
return 'Redirection successful.';
}
function _batch_test_batch_0() {
$batch = array(
'operations' => array(),
'finished' => '_batch_test_finished_0',
'file' => drupal_get_path('module', 'batch_test') . '/batch_test.callbacks.inc',
);
return $batch;
}
function _batch_test_batch_1() {
$total = 10;
$sleep = 1000000 / $total * 2;
$operations = array();
for ($i = 1; $i <= $total; $i++) {
$operations[] = array(
'_batch_test_callback_1',
array(
$i,
$sleep,
),
);
}
$batch = array(
'operations' => $operations,
'finished' => '_batch_test_finished_1',
'file' => drupal_get_path('module', 'batch_test') . '/batch_test.callbacks.inc',
);
return $batch;
}
function _batch_test_batch_2() {
$total = 10;
$sleep = 1000000 / $total * 2;
$operations = array(
array(
'_batch_test_callback_2',
array(
1,
$total,
$sleep,
),
),
);
$batch = array(
'operations' => $operations,
'finished' => '_batch_test_finished_2',
'file' => drupal_get_path('module', 'batch_test') . '/batch_test.callbacks.inc',
);
return $batch;
}
function _batch_test_batch_3() {
$total = 10;
$sleep = 1000000 / $total * 2;
$operations = array();
for ($i = 1; $i <= round($total / 2); $i++) {
$operations[] = array(
'_batch_test_callback_1',
array(
$i,
$sleep,
),
);
}
$operations[] = array(
'_batch_test_callback_2',
array(
1,
$total / 2,
$sleep,
),
);
for ($i = round($total / 2) + 1; $i <= $total; $i++) {
$operations[] = array(
'_batch_test_callback_1',
array(
$i,
$sleep,
),
);
}
$operations[] = array(
'_batch_test_callback_2',
array(
6,
$total / 2,
$sleep,
),
);
$batch = array(
'operations' => $operations,
'finished' => '_batch_test_finished_3',
'file' => drupal_get_path('module', 'batch_test') . '/batch_test.callbacks.inc',
);
return $batch;
}
function _batch_test_batch_4() {
$total = 10;
$sleep = 1000000 / $total * 2;
$operations = array();
for ($i = 1; $i <= round($total / 2); $i++) {
$operations[] = array(
'_batch_test_callback_1',
array(
$i,
$sleep,
),
);
}
$operations[] = array(
'_batch_test_nested_batch_callback',
array(),
);
for ($i = round($total / 2) + 1; $i <= $total; $i++) {
$operations[] = array(
'_batch_test_callback_1',
array(
$i,
$sleep,
),
);
}
$batch = array(
'operations' => $operations,
'finished' => '_batch_test_finished_4',
'file' => drupal_get_path('module', 'batch_test') . '/batch_test.callbacks.inc',
);
return $batch;
}
function _batch_test_batch_5() {
$total = 10;
$sleep = 1000000 / $total * 2;
$operations = array();
for ($i = 1; $i <= $total; $i++) {
$operations[] = array(
'_batch_test_callback_5',
array(
$i,
$sleep,
),
);
}
$batch = array(
'operations' => $operations,
'finished' => '_batch_test_finished_5',
'file' => drupal_get_path('module', 'batch_test') . '/batch_test.callbacks.inc',
);
return $batch;
}
function batch_test_theme_batch() {
batch_test_stack(NULL, TRUE);
$batch = array(
'operations' => array(
array(
'_batch_test_theme_callback',
array(),
),
),
);
batch_set($batch);
batch_process('batch-test/redirect');
}
function _batch_test_theme_callback() {
global $theme;
batch_test_stack($theme);
}
function batch_test_stack($data = NULL, $reset = FALSE) {
if ($reset) {
state()
->delete('batch_test.stack');
}
if (!isset($data)) {
return state()
->get('batch_test.stack');
}
$stack = state()
->get('batch_test.stack');
$stack[] = $data;
state()
->set('batch_test.stack', $stack);
}