জুমলা রেজিস্ট্রেশন: অনিবদ্ধ ক্ষেত্রগুলি সরান


16

প্রথমত, আমি এই প্রশ্ন সম্পর্কে সচেতন:

/programming/14799733/remove-name-field-from-joomla-registration-form

তবে এর উত্তরের লিঙ্কটি মারা গেছে, এবং উল্লিখিত ফাইলের পাথটি সর্বশেষ জুমলার (সংস্করণ 3.3) তে বিদ্যমান নেই, সুতরাং উত্তরটি কোনওভাবেই ব্যবহারযোগ্য নয়।

আমি যা চাই তা সহজ: জুমলার রেজিস্ট্রেশন ফর্মটি দেখতে এই জাতীয় দেখাচ্ছে:

রেজিস্ট্রেশন ইমেজ ডিফল্ট

আমি নিশ্চিত করতে চাই যে নিবন্ধকরণ প্রক্রিয়াটি আমার ব্যবহারকারীদের পক্ষে যথাসম্ভব সহজ যাতে তারা প্রকৃতপক্ষে এটি সম্পন্ন করে এবং কিছু সমস্যা আছে:

  • আমার ব্যবহারকারীর আসল নামটি জানার দরকার নেই।
  • আমি বরং "কনফার্ম" বাক্সগুলি রাখতাম না। সাধারণ sensক্যমত্য হ'ল এগুলি প্রয়োজনীয় নয়। /ux/484/is-a-repeat-password-field-necessary-in-a-signup-page
  • সমস্ত কিছুই প্রয়োজনীয়, কেন প্রয়োজনীয় ক্ষেত্রগুলি চিহ্নিত করতে বিরক্ত করবেন?

অবশ্যই এটি একটি আরও ভাল নিবন্ধকরণ পৃষ্ঠা:

ভাল রেজিস্ট্রেশন ইমেজ

আমি ফর্মটি দেখতে চাই যা দেখতে চাই তার মতো দেখতে \ উপাদান \ com_users \ মডেল \ ফর্ম \ नोंदणी.xML ফাইলটি পরিবর্তন করেছি এবং এটি কাজ করেছে! তবে আমি যখনই ফর্মটি জমা দিই, বৈধতা এখনও অনুপস্থিত ক্ষেত্রগুলির সন্ধান করে, সুতরাং এটি আমাকে জানিয়ে দেয় যে আমার একটি নাম সরবরাহ করতে হবে:

"নিবন্ধকরণ ব্যর্থ হয়েছে: দয়া করে আপনার নাম দিন।"

নাম ক্ষেত্রের পাশাপাশি দুটি নিশ্চিত ক্ষেত্রের জন্য আমি চেকগুলি কীভাবে অক্ষম করতে পারি?

যেহেতু একটি নাম প্রয়োজনীয়, আমি নামটি সরবরাহকারীর নামটিতে সেট করতে চাই (সুতরাং ব্যবহারকারী নাম এবং নাম ডিফল্টরূপে একই) same ব্যবহারকারী যদি নিবন্ধের পরে তাদের প্রোফাইল পৃষ্ঠায় একটি প্রকৃত নাম রাখতে চান তবে তাদের সক্ষম হওয়া উচিত, তবে এটির প্রয়োজন হবে না।

আমি কি এই ভুল পথে চলছি? আমি কয়েকটি জায়গায় পড়েছি যে মূল জুমলা ফাইলগুলি সংশোধন করা ভাল নয়, কারণ এটি কোনও আপডেটে ভেঙে যেতে পারে এবং পরিবর্তে "ওভাররাইড" ব্যবহার করা উচিত। সাধারণত এই প্রতিক্রিয়াগুলি ওভাররাইডগুলিতে জুমলার পৃষ্ঠার সাথে কেবল লিঙ্ক করে এবং প্রশ্নকর্তা কী চায় সেগুলি কীভাবে তাদের ব্যবহার করতে হয় সে সম্পর্কে আরও কোনও ব্যাখ্যা সরবরাহ করে না। আমি এগুলি বের করার চেষ্টা করেছি, কিন্তু পারছি না, সুতরাং ওভাররাইডগুলি যদি যাওয়ার উপায় হয় তবে দয়া করে ওভাররাইড টিউটোরিয়ালের সাথে লিঙ্ক না করে কীভাবে আমি তাদের সাথে এটি করতে যাব তা ব্যাখ্যা করুন।

