ব্যবহারকারীর নামটিতে কীভাবে বিশেষ চরিত্রের অনুমতি দেওয়া যায়?


9

"#" এবং "~" এর মতো ব্যবহারকারীর নামটিতে বিশেষ চরিত্রের অনুমতি দেওয়ার কোনও উপায় আছে কি?

উত্তর:


11

আপনাকে ডিফল্ট ব্যবহারকারী_ডিয়ালিটি_নেম ($ নাম) ওভাররাইড করতে হবে :

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 ব্যবহারকারীর নাম থিম মধ্যে হতে পারে সম্পর্কে বিশেষ অক্ষর অনুমতি দিয়ে সৃষ্টি করেছে।


5
দ্রষ্টব্য, $form['#validate'] = array();অন্যান্য অবদান / কাস্টম মডিউল দ্বারা সম্ভাব্য সেটগুলি সহ যে কোনও বিদ্যমান বৈধ যাচাই করা হ্যান্ডলারগুলিকে ক্লোবার করবে। ওভাররাইড বৈধতা ফাংশন নির্বাচন করে আনসেট করা ভাল।
ডেভিড থমাস

@ রক থ্যাঙ্কস আমি পুরাতন ডাটাবেসটি পরীক্ষা করেছি মাত্র আমার দু'জন ব্যবহারকারী তাই আমি তাদের ব্যবহারকারীর নাম পরিবর্তনের বিষয়ে ব্যবহারকারীকে অবহিত করব। ধন্যবাদ বিটিডব্লিউ আপনার সমাধানটি ভাল। ;)
সুমিত মদন

এছাড়াও লক্ষণীয় যে এই পদ্ধতিটি ইউজার.মডিউলের অভ্যন্তরে ড্রুপাল কোর ফাংশন হ্যাক করার চেয়ে বেশি পছন্দনীয়
শেলডনক্রেজার

এটি MODULE_for_user_register_form_alter ()
শেল্ডনক্রিজার

এই উত্তরটি বিপজ্জনক। ডেভিড থমাস যেমন উল্লেখ করেছেন এটি ডিফল্ট 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.