जवाबों:
आपको अवशिष्ट 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';
}
}
और पंजीकरण के अंदर_सर्ननाम_वायुलेट फ़ंक्शन आपके विशेष वर्णों को अनुमति देने के लिए आपके तर्क करते हैं।
उपयोगकर्ता नाम में विशेष वर्णों की अनुमति देने के कारण होने वाली सुरक्षा समस्याओं के बारे में और विषयों में स्वच्छता उपयोगकर्ता नाम न होने के बारे में प्रदर्शन हो सकता है।
user_account_form_validate
फ़ंक्शन सहित किसी भी अन्य सत्यापनकर्ताओं को प्रतिस्थापित करेगा, जो केवल उपयोगकर्ता नाम से अधिक मान्य है। इसे बदलने से डुप्लिकेट उपयोगकर्ता नाम की अनुमति दी जा सकती है! मैंने एक उत्तर जोड़ा है जो इन मुद्दों के आसपास मिलता है।
दुर्भाग्य से, ऐसा करने का कोई सीधा आगे का रास्ता नहीं है। डिफ़ॉल्ट रूप से 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);
}
अभी भी एक विशेष चरित्र की जांच है, हालांकि यह केवल अदृश्य या विशेष उपयोग पात्रों के लिए जांच करता है।
$form['#validate'] = array();
किसी भी मौजूदा मान्य हैंडलर को क्लोब करेगा, जिसमें संभावित रूप से अन्य कंट्रिब / कस्टम मॉड्यूल द्वारा सेट किया गया है। बेहतर करने के लिए चुनिंदा परेशान वैध समारोह से परेशान हैं।