उपयोगकर्ता नाम में विशेष चरित्र की अनुमति कैसे दें?


9

क्या "#" और "~" जैसे उपयोगकर्ता नाम के विशेष वर्ण को अनुमति देने का कोई तरीका है?

जवाबों:


11

आपको अवशिष्ट user_validate_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';

  }
}

और पंजीकरण के अंदर_सर्ननाम_वायुलेट फ़ंक्शन आपके विशेष वर्णों को अनुमति देने के लिए आपके तर्क करते हैं।

उपयोगकर्ता नाम में विशेष वर्णों की अनुमति देने के कारण होने वाली सुरक्षा समस्याओं के बारे में और विषयों में स्वच्छता उपयोगकर्ता नाम न होने के बारे में प्रदर्शन हो सकता है।


5
ध्यान दें, $form['#validate'] = array();किसी भी मौजूदा मान्य हैंडलर को क्लोब करेगा, जिसमें संभावित रूप से अन्य कंट्रिब / कस्टम मॉड्यूल द्वारा सेट किया गया है। बेहतर करने के लिए चुनिंदा परेशान वैध समारोह से परेशान हैं।
डेविड थॉमस

@ पार थन। मैंने पुराने डेटाबेस की जांच की मेरे पास केवल दो उपयोगकर्ता हैं इसलिए मैं उपयोगकर्ता को उनके उपयोगकर्ता नाम बदलने की सूचना दूंगा। धन्यवाद btw आपका समाधान अच्छा है। ;)
सुमित मदन

यह भी ध्यान देने योग्य है कि यह तरीका user.module के अंदर Drupal कोर फ़ंक्शन को हैक करने के लिए बहुत बेहतर है
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);
}

अभी भी एक विशेष चरित्र की जांच है, हालांकि यह केवल अदृश्य या विशेष उपयोग पात्रों के लिए जांच करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.