function ctools_process_form in Chaos Tool Suite (ctools) 6
ctools' replacement for drupal_process_form that accepts commands not to redirect, as well as forcing processing of 'get' method forms.
1 call to ctools_process_form()
- ctools_build_form in includes/
form.inc - Build a form, similar to drupal_get_form(). However, arguments to the form builder are not sent through. Instead, the $form_state can be given all the necessary data to fully utilize the form.
File
- includes/
form.inc, line 223 - CTools' replacements for Drupal's form functions.
Code
function ctools_process_form($form_id, &$form, &$form_state) {
// submitting, and handling the results returned by its submission
// handlers. Submit handlers accumulate data in the form_state by
// altering the $form_state variable, which is passed into them by
// reference.
$form_state['values'] = array();
// With $_GET, these forms are always submitted.
if ($form_state['method'] == 'get') {
if (!isset($form['#post']['form_build_id'])) {
$form['#post']['form_build_id'] = $form['#build_id'];
}
if (!isset($form['#post']['form_id'])) {
$form['#post']['form_id'] = $form_id;
}
if (!isset($form['#post']['form_token']) && isset($form['#token'])) {
$form['#post']['form_token'] = drupal_get_token($form['#token']);
}
}
$form = form_builder($form_id, $form, $form_state);
// Only process the form if it is programmed or the form_id coming
// from the POST data is set and matches the current form_id.
if (!empty($form['#programmed']) || !empty($form['#post']) && (isset($form['#post']['form_id']) && $form['#post']['form_id'] == $form_id)) {
ctools_validate_form($form_id, $form, $form_state);
// form_clean_id() maintains a cache of element IDs it has seen,
// so it can prevent duplicates. We want to be sure we reset that
// cache when a form is processed, so scenerios that result in
// the form being built behind the scenes and again for the
// browser don't increment all the element IDs needlessly.
form_clean_id(NULL, TRUE);
if (!empty($form_state['submitted']) && !form_get_errors() && empty($form_state['rebuild'])) {
$form_state['redirect'] = NULL;
form_execute_handlers('submit', $form, $form_state);
// We'll clear out the cached copies of the form and its stored data
// here, as we've finished with them. The in-memory copies are still
// here, though.
if (variable_get('cache', CACHE_DISABLED) == CACHE_DISABLED && !empty($form_state['values']['form_build_id'])) {
cache_clear_all('form_' . $form_state['values']['form_build_id'], 'cache_form');
cache_clear_all('storage_' . $form_state['values']['form_build_id'], 'cache_form');
}
// If batches were set in the submit handlers, we process them now,
// possibly ending execution. We make sure we do not react to the batch
// that is already being processed (if a batch operation performs a
// drupal_execute).
if (($batch =& batch_get()) && !isset($batch['current_set'])) {
// The batch uses its own copies of $form and $form_state for
// late execution of submit handers and post-batch redirection.
$batch['form'] = $form;
$batch['form_state'] = $form_state;
$batch['progressive'] = !$form['#programmed'];
batch_process();
// Execution continues only for programmatic forms.
// For 'regular' forms, we get redirected to the batch processing
// page. Form redirection will be handled in _batch_finished(),
// after the batch is processed.
}
// If no submit handlers have populated the $form_state['storage']
// bundle, and the $form_state['rebuild'] flag has not been set,
// we're finished and should redirect to a new destination page
// if one has been set (and a fresh, unpopulated copy of the form
// if one hasn't). If the form was called by drupal_execute(),
// however, we'll skip this and let the calling function examine
// the resulting $form_state bundle itself.
if (!$form['#programmed'] && empty($form_state['rebuild']) && empty($form_state['storage'])) {
if (!empty($form_state['no_redirect'])) {
$form_state['executed'] = TRUE;
}
else {
drupal_redirect_form($form, $form_state['redirect']);
}
}
}
}
}