2010-02-15 12 views
8

Quiero enganchar en el módulo de registro. Ya tengo una base de datos de 50000 usuarios que usan mi sitio web anterior. Ahora estoy migrando a Drupal.Enganche en el registro de Drupal y valide la información del usuario contra la lógica comercial

Todavía no he migrado las entradas a la base de datos drupal. Verificaré mi antigua base de datos.

Cuando un usuario intenta registrarse en Drupal, necesito comprobar si el nombre de usuario que dio ya está presente en esa lista de 50000 entradas (en crecimiento). Si existe, necesito cancelar el registro que muestra un mensaje de error que dice que existe un nombre de usuario.

¿Qué gancho debo usar? Si mi código indica que la validación falló, ¿cómo puedo decirle a drupal que muestre un mensaje de error?

Editar: Conecté en el hook_user y comprobé la opción 'validate'. Puedo validar y asignar mensajes de error. Pero está sucediendo para todas las formas. Quiero validar solo el nuevo formulario de creación de cuenta. ¿Cómo puedo hacer eso?

Gracias.

Respuesta

18

Debe registrar una función de devolución de llamada de validación adicional para el formulario de registro utilizando hook_form_FORM_ID_alter(), algo así:

// Alter the registration form 
function yourModuleName_form_user_register_alter(&$form, &$form_state) { 
    // Add your own function to the array of validation callbacks 
    $form['#validate'][] = 'yourModuleName_user_register_validate'; 
} 

// Perform your own validation 
function yourModuleName_user_register_validate($form, &$form_state) { 
    // Extract the submitted name 
    $name = $form_state['values']['name']; 
    // Check it according to your own logic 
    $is_valid_name = your_check_for_valid_name(); 
    // File error, when not valid 
    if (!$is_valid) { 
    form_set_error('name', t('Name already taken, please choose a different one')); 
    } 
} 
+1

+1 Muchas gracias. Funcionó, puedo establecer la validación de los campos de ese formulario en particular. No sabía lo de FORM_ID, utilicé otro gancho y se ejecutaba para todas las formas: D – user266803

+0

Aunque esta es una gran solución, tenga en cuenta que actualmente Drupal ejecuta hook_form_alter DESPUÉS de hook_form_FORM_ID_alter. Así que puede haber un caso en el camino donde otro módulo anulará los cambios en hook_form_FORM_ID_alter. 95% de las veces no se encontrará con un problema, pero algunos dicen que es más seguro usar hook_form_alter y una instrucción switch. –

+0

Si su función de validación solo está revisando un solo campo, considere crear una función [Validación del elemento] (https://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7#element_validate) en su lugar. – rymo

6

Henrik Opel trabajo respuesta en Drupal 6. Para Drupal 7 uso yourModuleName_form_user_register_form_alter

1

Éstos son algunos Ejemplos para Drupal 7:

/** 
* Implements of hook_user_insert(). 
*/ 
function foo_user_insert(&$edit, $account, $category) { 
    // foo_user_submit($edit, $account); 
} 

/** 
* Implementation of hook_user_delete(). 
*/ 
function foo_user_delete($account) { 
    // foo_user_delete($account); 
} 

/** 
* Implements hook_form_FORM_ID_alter(). 
* Form ID: user_register_form 
*/ 
function foo_form_user_register_form_alter($form, &$form_state) { 
    if ($form['#user_category'] == 'account' && !isset($form['#user']->uid)) { 
    // Foo code 
    } 
} 

/** 
* Implements hook_form_FORM_ID_alter(). 
* Form ID: user_profile_form 
*/ 
function foo_form_user_profile_form_alter($form, &$form_state) { 
    // Set a custom form validate and submit handlers. 
    $form['#validate'][] = 'foo_account_validate'; 
    $form['#submit'][] = 'foo_account_submit'; 
} 

/** 
* Implements of hook_form_alter(). 
* This is the same as: hook_form_FORM_ID_alter() 
*/ 
function foo_form_alter(&$form, $form_state, $form_id) { 
    switch ($form_id) { 
    case "user_profile_form": 
    case "user_register_form": 
     break; 
    } 
} 
Cuestiones relacionadas