사용자 이름에 특수 문자를 허용하는 방법은 무엇입니까?


9

"#"및 "~"와 같이 username에 특수 문자를 허용 할 수있는 방법이 있습니까?

답변:


11

defualt user_validate_name ($ name) 을 재정의해야합니다 .

Verify the syntax of the given name.

이를 위해 사용자 정의 모듈에서 사용자 이름 유효성 검사 코드를 정의하십시오.

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 함수 내에서 특수 문자를 허용하는 논리를 수행하십시오.

신경 보안 문제 사용자 이름과하지 소독 사용자 이름이 테마에 발생할 수 표시 문제에 대한 특수 문자를 허용하여 발생.


5
참고 $form['#validate'] = array();다른있는 contrib / 맞춤형 모듈에 의해 잠재적으로 그 세트를 포함, 기존의 검증 핸들러를 소지품 것입니다. 재정의 된 유효성 검사 기능을 선택적으로 설정 해제하는 것이 좋습니다.
David Thomas

@rock 고맙습니다. 이전 데이터베이스를 확인했는데 사용자가 두 명뿐이므로 사용자 이름 변경을 사용자에게 알립니다. 당신의 솔루션이 좋은 btw 감사합니다. ;)
Madan 서밋

또한 가치가이 방법은 user.module 내부의 드루팔 핵심 기능을 해킹 훨씬 바람직하다 것을주의
sheldonkreger

MODULE_form_user_register_form_alter () 함수를 사용할 수도 있습니다.
sheldonkreger

이 답변은 위험합니다. 데이비드 토마스는 언급 이 기본을 포함한 다른 검사기, 대체 할 것이다 user_account_form_validate단지 이름보다 더 유효성을 검사 기능을. 이를 대체하면 사용자 이름이 중복 될 수 있습니다! 이 문제를 해결 하는 답변 을 추가 했습니다 .
도넛

1

불행히도이를 수행하는 직접적인 방법은 없습니다. 기본적으로 user_register_form하고 user_profile_form있습니다 user_account_form_validate에서 첫 검사기로 설정 $form['#validate']. user_account_form_validate()계정의 이름, 이메일 및 서명을 확인하고 정리합니다. 이름을 확인하는 과정에서을 호출합니다 user_validate_name(). 이것은 우리가 재정의하고 싶지 않은 함수 user_account_form_validate입니다.

도움이되는 후크가 그것을 대체하기를 희망하지만 아아. 이메일 및 서명의 유효성 검사뿐만 아니라 이름이 중복인지 확인하는 데 신경 쓰지 않으면 user_account_form_validate에서 제거 할 수 있습니다 $form['#validate']. 그러나 그것은 좋지 않습니다. 대신 user_validate_name()특수 문자 확인없이 모든 작업을 취소 하고 다시 실행하는 유효성 검사기를 추가합니다 .

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

여전히 특수 문자 검사가 있지만 보이지 않거나 특수한 용도 문자 만 검사합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.