Update: This question now has a clone: http://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, &$edit, &$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' => 'textfield'
,'#description' => 'Your favorite fruit (if applicable)'
,'#locked' => 0
,'#value' => $_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->uid, $edit['profile_fruit']));
}
// record information
watchdog('user', t('user %user picked out a fruit',array('%user' => $user->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".