การลงทะเบียน Joomla: ลบฟิลด์ที่ไม่ต้องการออก


16

ก่อนอื่นฉันตระหนักถึงคำถามนี้:

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

แต่ลิงก์ในคำตอบของมันนั้นตายแล้วและเส้นทางของไฟล์ที่กล่าวถึงจะไม่มีอยู่ใน Joomla ล่าสุด (เวอร์ชั่น 3.3) ดังนั้นคำตอบก็คือไม่ต้องใช้สิ่งใดเลย

สิ่งที่ฉันต้องการนั้นง่ายมาก: แบบฟอร์มลงทะเบียนสำหรับ Joomla มีลักษณะดังนี้:

ภาพลงทะเบียนเริ่มต้น

ฉันต้องการให้แน่ใจว่ากระบวนการลงทะเบียนนั้นง่ายที่สุดเท่าที่จะเป็นไปได้สำหรับผู้ใช้ของฉันดังนั้นพวกเขาจึงดำเนินการให้เสร็จสมบูรณ์และมีปัญหาบางอย่าง:

  • ฉันไม่จำเป็นต้องรู้ชื่อจริงของผู้ใช้
  • ฉันต้องการไม่มีกล่อง "ยืนยัน" ฉันทามติทั่วไปคือพวกเขาไม่จำเป็น /ux/484/is-a-repeat-password-field-necessary-in-a-signup-page
  • ต้องมีทุกอย่างทำไมต้องทำเครื่องหมายฟิลด์ที่ต้องกังวล

แน่นอนว่านี่เป็นหน้าลงทะเบียนที่ดีกว่ามาก:

ภาพการลงทะเบียนที่ดีขึ้น

ฉันแก้ไขไฟล์\ components \ com_users \ models \ forms \ registration.xmlเพื่อทำให้ฟอร์มดูเหมือนสิ่งที่ฉันต้องการและทำงานได้! แต่เมื่อใดก็ตามที่ฉันส่งแบบฟอร์มการตรวจสอบความถูกต้องยังคงค้นหาเขตข้อมูลที่หายไปดังนั้นจึงแจ้งให้ฉันทราบว่าฉันต้องระบุชื่อ:

"การลงทะเบียนล้มเหลว: กรุณาใส่ชื่อของคุณ"

ฉันจะปิดการใช้งานการตรวจสอบสำหรับเขตข้อมูลชื่อรวมทั้งสองช่องยืนยันได้อย่างไร

เนื่องจากจำเป็นต้องใช้ชื่อฉันต้องการตั้งชื่อเป็นชื่อผู้ใช้ที่ระบุ (ดังนั้นชื่อผู้ใช้และชื่อจะเหมือนกันตามค่าเริ่มต้น) หากผู้ใช้ต้องการตั้งชื่อจริงในหน้าโปรไฟล์ของพวกเขาหลังจากการลงทะเบียนพวกเขาควรจะสามารถ แต่ไม่จำเป็นต้อง

ฉันจะไปในทางที่ผิด? ฉันได้อ่านในบางแห่งที่แก้ไขไฟล์ Joomla หลักไม่ดีเพราะอาจทำให้การอัปเดตล้มเหลวและควรใช้ "การแทนที่" แทน โดยปกติแล้วคำตอบเหล่านี้จะเชื่อมโยงไปยังหน้าของ Joomla ในการแทนที่และไม่มีคำอธิบายเพิ่มเติมเกี่ยวกับวิธีการใช้เพื่อทำสิ่งที่ผู้ถามต้องการ ฉันพยายามคิดออก แต่ทำไม่ได้ดังนั้นหากการแทนที่เป็นวิธีการไปโปรดอธิบายว่าฉันจะทำสิ่งนี้กับพวกเขาได้อย่างไร

ฉันซาบซึ้งอย่างยิ่งที่คุณสามารถช่วยเหลือได้ฉันพยายามคิดออกมาหลายชั่วโมงแล้ว!


1
ฉันต้องการชี้ให้เห็นว่า JED เป็นแหล่งที่มาของส่วนขยายที่อาจทำสิ่งนี้
Valentin Despa

