function form_execute_handlers

Executes custom validation and submission handlers for a given form.

Button-specific handlers are checked first. If none exist, the function falls back to form-level handlers.


$type: The type of handler to execute. 'validate' or 'submit' are the defaults used by Form API.

$form: An associative array containing the structure of the form.

$form_state: A keyed array containing the current state of the form. If the user submitted the form by clicking a button with custom handler functions defined, those handlers will be stored here.

Related topics

3 calls to form_execute_handlers()
drupal_process_form in includes/
Processes a form submission.
node_form_submit_build_node in modules/node/
Updates the form state's node entity by processing this submission's values.
_form_validate in includes/
Performs validation on form elements.


includes/, line 1505


function form_execute_handlers($type, &$form, &$form_state) {
    $return = FALSE;
    // If there was a button pressed, use its handlers.
    if (isset($form_state[$type . '_handlers'])) {
        $handlers = $form_state[$type . '_handlers'];
    elseif (isset($form['#' . $type])) {
        $handlers = $form['#' . $type];
    else {
        $handlers = array();
    foreach ($handlers as $function) {
        // Check if a previous _submit handler has set a batch, but make sure we
        // do not react to a batch that is already being processed (for instance
        // if a batch operation performs a drupal_form_submit()).
        if ($type == 'submit' && ($batch =& batch_get()) && !isset($batch['id'])) {
            // Some previous submit handler has set a batch. To ensure correct
            // execution order, store the call in a special 'control' batch set.
            // See _batch_next_set().
            $batch['sets'][] = array(
                'form_submit' => $function,
            $batch['has_form_submits'] = TRUE;
        else {
            $function($form, $form_state);
        $return = TRUE;
    return $return;

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.