Đăng ký Joomla: Loại bỏ các trường không cần thiết


16

Đầu tiên, tôi nhận thức được câu hỏi này:

/programming/14799733/remove-name-field-from-j Joomla-registration-form

Nhưng liên kết trong câu trả lời của nó đã chết và đường dẫn tệp được đề cập không tồn tại trong Joomla mới nhất (phiên bản 3.3), vì vậy câu trả lời là không sử dụng được gì.

Điều tôi muốn rất đơn giản: Mẫu đăng ký cho Joomla trông như thế này:

hình ảnh đăng ký mặc định

Tôi muốn đảm bảo quá trình đăng ký đơn giản nhất có thể cho người dùng của mình để họ thực sự hoàn thành nó và có một số vấn đề:

Chắc chắn đây là một trang đăng ký tốt hơn nhiều:

hình ảnh đăng ký tốt hơn

Tôi đã sửa đổi tệp \ thành phần \ com_users \ model \ Forms \ register.xml để làm cho biểu mẫu trông giống như những gì tôi muốn và nó đã hoạt động! Nhưng bất cứ khi nào tôi gửi biểu mẫu, xác thực vẫn tìm kiếm các trường bị thiếu, vì vậy nó thông báo cho tôi rằng tôi cần cung cấp tên:

"Đăng ký thất bại: Vui lòng nhập tên của bạn."

Làm cách nào tôi có thể vô hiệu hóa kiểm tra cho trường tên, cũng như hai trường xác nhận?

Vì tên là bắt buộc, tôi muốn đặt tên thành tên người dùng được cung cấp (vì vậy tên người dùng và tên giống nhau theo mặc định). Nếu người dùng thực sự muốn đặt tên thật trong trang hồ sơ của họ sau khi đăng ký, họ sẽ có thể, nhưng không nên yêu cầu.

Tôi đang đi về điều này sai cách? Tôi đã đọc ở một số nơi rằng sửa đổi các tệp Joomla lõi là không tốt, vì nó có thể phá vỡ trong một bản cập nhật và thay vào đó nên sử dụng "ghi đè". Thông thường những phản hồi này chỉ đơn giản là liên kết đến trang của Joomla về phần ghi đè và không đưa ra lời giải thích xa hơn về cách sử dụng chúng để làm những gì người hỏi muốn. Tôi đã cố gắng tìm ra chúng, nhưng không thể, vì vậy nếu ghi đè là cách tốt nhất, vui lòng giải thích cách tôi sẽ thực hiện việc này với chúng, thay vì chỉ liên kết với hướng dẫn ghi đè.

Tôi đánh giá rất cao bất kỳ sự giúp đỡ nào bạn có thể cung cấp, tôi đã cố gắng tìm ra điều này trong vài giờ rồi!


1
Tôi muốn chỉ ra JED là một nguồn mở rộng có thể thực hiện được như thế này.
Valentin Despa

@Lodder cảm ơn vì thông tin bạn đã chèn để bỏ qua quá trình xác nhận, nhưng tôi sợ rằng nó không hoạt động trong mẫu của tôi. Bạn vui lòng kiểm tra mã và cập nhật với làm việc không? Khi tôi theo dõi quá trình @Rickster và điều đó hoạt động như bùa mê. Tôi là người mới trong Joomla và do đó, yêu cầu sự giúp đỡ của bạn trong vấn đề này. Cảm ơn trước.

Tôi tìm thấy câu trả lời cho câu hỏi Stackoverflow này có thể là điều bạn muốn: Cách vô hiệu hóa xác thực một số trường trong đăng ký Joomla 3
Rob L

Câu trả lời:


12

Lý tưởng nhất, tất cả sẽ được thực hiện trong một plugin người dùng. Tôi không chắc chắn rằng nhiều người nhận ra điều này, nhưng bạn có thể chỉnh sửa biểu mẫu từ một plugin (không yêu cầu hack lõi).

Tương tự, plugin sẽ thấy đầu vào trước khi mô hình cố lưu mục nhập, do đó bạn có thể giả định một số trường sao chép trường để buộc nó phải vượt qua xác thực.

Sự kết hợp này trong một plugin "người dùng" cho phép bạn thay đổi hình thức:

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

Sau đó, bạn có thể sử dụng hàm onUserB BeforeSave để đặt lại bất kỳ trường nào bạn cần đặt lại để vượt qua xác thực. (Điều này có thể không hoàn toàn cần thiết, vì vậy hãy thử mà không và xem bạn gặp lỗi gì.)

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

8

Ok vì vậy tôi đã suy nghĩ về một cách tiếp cận mà không cần phải hack bất cứ thứ gì hoặc cài đặt bất kỳ tiện ích mở rộng của bên thứ 3 nào. Phương pháp của tôi sẽ liên quan đến Ghi đè mẫu mà bạn sẽ cần thực hiện cho thành phần com_users , cụ thể là chế độ xem Đăng ký .

Bây giờ đối với các trường (giả sử ghi đè mẫu của bạn là tất cả thiết lập), chúng tôi sẽ không xóa chúng, mà thay vào đó ẩn chúng khi bộ điều khiển và phương thức yêu cầu dữ liệu từ chúng. Vì vậy, hãy mở tệp sau đây hiện đang ghi đè mẫu của bạn:

mẫu / Your_TEMPLATE / html / com_users / đăng ký / default.php

và thêm đoạn mã sau vào gần đầu tệp ngay sau 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);

Tôi đã thêm vào một số nhận xét để bạn biết mỗi đoạn mã đang làm gì.

Hi vọng điêu nay co ich :)


1

Câu trả lời của DavidFritsch rất hữu ích. Một vài vấn đề tôi tìm thấy mặc dù là:

A) Bạn không thể xóa hoàn toàn các trường bắt buộc nhất định vì nó gây ra sự cố với lọc dữ liệu khi gửi biểu mẫu (xem nhận xét trong mã bên dưới). Để chống lại điều này, ẩn hơn là xóa các trường khỏi đối tượng biểu mẫu. B) Sự kiện onUserB BeforeSave không được kích hoạt cho đến khi quá muộn để ngăn logic xác thực đăng ký từ chối gửi biểu mẫu. Thay vào đó, hãy sử dụng sự kiện onUserB BeforeDataValidation.

Trong trường hợp cụ thể của tôi, tất cả những gì tôi muốn là địa chỉ email và mật khẩu. Joomla đã gặp phải một sự phức tạp ở đây, vì địa chỉ email đã xuất hiện sau khi mật khẩu (được quy định theo thứ tự của các trường được khai báo trong tệp đăng ký), trông sẽ giống như từ góc độ trải nghiệm người dùng. Để giải quyết vấn đề đó, tôi đã gắn nhãn lại trường tên người dùng thành 'Địa chỉ email' và thay vào đó ẩn trường địa chỉ email. Email sau đó được mặc định từ tên người dùng khi gửi biểu mẫu.

(Lưu ý nhỏ: Tôi đã hạn chế plugin chỉ hoạt động trên biểu mẫu 'com_users.registration' cho mục đích của tôi, so với câu trả lời của David cũng xem xét các hình thức khác.)

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

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.