Wie erlaube ich Sonderzeichen im Benutzernamen?

9

Gibt es eine Möglichkeit, das Sonderzeichen im Benutzernamen wie "#" und "~" zuzulassen?

Sumit Madan
quelle

Antworten:

11

Sie müssen den defualt user_validate_name ($ name) überschreiben :

Verify the syntax of the given name.

Definieren Sie dazu Ihren Validierungscode für den Benutzernamen in Ihrem benutzerdefinierten Modul

function MODULENAME_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'user_register') {      
    $form['#validate'] = array();
    $form['#validate'][] = 'registration_username_validate';

  }
}

Und innerhalb der Funktion register_username_validate führen Sie Ihre Logik aus, um Ihre Sonderzeichen zuzulassen.

Bedenken Sie Sicherheitsprobleme, die durch das Zulassen von Sonderzeichen im Benutzernamen verursacht werden, und Probleme mit der Anzeige, die nicht bereinigte Benutzernamen in Themen verursachen können.

Mołot
quelle
5
Beachten Sie, $form['#validate'] = array();dass alle vorhandenen Validierungshandler überlastet werden, einschließlich der möglicherweise von anderen Contrib / Custom-Modulen festgelegten. Besser, die überschriebene Validierungsfunktion selektiv zu deaktivieren.
David Thomas
@rock Danke. Ich habe die alte Datenbank überprüft. Ich habe nur zwei Benutzer, daher werde ich den Benutzer über die Änderung seines Benutzernamens informieren. Danke übrigens, Ihre Lösung ist gut. ;)
Sumit Madan
Erwähnenswert ist auch, dass diese Methode dem Hacken der Drupal-Kernfunktion in user.module
sheldonkreger am
Es ist auch möglich, die Funktion MODULE_form_user_register_form_alter ()
sheldonkreger
Diese Antwort ist gefährlich. Wie David Thomas erwähnte, ersetzt dies alle anderen Validatoren, einschließlich der Standardfunktion user_account_form_validate, die mehr als nur den Benutzernamen validiert. Das Ersetzen könnte doppelte Benutzernamen ermöglichen! Ich habe eine Antwort hinzugefügt , die diese Probleme umgeht.
Donut
1

Leider gibt es dafür keinen direkten Weg. In der Standardeinstellung user_register_formund user_profile_formhat user_account_form_validateals ersten Validator gesetzt in $form['#validate']. user_account_form_validate()Überprüft und bereinigt den Namen, die E-Mail-Adresse und die Unterschrift eines Kontos. Im Rahmen der Überprüfung des Namens wird ein Anruf getätigt user_validate_name(). Dies ist die Funktion, die wir überschreiben möchten, nicht user_account_form_validate.

Man würde auf einen hilfreichen Haken hoffen, um ihn zu überschreiben, aber leider. Wenn ich nicht über die Validierung der E - Mail und Unterschrift sowie die Überprüfung, scherte , wenn der Name ein Duplikat ist, konnte ich einfach entfernen user_account_form_validateaus $form['#validate']. Aber das ist nicht gut. Stattdessen füge ich einen zusätzlichen Validator hinzu, der die Arbeit von rückgängig macht user_validate_name()und alles ohne die Sonderzeichenprüfung wiederholt.

<?php
function MODULENAME_form_user_register_form_alter(
  array &$form, array &$form_state, $form_id)
{
  MODULENAME_add_name_validator($form);
}

function MODULENAME_form_user_profile_form_alter(
  array &$form, array &$form_state, $form_id)
{
  MODULENAME_add_name_validator($form);
}

function MODULENAME_add_name_validator(array &$form)
{
  $validate =& $form['#validate'];
  # Since `validate_name()` clears out any errors for the "name" field, we
  # want to put it right after the validator we want to partially override.
  $acct_validate_index = array_search('user_account_form_validate', $validate);
  array_splice($validate, ($acct_validate_index + 1), 0,
    ['MODULENAME_validate_name']
  );
}

function MODULENAME_validate_name(array $form, array &$form_state)
{
  # There is no blessed way of overriding the call to `user_validate_name()` in
  # `user_account_form_validate()`.
  $errors =& drupal_static('form_set_error', []);
    # Yes, this gets the errors. `form_get_error()` uses this method so... yeah.
  if (!isset($errors['name']))
    # `user_validate_name()` is a superset of what is checked here. If the name
    # passed that validation, no need to rerun things.
    return;

  # `form_set_error()` also calls `drupal_set_message()` if it finds an
  # error.
  $msg_index = array_search($errors['name'], $_SESSION['messages']['error']);
  if ($msg_index !== false) {
    unset($_SESSION['messages']['error'][$msg_index]);
    if (empty($_SESSION['messages']['error']))
      unset($_SESSION['messages']['error']);
  }
  unset($errors['name']);

  $name = isset($form_state['values']['name'])
          ? $form_state['values']['name'] : null;

  # These checks are taken from `user_validate_name()`, simply excluding the
  # for characters we don't mind being in the names.
  if (!$name)
    $error = t('You must enter a username.');
  else if (substr($name, 0, 1) == ' ')
    $error = t('The username cannot begin with a space.');
  else if (substr($name, -1) == ' ')
    $error = t('The username cannot end with a space.');
  else if (strpos($name, '  ') !== FALSE)
    $error = t('The username cannot contain multiple spaces in a row.');
  else if (preg_match('/[\x{80}-\x{A0}' .   // Non-printable ISO-8859-1 + NBSP
                      '\x{AD}' .            // Soft-hyphen
                      '\x{2000}-\x{200F}' . // Various space characters
                      '\x{2028}-\x{202F}' . // Bidirectional text overrides
                      '\x{205F}-\x{206F}' . // Various text hinting characters
                      '\x{FEFF}' .          // Byte order mark
                      '\x{FF01}-\x{FF60}' . // Full-width latin
                      '\x{FFF9}-\x{FFFD}' . // Replacement characters
                      '\x{0}-\x{1F}]/u',    // NULL byte and control characters
                      $name))
    $error = t('The username contains an illegal character.');
  else if (drupal_strlen($name) > USERNAME_MAX_LENGTH)
    $error = t('The username %name is too long: it must be %max characters '
              .'or less.'
              ,['%name' => $name, '%max' => USERNAME_MAX_LENGTH]);

  if (isset($error))
    form_set_error('name', $error);
}

Es gibt immer noch eine Sonderzeichenprüfung, jedoch nur nach unsichtbaren Zeichen oder Sonderzeichen.

Krapfen
quelle