How to make a form that captures a value from $_REQUEST[] Update: This question now has a clone: https://stackoverflow.com/questions/13184335/drupal-how-to-make-a-form-that-captures-a-value-from-request

I have been trying to make a form that captures a value passed in from $_REQUEST.


A field is displayed only if a $_REQUEST variable exists (done)
The user can modify the field
The field is validated in whatever way
The (modified) value gets used 


In this specific case, I am using a hook_user function, but I hope that the solution is applicable to any Drupal form.

Here's a simplified version of my code where the user would have an extra field to specify that they have a favorite fruit if they were to register using the following URL:

http://example.com/user/register?fruit=pineapple

function fruity_user($op, &amp;$edit, &amp;$user, $category = NULL){
    switch($op) {
        // Add extra fields if $_REQUEST contains values for them
        case 'register':
            if($_REQUEST['fruit'] == 'pineapple'){
                $fields['user_reg_info']['profile_fruit'] = array(
                     '#type' =&gt; 'textfield'
                    ,'#description' =&gt; 'Your favorite fruit (if applicable)'
                    ,'#locked' =&gt; 0
                    ,'#value' =&gt; $_REQUEST['fruit']
                );
            }
            return $fields;
            break;

        // check registration for mistakes
        case 'validate':
            if ($edit['form_id'] == 'user_register') {
                if ($edit['profile_fruit']){
                    verify_fruit($edit['profile_fruit']);
                }
            }
            break;

        // runs after the new user is inserted
        case 'insert':
            if($_REQUEST['fruit']){
                db_query('INSERT INTO user_fruits SET `uid`=%d `fruit`="%s"',array($user-&gt;uid, $edit['profile_fruit']));
            }

            // record information
            watchdog('user', t('user %user picked out a fruit',array('%user' =&gt; $user-&gt;name)));
            break;
    }
}


With the above code, the field does make itself visible only when $_REQUEST['fruit']  is present but if you change your fruit to "watermelon" on the form, insert still uses "pineapple".
The answer was to use #default_value instead of #value.

http://api.drupal.org/api/drupal/developer%21topics%21forms_api_reference.html/6#default_value