2010-02-15 2 views
8

Ich möchte in das Registrierungsmodul einhängen. Ich habe bereits eine Datenbank mit 50000 Benutzern, die meine alte Website verwenden. Jetzt migriere ich nach Drupal.Haken in Drupal Registrierung und validiere Benutzerinformationen gegen Geschäftslogik

Ich habe noch nicht die Einträge in die Drupal-Datenbank migriert. Ich werde nach meiner alten Datenbank suchen.

Wenn ein Benutzer versucht, sich in Drupal zu registrieren, muss ich überprüfen, ob der Benutzername, den er gab, bereits in dieser Liste von 50000 (und wachsenden) Einträgen vorhanden ist. Wenn es existiert, muss ich die Registrierung abbrechen, die eine Fehlermeldung anzeigt, dass der Benutzername existiert.

Welchen Haken soll ich verwenden? Wenn mein Code feststellt, dass die Validierung fehlgeschlagen ist, wie kann ich Drupal mitteilen, dass eine Fehlermeldung angezeigt wird?

Edit: Ich hakte in den hook_user und überprüft für die 'validate' op. Ich bin in der Lage, Fehlermeldungen zu validieren und zuzuweisen. Aber es passiert für alle Formen. Ich möchte nur das neue Kontoerstellungsformular validieren. Wie kann ich das machen?

Danke.

Antwort

18

Sie sollten eine zusätzliche Validierung Callback-Funktion für das Anmeldeformular registrieren hook_form_FORM_ID_alter() verwenden, ein wenig wie so:

// 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 Vielen Dank. Es hat funktioniert, ich bin in der Lage, die Validierung für die Felder dieses bestimmten Formulars festzulegen. Ich wusste nichts über die FORM_ID-Sache, ich benutzte einen anderen Haken und es lief für alle Formen: D – user266803

+0

Obwohl dies eine großartige Lösung ist, bedenken Sie, dass Drupal derzeit hook_form_alter AFTER hook_form_FORM_ID_alter ausführt. So kann es einen Fall auf der Straße geben, wo ein anderes Modul Ihre hook_form_FORM_ID_alter Änderungen übersteuert. In 95% der Fälle wird kein Problem auftreten, aber einige sagen, dass es am sichersten ist, hook_form_alter und eine switch-Anweisung zu verwenden. –

+0

Wenn Ihre Überprüfungsfunktion nur ein einzelnes Feld überprüft, sollten Sie stattdessen die Funktion [Elementüberprüfung] (https://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7#element_validate) erstellen. – rymo

6

Henrik Opel Antwort Arbeit auf Drupal 6. Für Drupal 7 Verwendung yourModuleName_form_user_register_form_alter

1

Hier sind einige Beispiele für 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; 
    } 
} 
Verwandte Themen