@Lodderขอบคุณสำหรับข้อมูลที่คุณแทรกเพื่อข้ามขั้นตอนการตรวจสอบ แต่ฉันกลัวว่ามันไม่ทำงานในเทมเพลตของฉัน คุณช่วยตรวจสอบรหัสและอัปเดตด้วยรหัสที่ใช้งานได้ไหม ในขณะที่ฉันติดตามกระบวนการของ@Ricksterและใช้งานได้อย่างมีเสน่ห์ ฉันเป็นสามเณรใน joomla ดังนั้นจึงขอความช่วยเหลือจากคุณในเรื่องนี้ ขอบคุณล่วงหน้า.

ฉันพบคำตอบสำหรับคำถาม Stackoverflow นี้อาจเป็นสิ่งที่คุณต้องการ: วิธีปิดการตรวจสอบความถูกต้องของบางฟิลด์ในการลงทะเบียน Joomla 3
Rob L

คำตอบ:


12

เป็นการดีที่จะทำทั้งหมดในปลั๊กอินผู้ใช้ ฉันไม่แน่ใจว่าผู้คนจำนวนมากตระหนักถึงเรื่องนี้ แต่คุณสามารถแก้ไขแบบฟอร์มจากปลั๊กอิน (ไม่ต้องแฮ็คหลัก)

ปลั๊กอินจะเห็นอินพุตก่อนที่โมเดลจะพยายามบันทึกรายการดังนั้นคุณสามารถจำลองฟิลด์การทำซ้ำฟิลด์บางฟิลด์เพื่อบังคับให้ผ่านการตรวจสอบ

fuction ในปลั๊กอิน "ผู้ใช้" นี้ช่วยให้คุณสามารถเปลี่ยนรูปแบบ:

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โดยเฉพาะมุมมองการลงทะเบียน

ตอนนี้สำหรับฟิลด์ (สมมติว่าการลบล้างเทมเพลตของคุณคือการตั้งค่าทั้งหมด) เราจะไม่ลบมันออก แต่ซ่อนไว้เป็นคอนโทรลเลอร์และ modal ต้องการข้อมูลจากพวกเขา ดังนั้นให้เปิดไฟล์ต่อไปนี้ที่ตอนนี้แทนที่เทมเพลตของคุณ:

แม่แบบ / 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

@ คำตอบของ DavidFritsch มีประโยชน์มาก สองปัญหาที่ฉันพบแม้ว่า:

A) คุณไม่สามารถลบฟิลด์บังคับบางอย่างได้อย่างสมบูรณ์เนื่องจากทำให้เกิดปัญหากับการกรองข้อมูลในการส่งแบบฟอร์ม (ดูความคิดเห็นในรหัสด้านล่าง) เพื่อต่อสู้กับสิ่งนี้ซ่อนมากกว่าลบเขตข้อมูลจากวัตถุแบบฟอร์ม B) เหตุการณ์ onUserBeforeSave จะไม่เริ่มทำงานจนกว่าจะสายเกินไปที่จะป้องกันไม่ให้ตรรกะการตรวจสอบการลงทะเบียนปฏิเสธการส่งแบบฟอร์ม ใช้เหตุการณ์ onUserBeforeDataValidation แทน

ในกรณีของฉันสิ่งที่ฉันต้องการคือที่อยู่อีเมลและรหัสผ่าน Joomla มีข้อยุ่งยากที่นี่เนื่องจากที่อยู่อีเมลปรากฏขึ้นหลังจากรหัสผ่าน (กำหนดโดยคำสั่งของเขตข้อมูลที่ประกาศในไฟล์ register.xml) ซึ่งจะดูงี่เง่าจากมุมมองประสบการณ์ผู้ใช้ เพื่อหลีกเลี่ยงปัญหาดังกล่าวฉันจึงติดป้ายฟิลด์ชื่อผู้ใช้ใหม่เป็น 'ที่อยู่อีเมล' และซ่อนฟิลด์ที่อยู่อีเมลแทน อีเมลจะถูกตั้งค่าเริ่มต้นจากชื่อผู้ใช้ในการส่งแบบฟอร์ม

(หมายเหตุเล็กน้อย: ฉันได้ จำกัด ปลั๊กอินให้ทำงานบนแบบฟอร์ม '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'];
    }
}

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.