* $form['#ajaxsubmit'] = TRUE;
*
*
* Optional settings
*
* Target: Element, indentified by a jQuery selector, that submit response should render into.
* Trigger this behavior as follows:
*
*
* $form['#ajaxsubmit_target'] = '#myid';
*
*
* Progress: ajaxsubmit can monitor for progress of a form submit.
* Trigger this behavior as follows:
*
*
* $form['#ajaxsubmit_progress'] = TRUE;
*
*/
/**
* Implementation of hook_form_alter().
*/
function ajaxsubmit_form_alter($form_id, &$form) {
if (in_array($form_id, array_filter(variable_get('ajaxsubmit_forms', array())))) {
$form['#ajaxsubmit'] = TRUE;
}
if ($form['#ajaxsubmit']) {
// If we're using ajaxsubmit and the form's already been submitted, redirect.
if (!empty($_POST) && !empty($_POST['ajaxsubmit']) && ($_POST['form_id'] == $form_id)) {
// Redirect on successful submit, i.e., if there are no errors.
$form['#redirect'] = 'ajaxsubmit/dispatch';
if (is_array($form['#pre_render'])) {
$form['#pre_render'][] = 'ajaxsubmit_dispatch';
}
else {
$form['#pre_render'] = array('ajaxsubmit_dispatch');
}
}
else {
// In case a destination was set by a previous transaction, unset it
// so that this one can set its own as needed.
unset($_SESSION['ajaxsubmit_destination']);
ajaxsubmit_load();
$form['#attributes']['class'] .= ' ajaxsubmit';
if ($form['#ajaxsubmit_target']) {
$form['ajaxsubmit_target'] = array(
'#type' => 'hidden',
'#value' => $form['#ajaxsubmit_target']
);
}
if ($form['#ajaxsubmit_progress']) {
// Value is the path to the progress monitoring.
$form['ajaxsubmit_progress'] = array(
'#type' => 'hidden',
'#value' => url(drupal_get_path('module', 'ajaxsubmit') . '/ajaxsubmit_update')
);
}
if ($form['#ajaxsubmit_error_message']) {
$form['ajaxsubmit_error_message'] = array(
'#type' => 'hidden',
'#value' => $form['#ajaxsubmit_error_message']
);
}
if ($form['#ajaxsubmit_error_redirect']) {
$form['ajaxsubmit_error_redirect'] = array(
'#type' => 'hidden',
'#value' => $form['#ajaxsubmit_error_redirect']
);
}
}
}
}
/**
* Implementation of hook_menu().
*/
function ajaxsubmit_menu($may_cache) {
$items = array();
if ($may_cache) {
$items[] = array(
'path' => 'admin/settings/ajaxsubmit',
'title' => t('AJAX submit'),
'description' => t('Configuration for AJAX submit'),
'callback' => 'drupal_get_form',
'callback arguments' => array('ajaxsubmit_admin_settings')
);
$items[] = array(
'path' => 'ajaxsubmit/dispatch',
'title' => t('ajaxsubmit'),
'access' => user_access('access content'),
'type' => MENU_CALLBACK,
'callback' => 'ajaxsubmit_dispatch'
);
$items[] = array(
'path' => 'ajaxsubmit/progress',
'title' => t('ajaxsubmit progress'),
'access' => user_access('access content'),
'type' => MENU_CALLBACK,
'callback' => 'ajaxsubmit_progress'
);
}
return $items;
}
/**
* Menu callback for admin settings form.
*/
function ajaxsubmit_admin_settings() {
$form = array();
$known_forms = form_store_get_all();
$options = array();
foreach ($known_forms as $item) {
$options[$item->form_id] = $item->form_id .' - '. $item->description;
}
$form['ajaxsubmit_forms'] = array(
'#type' => 'checkboxes',
'#title' => t('Forms'),
'#description' => t('Select the forms to apply the AJAX Submit behavior to.'),
'#default_value' => array_filter(variable_get('ajaxsubmit_forms', array())),
'#options' => $options,
);
$output = system_settings_form($form);
return $output;
}
/**
* Load needed files.
*/
function ajaxsubmit_load() {
$path = drupal_get_path('module', 'ajaxsubmit');
jstools_add_js($path . '/ajaxsubmit.js');
drupal_add_js('misc/progress.js');
}
/**
* Return form submit result.
*/
function ajaxsubmit_dispatch($form_id = NULL, $form = NULL) {
$result = array(
'status' => TRUE,
'data' => array(
'errors' => form_get_errors(),
'message' => theme('status_messages'),
'preview' => isset($form[arg(0) . '_preview']) && !empty($form[arg(0) . '_preview']['#value']) ? $form[arg(0) . '_preview']['#value'] : NULL,
'destination' => $_SESSION['ajaxsubmit_destination'] ? $_SESSION['ajaxsubmit_destination'] : NULL
)
);
print drupal_to_js($result);
exit();
}
/**
* Return progress percentage and message.
*
* The _submit function must set two session variables:
* - $_SESSION['{form_id}_total'], the total number of actions to be taken during this submit, and
* - $_SESSION['{form_id}_remaining'], the number of actions remaining.
* In each of these, the 'form_id' value should be the id of the form in question.
*/
function ajaxsubmit_progress() {
$form_id = $_REQUEST['form_id'];
$percentage = floor(($_SESSION[$form_id . '_total'] - $_SESSION[$form_id . '_remaining']) / $_SESSION[$form_id . '_total'] * 100);
$message = ($percentage == 100) ? t('Submit complete') : t('Submit in progress');
print drupal_to_js(array('status' => TRUE, 'percentage' => $percentage, 'message' => $message));
}