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.