Pendaftaran Joomla: Hapus bidang yang tidak dibutuhkan

16

Pertama, saya menyadari pertanyaan ini:

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

Tapi tautan dalam jawabannya sudah mati, dan jalur file yang disebutkan tidak ada di Joomla terbaru (versi 3.3), jadi jawabannya tidak ada gunanya sama sekali.

Yang saya inginkan sederhana: Formulir pendaftaran untuk Joomla terlihat seperti ini:

gambar registrasi standar

Saya ingin memastikan proses pendaftaran sesederhana mungkin bagi pengguna saya sehingga mereka benar-benar menyelesaikannya, dan ada beberapa masalah:

Tentunya ini adalah halaman pendaftaran yang jauh lebih baik:

gambar registrasi yang lebih baik

Saya memodifikasi file \ components \ com_users \ models \ form \ registrasi.xml untuk membuat form seperti yang saya inginkan, dan itu berhasil! Tetapi setiap kali saya mengirimkan formulir, validasi masih mencari bidang yang hilang, jadi itu memberi tahu saya bahwa saya harus memberikan nama:

"Pendaftaran gagal: Silakan masukkan nama Anda."

Bagaimana saya bisa menonaktifkan pemeriksaan untuk bidang nama, serta dua bidang konfirmasi?

Karena nama diperlukan, saya ingin mengatur nama menjadi nama pengguna yang disediakan (jadi nama pengguna dan nama adalah sama secara default). Jika pengguna benar-benar ingin menetapkan nama asli di halaman profil mereka setelah pendaftaran, mereka seharusnya bisa, tetapi tidak harus diminta.

Apakah saya salah tentang hal ini? Saya telah membaca di beberapa tempat bahwa memodifikasi file inti Joomla tidak baik, karena dapat merusak pembaruan, dan bahwa "penggantian" harus digunakan sebagai gantinya. Biasanya tanggapan ini hanya menautkan ke halaman Joomla dengan mengabaikan, dan tidak memberikan penjelasan lebih jauh tentang bagaimana menggunakannya untuk melakukan apa yang diinginkan penanya. Saya sudah mencoba mencari tahu, tetapi tidak bisa, jadi jika mengganti adalah cara untuk pergi, tolong jelaskan bagaimana saya akan melakukan ini dengan mereka, daripada hanya menautkan ke tutorial override.

Saya sangat menghargai bantuan yang Anda berikan, saya sudah mencoba memikirkannya selama beberapa jam sekarang!

gfrung4
sumber
1
Saya ingin menunjukkan JED sebagai sumber ekstensi yang mungkin melakukan sesuatu seperti ini.
Valentin Despa
@Lodder terima kasih atas info yang Anda masukkan untuk melewati proses validasi, tapi saya khawatir itu tidak berfungsi di templat saya. Tolong periksa kode dan perbarui dengan kode yang berfungsi? Ketika saya menindaklanjuti proses @Rickster dan itu bekerja seperti pesona. Saya pemula dalam joomla dan karenanya, meminta bantuan Anda dalam hal ini. Terima kasih sebelumnya.
Saya menemukan jawaban untuk pertanyaan Stackoverflow ini mungkin yang Anda inginkan: Cara menonaktifkan validasi beberapa bidang dalam pendaftaran Joomla 3
Rob L

Jawaban:

12

Idealnya, ini semua akan dilakukan dalam plugin pengguna. Saya tidak yakin bahwa banyak orang menyadari hal ini, tetapi Anda dapat mengedit formulir dari sebuah plugin (tidak diperlukan peretasan inti).

Demikian juga, plugin akan melihat input sebelum model mencoba untuk menyimpan entri, sehingga Anda dapat mengejek beberapa bidang duplikasi bidang untuk memaksanya agar lulus validasi.

Fungsi dalam plugin "pengguna" ini memungkinkan Anda untuk mengubah formulir:

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

Kemudian Anda dapat menggunakan fungsi onUserBeforeSave untuk mengatur ulang bidang yang harus Anda atur ulang untuk lulus validasi. (Ini mungkin tidak sepenuhnya diperlukan, jadi cobalah tanpa dan lihat kesalahan apa yang Anda dapatkan.)

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

Ok jadi saya berpikir tentang pendekatan tanpa harus inti hack apa pun atau menginstal ekstensi pihak ke-3. Metode saya akan melibatkan Override Templat yang perlu Anda buat untuk komponen com_users , khususnya tampilan Registrasi .

Sekarang untuk isian (anggap override templat Anda sudah diseting), kami tidak akan menghapusnya, tetapi menyembunyikannya karena pengontrol dan modal memerlukan data darinya. Jadi buka file berikut yang sekarang menggantikan template Anda:

templat / YOUR_TEMPLATE / html / com_users / registrasi / default.php

dan tambahkan kode berikut di dekat bagian atas file tepat setelah 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);

Saya telah menambahkan beberapa komentar sehingga Anda tahu apa yang dilakukan setiap cuplikan kode.

Semoga ini membantu :)

Lodder
sumber
1

Jawaban @ DavidFritsch sangat membantu. Beberapa masalah yang saya temukan adalah:

A) Anda tidak dapat sepenuhnya menghapus bidang wajib tertentu karena menyebabkan masalah dengan pemfilteran data pada pengiriman formulir (lihat komentar dalam kode di bawah). Untuk mengatasi ini, sembunyikan daripada menghapus bidang dari objek formulir. B) Acara onUserBeforeSave tidak dipecat sampai terlambat untuk mencegah logika validasi pendaftaran menolak pengiriman formulir. Sebagai gantinya, gunakan acara onUserBeforeDataValidation.

Dalam kasus khusus saya, yang saya inginkan adalah alamat email dan kata sandi. Joomla terlibat dalam masalah di sini, karena alamat email muncul setelah kata sandi (ditentukan oleh urutan bidang yang dideklarasikan dalam file pendaftaran.xml), yang akan terlihat gila dari perspektif pengalaman pengguna. Untuk mengatasinya, saya memberi label ulang bidang nama pengguna ke 'Alamat Email' dan menyembunyikan bidang alamat email. Email kemudian default dari nama pengguna pada pengiriman formulir.

(Catatan kecil: Saya membatasi plugin hanya untuk beroperasi pada formulir 'com_users.registration' untuk tujuan saya, dibandingkan dengan jawaban David yang juga mempertimbangkan formulir lain.)

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

}
John Rix
sumber