আপনি যে কোনও সহায়তা সরবরাহ করতে পারেন তার আমি প্রশংসা করব, আমি কয়েক ঘন্টা ধরে এটি বের করার চেষ্টা করছি!


1
আমি জেইডিকে এই জাতীয় কিছু করার জন্য এক্সটেনশনের সম্ভাব্য উত্স হিসাবে চিহ্নিত করতে চাই।
ভ্যালেন্টিন দেশপা

@ যাচাইকরণ প্রক্রিয়াটি এড়াতে আপনি যে তথ্য sertedোকালেন তাতে লডার ধন্যবাদ, তবে আমি ভয় করি যে এটি আমার টেমপ্লেটে কাজ করছে না। আপনি কি দয়া করে কোডটি পরীক্ষা করে এক সাথে কাজ করে আপডেট করবেন? আমি @ রিক্সটারের প্রক্রিয়াটি অনুসরণ করেছি এবং এটি মনোযোগের মতো কাজ করেছে। আমি জুমলায় নবী আছি এবং সেজন্য এ ব্যাপারে আপনার সহায়তার জন্য অনুরোধ করছি। আগাম ধন্যবাদ.

আমি এই স্ট্যাকওভারফ্লো প্রশ্নের উত্তরটি পেয়েছি যা হতে পারে তা আপনি খুঁজে পেতে পারেন: জুমলা 3 নিবন্ধের কিছু ক্ষেত্রের বৈধতা কীভাবে অক্ষম করবেন
রব এল

উত্তর:


12

আদর্শভাবে, এটি সমস্ত একটি ব্যবহারকারী প্লাগইনে করা হবে। আমি নিশ্চিত নই যে প্রচুর লোকেরা এটি উপলব্ধি করে তবে আপনি একটি প্লাগইন থেকে ফর্মটি সম্পাদনা করতে পারেন (কোনও মূল হ্যাকের প্রয়োজন নেই)।

একইভাবে, মডেলটি এন্ট্রি সংরক্ষণের চেষ্টা করার আগে প্লাগইন ইনপুটটি দেখতে পাবে, যাতে আপনি কিছু ক্ষেত্রের সদৃশ ক্ষেত্রটিকে বৈধতা দিয়ে যেতে বাধ্য করতে বাধ্য করতে পারেন।

একটি "ব্যবহারকারী" প্লাগইনে এই ফ্যাকশন আপনাকে ফর্মটি পরিবর্তন করতে দেয়:

function onContentPrepareForm($form, $data)
{
    if (!($form instanceof JForm))
    {
        $this->_subject->setError('JERROR_NOT_A_FORM');
        return false;
    }

    // Check we are manipulating a valid form, 
    // may also want to check whether this is frontend or admin depending on where all you want to affect
    // JFactory::getApplication()->isAdmin()
    $name = $form->getName();
    if (!in_array($name, array('com_admin.profile', 'com_users.user', 'com_users.profile', 'com_users.registration')))
    {
        return true;
    }

    // remove fields on frontend
    if (!JFactory::getApplication()->isAdmin()) {
        $form->removeField('password2');
        $form->removeField('email2');
    }

    return true;
}

