2010-02-15 1 views
8

Я хочу подключиться к модулю регистрации. У меня уже есть база данных из 50000 пользователей, которые используют мой старый веб-сайт. Теперь я перехожу на Drupal.Захват регистрации Drupal и проверка информации о пользователе против бизнес-логики

Я до сих пор не переносил записи в базу данных drupal. Я буду проверять свою прежнюю базу данных.

Когда пользователь пытается зарегистрироваться в Drupal, мне нужно проверить, указано ли имя пользователя, которое он дал, в списке из 50000 (и растущих) записей. Если он существует, мне нужно отменить регистрацию с сообщением об ошибке. Msg сказал, что имя пользователя существует.

Какой из них использовать? Если мой код показывает, что проверка не удалась, как я могу сообщить drupal, чтобы отобразить сообщение об ошибке?

Редактировать: я подключился к hook_user и проверил на «проверку» op. Я могу проверять и назначать сообщения об ошибках. Но это происходит для всех форм. Я хочу проверить только новую форму создания учетной записи. Как я могу это сделать?

Спасибо.

ответ

18

Вы должны зарегистрировать дополнительную функцию обратного вызова проверки для формы регистрации с помощью hook_form_FORM_ID_alter(), вроде так:

// 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 Большое спасибо. Он работал, я могу установить валидацию для полей (ов) этой конкретной формы. Я не знал о FORM_ID, я использовал другой крючок, и он работал для всех форм: D – user266803

+0

Хотя это отличное решение, имейте в виду, что в настоящее время Drupal запускает hook_form_alter ПОСЛЕ hook_form_FORM_ID_alter. Таким образом, может произойти случай, когда другой модуль переместит ваши изменения hook_form_FORM_ID_alter. 95% времени, когда вы не столкнулись с проблемой, но некоторые говорят, что безопаснее использовать hook_form_alter и оператор switch. –

+0

Если ваша функция проверки проверяет только одно поле, подумайте над созданием функции [Проверка элементов] (https://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7#element_validate). – rymo

6

Henrik Opel ответ Работа на Drupal 6. Для Drupal 7 использования yourModuleName_form_user_register_form_alter

1

Вот некоторые примеры для 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; 
    } 
}