जूमला पंजीकरण: अनावश्यक क्षेत्रों को हटा दें


16

सबसे पहले, मैं इस प्रश्न से अवगत हूँ:

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

लेकिन इसमें उत्तर का लिंक मृत है, और उल्लिखित फ़ाइल पथ नवीनतम जूमला (संस्करण 3.3) में मौजूद नहीं है, इसलिए उत्तर का कोई फायदा नहीं है।

मैं जो चाहता हूं वह सरल है: जूमला के लिए पंजीकरण फॉर्म इस तरह दिखता है:

पंजीकरण छवि डिफ़ॉल्ट

मैं यह सुनिश्चित करना चाहता हूं कि पंजीकरण प्रक्रिया मेरे उपयोगकर्ताओं के लिए यथासंभव सरल हो ताकि वे वास्तव में इसे पूरा कर सकें, और कुछ समस्याएं हैं:

  • मुझे उपयोगकर्ता का वास्तविक नाम जानने की आवश्यकता नहीं है।
  • मेरे पास "पुष्टि" बक्से नहीं थे। आम सहमति यह है कि वे आवश्यक नहीं हैं। /ux/484/is-a-repeat-password-field-necessary-in-a-signup-page
  • सब कुछ आवश्यक है, क्यों आवश्यक फ़ील्ड को चिह्नित करना परेशान करता है?

निश्चित रूप से यह एक बेहतर पंजीकरण पृष्ठ है:

बेहतर पंजीकरण छवि

मैंने फ़ाइल \ घटकों \ com_users \ मॉडल \ फॉर्म \ पंजीकरण को संशोधित किया। xml फॉर्म को जैसा मैं चाहता हूं वैसा ही बनाने के लिए, और यह काम कर गया! लेकिन जब भी मैं फॉर्म जमा करता हूं, सत्यापन अभी भी लापता फ़ील्ड की तलाश में है, इसलिए यह मुझे सूचित करता है कि मुझे एक नाम की आपूर्ति करने की आवश्यकता है:

"पंजीकरण विफल: कृपया अपना नाम दर्ज करें।"

मैं नाम फ़ील्ड, साथ ही दो पुष्टिकरण फ़ील्ड की जांच को कैसे अक्षम कर सकता हूं?

चूंकि एक नाम की आवश्यकता होती है, मैं नाम को दिए गए उपयोगकर्ता नाम पर सेट करना चाहूंगा (इसलिए डिफ़ॉल्ट रूप से उपयोगकर्ता नाम और नाम समान हैं)। यदि उपयोगकर्ता वास्तव में पंजीकरण के बाद अपने प्रोफाइल पेज में एक वास्तविक नाम सेट करना चाहते हैं , तो उन्हें सक्षम होना चाहिए, लेकिन इसकी आवश्यकता नहीं होनी चाहिए।

क्या मैं इसके बारे में गलत तरीके से जा रहा हूं? मैंने कुछ स्थानों पर पढ़ा है कि कोर जूमला फ़ाइलों को संशोधित करना अच्छा नहीं है, क्योंकि यह एक अद्यतन में टूट सकता है, और इसके बजाय "ओवरराइड्स" का उपयोग किया जाना चाहिए। आमतौर पर ये प्रतिक्रियाएं जूमला के पेज को ओवरराइड करने के लिए लिंक करती हैं, और यह पूछने के लिए कि उनका उपयोग कैसे करना है, इसके बारे में कोई अधिक विवरण प्रदान नहीं करता है। मैंने उन्हें पता लगाने की कोशिश की है, लेकिन ऐसा नहीं हो सकता है, इसलिए यदि ओवरराइड्स जाने का रास्ता है, तो कृपया बताएं कि मैं उनके साथ ऐसा करने के बारे में कैसे जाऊंगा, बजाय केवल ओवरराइड ट्यूटोरियल को लिंक किए।

मैं आपको प्रदान की जाने वाली किसी भी मदद की बहुत सराहना करूंगा, मैं अब कुछ घंटों के लिए इसका पता लगाने की कोशिश कर रहा हूं!


1
मैं इस तरह से कुछ कर रहे एक्सटेंशन के संभावित स्रोत के रूप में जेईडी को इंगित करना चाहूंगा।
वैलेंटाइन डेपा

@Lodder आपके द्वारा सत्यापन प्रक्रिया को छोड़ने के लिए डाली गई जानकारी के लिए धन्यवाद, लेकिन मुझे डर है कि यह मेरे टेम्पलेट में काम नहीं कर रहा है। क्या आप कृपया कोड की जांच करेंगे और काम करने के साथ अपडेट करेंगे? जैसा कि मैंने @Rickster की प्रक्रिया का पालन ​​किया और यह आकर्षण की तरह काम किया। मैं जूमला में नौसिखिया हूं और इसलिए, इस संबंध में आपकी सहायता का अनुरोध कर रहा हूं। अग्रिम में धन्यवाद।

मैं इस Stackoverflow सवाल का जवाब हो सकता है कि आप क्या चाहते हैं: Joomla 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

ठीक है, इसलिए मैं कुछ भी कोर हैक या किसी भी 3 पार्टी एक्सटेंशन स्थापित किए बिना एक दृष्टिकोण के बारे में सोच रहा था। मेरी विधि में एक खाका ओवरराइड शामिल होगा जिसे आपको 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

@ डेविडफ्रिट्स का जवाब बहुत मददगार था। हालाँकि मुझे कुछ समस्याएं मिलीं:

ए) आप कुछ अनिवार्य फ़ील्ड्स को पूरी तरह से हटा नहीं सकते क्योंकि यह फ़ॉर्म सबमिशन पर डेटा फ़िल्टरिंग के साथ समस्याओं का कारण बनता है (नीचे दिए गए कोड में टिप्पणियां देखें)। इससे निपटने के लिए, फॉर्म ऑब्जेक्ट से फ़ील्ड्स को हटाने के बजाय छुपाएं। ख) onUserBeforeSave ईवेंट को तब तक निकाल नहीं दिया जाता है जब तक कि पंजीकरण सत्यापन तर्क को फ़ॉर्म सबमिशन को अस्वीकार करने से रोकने के लिए बहुत देर हो चुकी हो। इसके बजाय, onUserBeforeDataValidation इवेंट का उपयोग करें।

मेरे विशेष मामले में, मैं चाहता था कि सभी ईमेल पते और पासवर्ड थे। जुमला यहाँ एक जटिलता में फेंक दिया गया, हालाँकि, ईमेल पता पासवर्ड के बाद दिखाई दे रहा था (पंजीकरण.एक्सएमएल फ़ाइल में घोषित क्षेत्रों के आदेश द्वारा निर्धारित), जो एक उपयोगकर्ता अनुभव के नजरिए से बहुत छोटा लगेगा। उसके आसपास काम करने के लिए, मैंने उपयोगकर्ता नाम फ़ील्ड को 'ईमेल पते' पर फिर से लेबल किया और इसके बजाय ईमेल पते के क्षेत्र को छिपा दिया। ईमेल तब फ़ॉर्म सबमिट करने पर उपयोगकर्ता नाम से चूक जाता है।

(माइनर नोट: मैंने अपने उद्देश्यों के लिए केवल 'com_users.registration' फॉर्म पर संचालित करने के लिए प्लगइन को प्रतिबंधित किया है, क्योंकि डेविड के उत्तर की तुलना में जो अन्य रूपों पर भी विचार करता है।)

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'];
    }
}

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