Hello, I may have an example that might be useful for what you are asking. I am working on a module that facilitates using Drupal as a conference site. I am using profile to define fields for registered participants, and I use form_alter in my module in order to modify the profile form. I include a code fragment: /** * Implementation of hook_form_alter() * */ function tauconf_form_alter($form_id, &$form) { global $form_values; switch ($form_id) { // [...] $category = 'conference registration'; if (isset($form[$category])) { // // change the /user/edit/conference+registration form // created with the profile module // - prepend the data from /user/edit/personal+information // //--- get user data $account = user_load(array('uid' => arg(1))); //--- get posted data if existing for profile_form_profile() $edit = $_POST['op'] ? $_POST['edit'] : (array)$account; //--- include "personal info" form $form[$category]['personal_information'] = profile_form_profile($edit, $account, "personal information"); $form[$category]['personal_information']['#weight'] = -5; // // setup validation callback for 'conference registration' profile form // $form[$category]['#validate'] = array('tauconf_registration_validate' => array(&$form_values, $account)); //--- customize MAC address field $field = 'profile_mac_address'; if (isset($form[$category][$field])) { $form[$category][$field]['#maxlength'] = 17; $form[$category][$field]['#size'] = 17; } //--- set default value of arriving date $field = 'profile_arrival_date'; if (isset($form[$category][$field])) { $time = strtotime("2006-09-18 12:00"); $form[$category][$field]['#default_value'] = array('day' => format_date($time, 'custom', 'j'), 'month' => format_date($time, 'custom', 'n'), 'year' => format_date($time, 'custom', 'Y')); } //--- set default value of departure date $field = 'profile_departure_date'; if (isset($form[$category][$field])) { $time = strtotime("2006-09-22 16:00"); $form[$category][$field]['#default_value'] = array('day' => format_date($time, 'custom', 'j'), 'month' => format_date($time, 'custom', 'n'), 'year' => format_date($time, 'custom', 'Y')); } // // prevent registration if: // - registrations are not open // - the e-mail is not invited // $field = 'profile_register_to_conference'; if (isset($form[$category][$field])) { $form[$category][$field]['#weight'] = 5; $can_register = false; switch (variable_get('tauconf_reg_status', 'not_yet_open')) { case 'open': if (!array_search('invited', $account->roles)) { $msg = variable_get('tauconf_msg_not_invited',''); $msg = str_replace('%user_name%', $account->name, $msg); $msg = str_replace('%user_mail%', $account->mail, $msg); $msg = str_replace('%contact_admin%', l(t('contact'), 'contact', array('title' => t('Contact the site administrator'))), $msg); } else { $can_register = true; } break; case 'closed': $msg = variable_get('tauconf_msg_reg_closed', ''); $can_register = false; break; case 'not_yet_open': default: $msg = variable_get('tauconf_msg_reg_not_yet_open', ''); $can_register = false; break; } $can_unregister = array_search('registered', $account->roles); if (!$can_register) { // // replace checkbox for registration with explicative message // //--- replace null message with some info if ($msg == '') { $msg = '<div class="form-item">' . '<div class="messages error">' . "\n" . '<label>Registration unavailable.</label>' . '</div>' . "\n" . $msg . "\n" . '</div>'; } //--- inform that registratoin is not available if ($can_unregister) { $msg = $msg . "If you unregister, you won't be able to register again."; } $form[$category]['msg'] = array( '#title' => t('Registration not available'), '#value' => $msg, '#weight' => 4, ); if (!$can_unregister && !user_access('administer conference')) { //--- hide registration checkbox $form[$category][$field]['#type'] = 'hidden'; $form[$category]['reg_status'] = array( '#title' => t('Registration status'), '#value' => array_search('registered', $account->roles) ? "Status: <strong>registered</strong>" : "Status: <strong>not</strong> registered", '#weight' => 5, ); } } } } break; } } Greetings, -- Alberto