তারপরে যাচাইকরণ পাস করার জন্য আপনার যে কোনও ক্ষেত্রটি পুনরায় সেট করতে হবে এমন কোনও ক্ষেত্রটি পুনরায় সেট করতে আপনি একটি onUserBeforeSave ফাংশন ব্যবহার করতে পারেন। (এটি সম্পূর্ণ প্রয়োজনীয় নাও হতে পারে, তাই চেষ্টা করে দেখুন এবং কী কী ত্রুটি পেয়েছেন তা দেখুন))

function onUserBeforeSave($user, $isnew, $new) {
    $user['password2'] = $user['password1'];
}

8

ঠিক আছে তাই আমি কোনও হ্যাক কিছুই না করে বা কোনও তৃতীয় পক্ষের এক্সটেনশন ইনস্টল না করেই একটি পদ্ধতির কথা ভাবছিলাম। আমার পদ্ধতিতে একটি টেম্পলেট ওভাররাইড জড়িত থাকবে যা আপনাকে com_users উপাদান, বিশেষত রেজিস্ট্রেশন ভিউয়ের জন্য তৈরি করতে হবে ।

এখন ক্ষেত্রগুলির জন্য (ধরে নিলে আপনার টেম্পলেটটি ওভাররাইড সমস্ত সেটআপ হয়ে গেছে), আমরা সেগুলি সরিয়ে ফেলব না, পরিবর্তে এগুলি নিয়ন্ত্রণকারী এবং মোডাল হিসাবে লুকিয়ে রাখার জন্য তাদের কাছ থেকে ডেটা প্রয়োজন। সুতরাং নিম্নলিখিত ফাইলটি খুলুন যা এখন আপনার টেম্পলেটটি ওভাররাইড করে:

টেমপ্লেট / YOUR_TEMPLATE / HTML / com_users / নিবন্ধন / default.php

এবং ঠিক এর পরেই ফাইলটির শীর্ষের নিকটে নিম্নলিখিত কোডটি যুক্ত করুন JHtml::_('behavior.formvalidation');:

$doc = JFactory::getDocument();

$js = "
        jQuery(document).ready(function($){

            // Define the variables
            var regForm     = $('#member-registration');
            var name        = regForm.find('#jform_name');
            var password    = regForm.find('#jform_password1');
            var password2   = regForm.find('#jform_password2');
            var email       = regForm.find('#jform_email1');
            var email2      = regForm.find('#jform_email2');

            // Hide the required field, star, name, confirm pass and confirm email
            regForm.find('.spacer').parents('.control-group').hide();
            regForm.find('.star').hide();
            name.parents('.control-group').hide();
            password2.parents('.control-group').hide();
            email2.parents('.control-group').hide();

            // Add a default value to the name field
            name.val('Anonymous');

            // Clone password and email values to the confirm fields
            email.on('keyup', function() {
                email2.val( this.value );
            });
            password.on('keyup', function() {
                password2.val( this.value );
            });

        });    
    ";    
$doc->addScriptDeclaration($js);

আমি কয়েকটি মন্তব্যে যুক্ত করেছি যাতে আপনি জানেন যে কোডের প্রতিটি স্নিপেট কী করছে।

আশাকরি এটা সাহায্য করবে :)


1

@ ডেভিডফ্রিস্টের উত্তরটি খুব সহায়ক ছিল। বেশ কয়েকটি সমস্যা যা আমি পেয়েছি তা হ'ল:

ক) আপনি নির্দিষ্ট কিছু বাধ্যতামূলক ক্ষেত্রগুলি সম্পূর্ণরূপে সরাতে পারবেন না কারণ এটি ফর্ম জমা দেওয়ার ক্ষেত্রে ডেটা ফিল্টারিংয়ে সমস্যা সৃষ্টি করে (নীচের কোডে মন্তব্য দেখুন)। এটির বিরুদ্ধে লড়াই করতে, ফর্ম অবজেক্ট থেকে ক্ষেত্রগুলি সরিয়ে ফেলার পরিবর্তে আড়াল করুন। খ) অন-ইউজারবেফারসেজ ইভেন্টটি ফর্ম জমা দেওয়ার বিষয়টি প্রত্যাখ্যান থেকে নিবন্ধন বৈধতা যুক্তি যুক্তি থেকে বিরত করতে খুব বেশি দেরি না হওয়া পর্যন্ত বরখাস্ত করা হবে না। পরিবর্তে, ব্যবহারকারীর পূর্বে ডেটাভিলিডেশন ইভেন্টটি ব্যবহার করুন।

