Kullanıcı adında özel karakterlere nasıl izin verilir?


9

"#" Ve "~" gibi kullanıcı adlarında özel karaktere izin vermenin bir yolu var mı?

Yanıtlar:


11

Defualt user_validate_name ($ name) öğesini geçersiz kılmalısınız :

Verify the syntax of the given name.

Bunu yapmak için, özel modülünüzde kullanıcı adı doğrulama kodunuzu tanımlayın

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

  }
}

Registration_username_validate işlevi içinde özel karakterlerinize izin vermek için mantığınızı yapın.

Hakkında Bakım güvenlik meseleleri kullanıcı adını ve ayıklanmış adları temalarda neden olabilir görüntüleme sorunları hakkında özel karakter izin vererek neden oldu.


5
Not $form['#validate'] = array();diğer contrib / özel modüllerle potansiyel olanlar seti de dahil olmak üzere mevcut tüm validate işleyicileri pataklayacak. Geçersiz kılınmış doğrulama işlevini seçici olarak ayarlamak daha iyidir.
David Thomas

@ kaya thanx. Ben sadece iki kullanıcı var eski veritabanı kontrol kullanıcı adını değiştirmek için kullanıcıya bildirir. Teşekkürler btw çözümünüz iyi. ;)
Sumit Madan

Ayrıca, bu yöntemin user.module içindeki Drupal çekirdek işlevini hacklemede çok tercih edildiğini belirtmek gerekir
sheldonkreger

MODULE_form_user_register_form_alter ()
sheldonkreger

Bu cevap tehlikelidir. As David Thomas belirtilen bu varsayılan dahil başka hiçbir doğrulayıcılarını yerini alacak user_account_form_validatesadece kullanıcı adı daha doğrular fonksiyonu. Bunu değiştirmek yinelenen kullanıcı adlarına izin verebilir! Bu sorunları çözen bir cevap ekledim .
donut

1

Ne yazık ki, bunu yapmanın doğrudan bir yolu yok. Varsayılan olarak user_register_formve user_profile_formvar user_account_form_validateonların ilk doğrulayıcı olarak ayarlayın $form['#validate']. user_account_form_validate()bir hesabın adını, e-postasını ve imzasını denetler ve temizler. Adı kontrol etmenin bir parçası olarak bir çağrı yapar user_validate_name(). Bu geçersiz kılmak istediğimiz işlevdir, değil user_account_form_validate.

Biri yararlı bir kanca için geçersiz kılmak için umut, ama ne yazık ki. Ben adı aynısı olup olmadığını görmek için de çek olarak e-postanın doğrulama ve imza umursamadı, ben sadece kaldırabilir user_account_form_validatedan $form['#validate']. Ama bu iyi değil. Bunun yerine, user_validate_name()özel karakter kontrolü olmadan çalışmayı geri alan ve her şeyi yeniden yapan ek bir doğrulayıcı ekliyorum .

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

Hala özel bir karakter kontrolü var, ancak sadece görünmez veya özel kullanım karakterlerini kontrol ediyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.