Joomla Kaydı: Gereksiz alanları kaldırın


16

İlk olarak, bu sorunun farkındayım:

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

Ancak yanıtındaki bağlantı öldü ve belirtilen dosya yolu en son Joomla'da (sürüm 3.3) mevcut olmadığından, yanıtın hiçbir faydası yoktur.

Ne istiyorum basit: Joomla kayıt formu şöyle:

kayıt resmi varsayılanı

Kayıt işleminin kullanıcılarım için olabildiğince basit olmasını sağlamak istiyorum, bu yüzden gerçekten tamamlıyorlar ve bazı sorunlar var:

Elbette bu çok daha iyi bir kayıt sayfası:

daha iyi kayıt resmi

Formun istediğim gibi görünmesi için \ components \ com_users \ models \ form \ registration.xml dosyasını değiştirdim ve işe yaradı! Ancak formu ne zaman gönderirsem, doğrulama hala eksik alanları arar, bu yüzden bana bir ad vermem gerektiğini bildirir:

"Kayıt başarısız oldu: Lütfen adınızı girin."

İki onay alanının yanı sıra ad alanı denetimlerini nasıl devre dışı bırakabilirim?

Bir ad gerekli olduğundan, adı sağlanan kullanıcı adına ayarlamak istiyorum (bu nedenle kullanıcı adı ve ad varsayılan olarak aynıdır). Kullanıcı kayıttan sonra profil sayfasında gerçek bir ad ayarlamak istiyorsa , yapabilmelidir, ancak gerekli olmamalıdır.

Buna yanlış mı gidiyorum? Bazı yerlerde temel Joomla dosyalarını değiştirmenin iyi olmadığını, bir güncellemeyi bozabileceğini ve bunun yerine "geçersiz kılmanın" kullanılması gerektiğini okudum. Genellikle bu yanıtlar, Joomla'nın geçersiz kılmalar hakkındaki sayfasına bağlanır ve askerin istediklerini yapmak için nasıl kullanılacağı hakkında daha fazla açıklama sağlamaz. Onları anlamaya çalıştım, ancak yapamam, bu yüzden geçersiz kılmalar gitmenin yolu ise, lütfen sadece geçersiz kılma öğreticisine bağlanmak yerine onlarla bunu nasıl yapacağımı açıklayın.

Sağlayabileceğiniz herhangi bir yardımı çok takdir ediyorum, bunu birkaç saattir anlamaya çalışıyorum!


1
JED'i böyle bir şey yapmanın olası bir uzantı kaynağı olarak belirtmek istiyorum.
Valentin Despa

@ Lodder , doğrulama işlemini atlamak için eklediğiniz bilgiler için teşekkürler, ancak şablonumda çalışmadığından korkuyorum. Kodu kontrol edip çalışan bir kodla günceller misiniz? @Rickster sürecini takip ettiğim için çekicilik gibi çalıştı. Ben joomla acemi ve bu nedenle, bu konuda yardım istiyor. Şimdiden teşekkürler.

Bu Stackoverflow sorusunun cevabını istediğiniz gibi buldum: Joomla 3 kaydındaki bazı alanların doğrulanmasını nasıl devre dışı bırakabilirim
Rob L

Yanıtlar:


12

İdeal olarak, bunların hepsi bir kullanıcı eklentisinde yapılacaktır. Birçok insanın bunu fark ettiğinden emin değilim, ancak formu bir eklentiden düzenleyebilirsiniz (çekirdek kesmek gerekmez).

Benzer şekilde, eklenti model girişi kaydetmeye çalışmadan önce girdiyi görecektir, böylece alan çoğaltma alanlarının bazılarını doğrulama işlemini geçmeye zorlamak için alay edebilirsiniz.

"Kullanıcılar" eklentisindeki bu işlev, formu değiştirmenize olanak tanır:

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

Ardından, doğrulamayı geçmek için sıfırlamanız gereken alanlardan herhangi birini sıfırlamak için onUserBeforeSave işlevini kullanabilirsiniz. (Bu tamamen gerekli olmayabilir, bu yüzden onsuz deneyin ve hangi hataları aldığınızı görün.)

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

8

Tamam, ben bir şey kesmek veya herhangi bir 3. taraf uzantıları yüklemek zorunda kalmadan bir yaklaşım düşünüyordum. Benim yöntemim com_users bileşeni, özellikle de Kayıt görünümü için yapmanız gereken bir Şablon Geçersiz Kılma içerecektir .

Şimdi alanlar için (şablon geçersiz kılma işleminizin tüm kurulum olduğunu varsayarsak), bunları kaldırmayacağız, bunun yerine denetleyici ve modun gizlenmesi onlardan veri gerektirdiğinden. Şimdi şablon geçersiz kılma olan aşağıdaki dosyayı açın:

templates / define_shippinginfo.php / html / com_users / kayıt / default.php

ve hemen ardından dosyanın üst kısmına aşağıdaki kodu ekleyin 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);

Bazı yorumlarda ekledim, böylece her kod snippet'inin ne yaptığını biliyorsunuz.

Bu yardımcı olur umarım :)


1

@ DavidFritsch'in yanıtı çok yardımcı oldu. Gerçi bulduğum birkaç sorun vardı:

C) Form gönderimi sırasında veri filtrelemesinde sorunlara neden olduğu için bazı zorunlu alanları tamamen kaldıramazsınız (aşağıdaki koddaki yorumlara bakın). Bununla mücadele etmek için, form nesnesinden alanları kaldırmak yerine gizleyin. B) onUserBeforeSave olayı, kayıt doğrulama mantığının form gönderimini reddetmesini önlemek için çok geç olana kadar tetiklenmez. Bunun yerine onUserBeforeDataValidation olayını kullanın.

Özel durumumda istediğim tek şey e-posta adresi ve şifre idi. Joomla, bir kullanıcı deneyimi perspektifinden göze çarpmayan e-posta adresi paroladan sonra (registration.xml dosyasında bildirilen alanların sırasına göre belirlenir) göründüğü için burada bir sorun yaşadı. Bu sorunu çözmek için, kullanıcı adı alanını 'E-posta Adresi' olarak yeniden etiketledim ve bunun yerine e-posta adresi alanını gizledim. E-posta daha sonra form gönderimi sırasında kullanıcı adından varsayılan olarak alınır.

(Küçük not: Eklentiyi, David'in diğer formları da dikkate alan cevabı ile karşılaştırıldığında, yalnızca 'com_users.registration' formunda çalışmam için kısıtladım.)

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

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.