ajaxsubmit.module in Javascript Tools 5
Make designated forms submit via AJAX.
Usage:
<code> $form['#ajaxsubmit'] = TRUE; </code>
Optional settings
Target: Element, indentified by a jQuery selector, that submit response should render into. Trigger this behavior as follows:
<code> $form['#ajaxsubmit_target'] = '#myid'; </code>
Progress: ajaxsubmit can monitor for progress of a form submit. Trigger this behavior as follows:
<code> $form['#ajaxsubmit_progress'] = TRUE; </code>
File
ajaxsubmit/ajaxsubmit.moduleView source
<?php
/**
* @file
* Make designated forms submit via AJAX.
*
* Usage:
*
* <code>
* $form['#ajaxsubmit'] = TRUE;
* </code>
*
* Optional settings
*
* Target: Element, indentified by a jQuery selector, that submit response should render into.
* Trigger this behavior as follows:
*
* <code>
* $form['#ajaxsubmit_target'] = '#myid';
* </code>
*
* Progress: ajaxsubmit can monitor for progress of a form submit.
* Trigger this behavior as follows:
*
* <code>
* $form['#ajaxsubmit_progress'] = TRUE;
* </code>
*/
/**
* 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,
));
}
Functions
Name | Description |
---|---|
ajaxsubmit_admin_settings | Menu callback for admin settings form. |
ajaxsubmit_dispatch | Return form submit result. |
ajaxsubmit_form_alter | Implementation of hook_form_alter(). |
ajaxsubmit_load | Load needed files. |
ajaxsubmit_menu | Implementation of hook_menu(). |
ajaxsubmit_progress | Return progress percentage and message. |