উত্তর:
আপনাকে ডিফল্ট ব্যবহারকারী_ডিয়ালিটি_নেম ($ নাম) ওভাররাইড করতে হবে :
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';
}
}
এবং নিবন্ধের ভিতরে_ ব্যবহারকারী নাম_ডিয়্যালিটি ফাংশন আপনার বিশেষ অক্ষরগুলিকে মঞ্জুরি দেওয়ার জন্য আপনার যুক্তি যুক্ত করুন।
যত্নশীল নিরাপত্তা বিষয়ক ব্যবহারকারীর নাম ও ডিসপ্লে সমস্যা না sanitized ব্যবহারকারীর নাম থিম মধ্যে হতে পারে সম্পর্কে বিশেষ অক্ষর অনুমতি দিয়ে সৃষ্টি করেছে।
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();
অন্যান্য অবদান / কাস্টম মডিউল দ্বারা সম্ভাব্য সেটগুলি সহ যে কোনও বিদ্যমান বৈধ যাচাই করা হ্যান্ডলারগুলিকে ক্লোবার করবে। ওভাররাইড বৈধতা ফাংশন নির্বাচন করে আনসেট করা ভাল।