Joomla 등록 : 불필요한 필드 제거


16

먼저이 질문에 대해 알고 있습니다.

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

그러나 그 대답의 링크가 죽었고 언급 된 파일 경로가 최신 Joomla (버전 3.3)에 존재하지 않으므로 그 대답은 전혀 쓸모가 없습니다.

내가 원하는 것은 간단하다 : Joomla의 등록 양식은 다음과 같다 :

등록 이미지 기본값

사용자가 등록 프로세스를 가능한 한 간단하게하여 실제로 완료하도록하고 싶습니다. 몇 가지 문제가 있습니다.

확실히 이것은 훨씬 더 나은 등록 페이지입니다.

더 나은 등록 이미지

\ components \ com_users \ models \ forms \ registration.xml 파일을 수정하여 양식을 원하는 모양으로 만들었습니다. 그러나 양식을 제출 할 때마다 유효성 검사에서 여전히 누락 된 필드를 찾으므로 이름을 제공해야한다고 알려줍니다.

"등록 실패 : 이름을 입력하십시오."

두 개의 확인 필드뿐만 아니라 이름 필드에 대한 검사를 비활성화하려면 어떻게해야합니까?

이름이 필요하기 때문에 이름을 제공된 사용자 이름으로 설정하고 싶습니다 (따라서 사용자 이름과 이름은 기본적으로 동일합니다). 사용자가 등록 프로필 페이지에서 실제 이름을 설정하려면 실제로는 가능하지만 반드시 그럴 필요는 없습니다.

나는 이것에 대해 잘못 가고 있습니까? 핵심 Joomla 파일을 수정하는 것이 좋지 않다는 것을 읽었습니다. 업데이트가 중단 될 수 있기 때문에 대신 "재정의"를 사용해야합니다. 일반적으로 이러한 응답은 단순히 재정의에 대한 Joomla의 페이지에 연결되며, 응답자가 원하는 것을 수행하는 방법에 대한 자세한 설명은 제공하지 않습니다. 나는 그것들을 알아 내려고 시도했지만 그렇게 할 수 없으므로 재정의가 진행되는 방법이라면 재정의 튜토리얼에 연결하는 대신 어떻게 해야하는지 설명하십시오.

귀하가 제공 할 수있는 도움에 크게 감사 드리며 지금은 몇 시간 동안이 문제를 해결하려고 노력하고 있습니다.


1
JED를 이와 같은 작업을 수행 할 수있는 확장 소스로 지적하고 싶습니다.
Valentin Despa

@Lodder 유효성 검사 프로세스를 건너 뛰기 위해 삽입 한 정보에 감사드립니다.하지만 템플릿에서 작동하지 않을까 걱정됩니다. 코드를 확인하고 작동하는 코드로 업데이트 하시겠습니까? @Rickster 의 과정을 따라 가면서 매력처럼 작동했습니다. Joomla의 초보자이므로 이와 관련하여 도움을 요청합니다. 미리 감사드립니다.

이 Stackoverflow 질문에 대한 답변이 당신이 원하는 것일 수 있음을 발견 했습니다. Joomla 3 등록에서 일부 필드의 유효성 검사를 비활성화하는 방법
Rob L

답변:


12

이상적으로, 이것은 모두 사용자 플러그인에서 수행됩니다. 많은 사람들이 이것을 알고 있다고 확신하지는 않지만 플러그인에서 양식을 편집 할 수 있습니다 (핵심 핵 필요 없음).

마찬가지로, 플러그인은 모델이 항목을 저장하려고 시도하기 전에 입력을 확인하므로 일부 필드 복제 필드를 조롱하여 유효성 검사를 통과하도록 할 수 있습니다.

"users"플러그인의이 기능을 사용하면 양식을 변경할 수 있습니다.

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 구성 요소, 특히 등록 보기에 필요한 템플릿 재정의 가 포함 됩니다 .

이제 필드에 대해 (템플릿 재정의가 모두 설정되었다고 가정) 컨트롤러를 제거하지 않고 대신 컨트롤러와 모달이 데이터를 필요로하므로 필드를 숨 깁니다. 이제 템플릿 재정의 인 다음 파일을 엽니 다.

templates / YOUR_TEMPLATE / html / com_users / registration / 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는 이메일 주소가 비밀번호 (등록 .xml 파일에 선언 된 필드의 순서에 따라 결정됨) 뒤에 표시되어 사용자 경험의 관점에서 다루어지지 않았기 때문에 여기서 합병증을 일으켰습니다. 이 문제를 해결하기 위해 사용자 이름 필드에 '이메일 주소'라는 레이블을 다시 지정하고 대신 이메일 주소 필드를 숨겼습니다. 이메일은 양식 제출시 사용자 이름으로 기본 설정됩니다.

(사소한 참고 : 다른 형식도 고려하는 David의 대답과 비교할 때 플러그인이 '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.