drupaldrupal-7drupal-modulesdrupal-formsdrupal-hooks

Drupal custom user registration form


I have built a custom registration form using module_form_alter hook. I have also added the required new fields to the database with db_add_field. Now I'm able to add the values to the table in user registration/ user profile edit and the values are also getting stored in the database.. But what I'm not able to do is get the values that are stored in the database in the user profile edit form is displayed. Is there a hook to load the values from database to form on form load? Or is there any other way?

 function customUser_schema_alter(&$schema) {
   // Add field to existing schema.
   $schema['users']['fields']['detail'] = array(
         'type' => 'varchar',
         'length' => 100,
   );

 }

 function customUser_install() {
   $schema = drupal_get_schema('users');
   db_add_field('users', 'detail', $schema['fields']['detail']);
 }

 function customUser_form_alter(&$form, &$form_state, $form_id) {
 // check to see if the form is the user registration or user profile form
 // if not then return and don’t do anything
   if (!($form_id == 'user_register_form' || $form_id == 'user_profile_form')) {
     return;
   }
   $form['account']['detail'] = array(
       '#type' => 'textfield',
       '#title' => t('Additional Detail'),
     );
   }

Solution

  • A proper answer needs more details. I can only assume what you did.

    1. You added fields to the {users} table. You didn't update the database schema which made drupal_write_record not be aware of the new fields, that being the reason they are not populated.
    2. You created a new table {my_table} with the fields.

    In both cases you need hook_user_insert()

    /**
     * Implements hook_user_insert().    
     */
    function mymodule_user_insert(&$edit, $account, $category) {
      // Here you add the code to update the entry in {users} table,
      // or int your custom table.
      // $edit has the values from the form, $account->uid has the
      // uid of the newly created user.
    }
    

    Note: If my first assumption is true that's not the drupal way to do it. You should have done the 2nd way instead. And even in that case use the hook_schema to create your table in mymodule.install instead of doing db_add_field().

    For drupal 7 you could have uses the profile module (core) or profile2 to achieve that.

    Based on that code Try to change to this inside the form alter.

    $account = $form['#user'];
    $form['account']['detail'] = array(
      '#type' => 'textfield',
      '#title' => t('Additional Detail'),
      '#default_value' => $account->detail,
    );