How to override form action in Drupal?

17,345

Solution 1

hook_form_alter() is likely the way to go. Here are some hopefully helpful links:

Form Theming: How do I set $form['action']?

Modifying Forms in Drupal 5 and 6

hook_form_alter

EDIT: reply to comment #1 below:

How to implement hook_form_alter():

You must create a module (you cannot use template.php). It's easier than it looks.

For a module named "formstuff", you would create formstuff.info and formstuff.module and put them in either sites/all/modules or sites/yoursitename/modules. Set up the .info and .module files per the instructions, then just create the following function in your .module file:

function formstuff_form_alter(&$form, $form_state, $form_id) {
  // do stuff
}

This function is a hook because it is named properly (i.e. replace the word 'hook' with the name of your module), and it matches hook_form_alter's function signature (i.e. it takes the same parameters).

Then just enable your module in your site's admin and the hook should do it's magic.

Note that hook_form_alter takes a reference to the form; this allows you to modify it in-place.

Solution 2

You need to put the form_alter function in a module and then use either if or switch to check the form ID. If the form ID is the one you want to alter then give the form an action property

$form['someID'] = array(
'#action' => 'path/you/want',
);
Share:
17,345
n00b0101
Author by

n00b0101

Updated on June 04, 2022

Comments

  • n00b0101
    n00b0101 almost 2 years

    I originally started this question in another thread, but that thread was sorta, kinda answered, and now I primarily want to know how to specify another form action... I tried using the code below, but the form action, when output, remains unchanged, although looking at the print_r($form), it's correctly changed... Why isn't it picking up?

    function mytheme_user_profile_form($form) {
            global $user;
            $uid = $user->uid;
            //print '<pre>'; print_r($form); print '</pre>';
        $category = $form['_category']['#value'];
    
        switch($category) {
                case 'account':
                    $form['#action'] = '/user/'.$uid.'/edit?destination=user/'.$uid;
                            break;
            case 'education':
                            $form['#action'] = '/user/'.$uid.'/edit/education?destination=user/'.$uid;
                            break;
            case 'experience':
                            $form['#action'] = '/user/'.$uid.'/edit/experience?destination=user/'.$uid;
                            break;
                case 'publications':
                            $form['#action'] = '/user/'.$uid.'/edit/publications?destination=user/'.$uid;
                            break;
            case 'conflicts':
                            $form['#action'] = '/user/'.$uid.'/edit/conflicts?destination=user/'.$uid;
                            break;
        }
    
            //print '<pre>'; print_r($form); print '</pre>';
            //print $form['#action'];
            $output .= drupal_render($form);
            return $output;