আমার বিশেষ ক্ষেত্রে, আমি যা চেয়েছিলাম তা হ'ল ইমেল ঠিকানা এবং পাসওয়ার্ড। জুমলা এখানে একটি জটিলতা ফেলেছিল যদিও ইমেল ঠিকানাটি পাসওয়ার্ডের পরে উপস্থিত হচ্ছিল (রেজিস্ট্রেশন.এক্সএমএল ফাইলে ঘোষিত ক্ষেত্রগুলির ক্রম দ্বারা নির্ধারিত), যা ব্যবহারকারীর অভিজ্ঞতার দৃষ্টিকোণ থেকে খালি দেখাবে। এর আশেপাশে কাজ করার জন্য, আমি ব্যবহারকারীর নামটি 'ইমেল ঠিকানা'-এ পুনরায় লেবেল করেছি এবং পরিবর্তে ইমেল ঠিকানা ক্ষেত্রটি লুকিয়ে রেখেছি। ফর্ম জমা দেওয়ার সময় ইমেলটি ব্যবহারকারীর নাম থেকে ডিফল্ট হয়।

(মাইনর নোট: আমি প্লাগইনটি কেবলমাত্র 'কম_উজারস.রেজিস্ট্রেশন' ফর্মটিতে কাজ করতে সীমাবদ্ধ করেছি, ডেভিডের উত্তরের তুলনায় যা অন্যান্য ফর্মগুলিও বিবেচনা করে))

class PlgUserSimpleRegistration extends JPlugin
{

function onContentPrepareForm($form, $data)
{
    if (!($form instanceof JForm))
    {
        $this->_subject->setError('JERROR_NOT_A_FORM');
        return false;
    }

    // Check we are manipulating the registration form
    if ($form->getName() != 'com_users.registration')
    {
        return true;
    }

    // Check whether this is frontend or admin
    if (JFactory::getApplication()->isAdmin()) {
        return true;
    }

    // Remove/Hide fields on frontend
    // Note: since the onContentPrepareForm event gets fired also on
    // submission of the registration form, we need to hide rather than
    // remove the mandatory fields. Otherwise, subsequent filtering of the data
    // from within JModelForm.validate() will result in the required fields
    // being stripped from the user data prior to attempting to save the user model,
    // which will trip an error from inside the user object itself on save!
    $form->removeField('password2');
    $form->removeField('email2');

    $form->setFieldAttribute('name', 'type', 'hidden');
    $form->setValue('name', null, 'placeholder');
    $form->setFieldAttribute('email1', 'type', 'hidden');
    $form->setValue('email1', null, JUserHelper::genRandomPassword(10) . '@invalid.nowhere');

    // Re-label the username field to 'Email Address' (the Email field
    // ordinarily appears below the password field on the default Joomla
    // registration form)
    $form->setFieldAttribute('username', 'label', 'COM_USERS_REGISTER_EMAIL1_LABEL');

    return true;
}

function onUserBeforeDataValidation($form, &$user) {
    if ($form->getName() != 'com_users.registration') {
        return true;
    }

    if (!$user['username']) {
        // Keep up the pretense from above!
        $form->setFieldAttribute('username', 'label', 'COM_USERS_REGISTER_EMAIL1_LABEL');
        return true;
    }

    if (!$user['name'] or $user['name'] === 'placeholder') {
        $user['name'] = $user['username'];
        $user['email1'] = $user['email2'] = $user['username'];
        $user['password2'] = $user['password1'];
    }
}

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.