Bagaimana cara mengizinkan karakter khusus dalam nama pengguna?


9

Apakah ada cara untuk mengizinkan karakter khusus dalam nama pengguna seperti "#" dan "~"?

Jawaban:


11

Anda harus mengganti defualt user_validate_name ($ name) :

Verify the syntax of the given name.

Untuk melakukannya, tentukan kode validasi nama pengguna Anda dalam modul khusus Anda

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

  }
}

Dan di dalam fungsi registration_username_validate lakukan logika Anda untuk memungkinkan karakter khusus Anda.

Peduli tentang masalah keamanan yang disebabkan oleh mengizinkan karakter khusus di nama pengguna dan tentang masalah tampilan yang tidak membersihkan nama pengguna dapat menyebabkan tema.


5
Catatan, $form['#validate'] = array();akan mengalahkan setiap penangan yang valid yang ada, termasuk yang berpotensi diatur oleh modul contrib / custom lainnya. Lebih baik selektif membatalkan fungsi validasi ditimpa.
David Thomas

@ batuan thanx. Saya memeriksa database lama saya hanya memiliki dua pengguna jadi saya akan memberi tahu pengguna untuk mengubah nama pengguna mereka. Terima kasih, solusimu bagus. ;)
Sumit Madan

Juga patut dicatat bahwa metode ini jauh lebih disukai daripada meretas fungsi inti Drupal di dalam
user.module

Dimungkinkan juga untuk menggunakan fungsi MODULE_form_user_register_form_alter ()
sheldonkreger

Jawaban ini berbahaya. Seperti yang dikatakan David Thomas, ini akan menggantikan validator lain, termasuk user_account_form_validatefungsi default yang memvalidasi lebih dari sekadar nama pengguna. Mengganti ini bisa membuat nama pengguna duplikat! Saya telah menambahkan jawaban yang mengatasi masalah ini.
donat

1

Sayangnya, tidak ada jalan lurus ke depan untuk melakukan ini. Secara default user_register_formdan user_profile_formtelah user_account_form_validateditetapkan sebagai validator pertama mereka di $form['#validate']. user_account_form_validate()memeriksa dan membersihkan nama, email, dan tanda tangan akun. Sebagai bagian dari memeriksa nama itu membuat panggilan ke user_validate_name(). Ini adalah fungsi yang ingin kita timpa, bukan user_account_form_validate.

Orang akan berharap untuk mendapatkan kait yang bermanfaat untuk menimpanya, tetapi sayang sekali. Jika saya tidak peduli tentang validasi email dan tanda tangan serta cek untuk melihat apakah nama adalah duplikat, saya hanya bisa menghapus user_account_form_validatedari $form['#validate']. Tapi itu tidak baik. Sebagai gantinya, saya menambahkan validator tambahan yang membatalkan pekerjaan user_validate_name()dan mengulang semuanya tanpa pemeriksaan karakter khusus.

<?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);
}

Masih ada pemeriksaan karakter khusus, namun hanya memeriksa karakter penggunaan tidak terlihat atau khusus.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.