Registro do Joomla: Remova campos desnecessários

16

Primeiro, estou ciente dessa pergunta:

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

Mas o link na resposta está inoperante, e o caminho do arquivo mencionado não existe no Joomla mais recente (versão 3.3), então a resposta é inútil.

O que eu quero é simples: O formulário de inscrição para o Joomla é assim:

padrão de imagem de registro

Quero garantir que o processo de registro seja o mais simples possível para meus usuários, para que eles realmente o concluam e haja alguns problemas:

Certamente esta é uma página de registro muito melhor:

melhor imagem de registro

Modifiquei o arquivo \ components \ com_users \ models \ forms \ registration.xml para fazer com que o formulário se pareça com o que eu quero e funcionou! Porém, sempre que envio o formulário, a validação ainda procura os campos ausentes, por isso me informa que preciso fornecer um nome:

"Falha no registro: digite seu nome."

Como posso desativar as verificações para o campo de nome, bem como os dois campos de confirmação?

Como um nome é obrigatório, eu gostaria de definir o nome para o nome de usuário fornecido (portanto, nome de usuário e nome são os mesmos por padrão). Se o usuário realmente quiser definir um nome real em sua página de perfil após o registro, ele poderá, mas não será necessário.

Estou fazendo isso da maneira errada? Eu li em alguns lugares que modificar os arquivos principais do Joomla não é bom, pois pode ocorrer uma atualização e que "substituições" devem ser usadas. Geralmente essas respostas simplesmente apontam para a página de substituições do Joomla e não fornecem mais explicações sobre como usá-las para fazer o que o solicitante deseja. Eu tentei descobri-los, mas não consigo, portanto, se houver substituições, explique como eu faria isso com elas, em vez de apenas vincular o tutorial de substituição.

Agradeço imensamente qualquer ajuda que você possa fornecer. Estou tentando descobrir isso há algumas horas!

gfrung4
fonte
1
Gostaria de apontar o JED como uma possível fonte de extensões que faz algo assim.
23630 Valentin Despa
@Lodder, obrigado pelas informações que você inseriu para pular o processo de validação, mas receio que ele não esteja funcionando no meu modelo. Você poderia verificar o código e atualizar com o trabalho de um? Enquanto eu seguia o processo do @Rickster, isso funcionou como um encanto. Sou iniciante no joomla e, portanto, solicitando sua ajuda a esse respeito. Desde já, obrigado.
Eu encontrei a resposta a esta pergunta Stackoverflow pode ser o que quiser: Como desativar a validação de alguns campos em Joomla 3 registro
Rob L

Respostas:

12

Idealmente, tudo isso será feito em um plug-in de usuário. Não tenho certeza de que muitas pessoas percebam isso, mas você pode editar o formulário a partir de um plug-in (não é necessário hackear o núcleo).

Da mesma forma, o plug-in verá a entrada antes que o modelo tente salvar a entrada, para que você possa zombar de alguns dos campos de duplicação de campos para forçá-lo a passar na validação.

Esta função em um plug-in "usuários" permite alterar o formulário:

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

Em seguida, você pode usar uma função onUserBeforeSave para redefinir qualquer um dos campos que você precisa redefinir para passar na validação. (Isso pode não ser totalmente necessário, portanto, tente sem e veja quais erros você recebe.)

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

Ok, então eu estava pensando em uma abordagem sem ter que interromper nada ou instalar extensões de terceiros. Meu método envolverá uma substituição de modelo que você precisará fazer para o componente com_users , especificamente a exibição Registro .

Agora, para os campos (supondo que a substituição do modelo esteja toda configurada), não os removeremos, mas os ocultamos, pois o controlador e o modal exigem dados deles. Portanto, abra o seguinte arquivo que agora substitui o seu modelo:

modelos / YOUR_TEMPLATE / html / com_users / registration / default.php

e adicione o seguinte código na parte superior do arquivo logo após 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);

Adicionei alguns comentários para que você saiba o que cada trecho de código está fazendo.

Espero que isto ajude :)

Lodder
fonte
1

A resposta de @ DavidFritsch foi muito útil. Alguns problemas que encontrei foram:

A) Você não pode remover completamente certos campos obrigatórios, pois isso causa problemas com a filtragem de dados no envio de formulários (consulte os comentários no código abaixo). Para combater isso, oculte em vez de remover os campos do objeto de formulário. B) O evento onUserBeforeSave não é acionado até que seja tarde demais para impedir que a lógica de validação do registro rejeite o envio do formulário. Em vez disso, use o evento onUserBeforeDataValidation.

No meu caso particular, tudo que eu queria era endereço de email e senha. O Joomla lançou uma complicação aqui, pois o endereço de e-mail estava aparecendo após a senha (ditada pela ordem dos campos declarados no arquivo registration.xml), que pareceria estúpido da perspectiva da experiência do usuário. Para contornar isso, rotulei novamente o campo de nome de usuário para 'Endereço de email' e, em vez disso, ocultei o campo de endereço de email. O email é padronizado no nome de usuário no envio do formulário.

(Observação secundária: restringi o plug-in a operar apenas no formulário 'com_users.registration' para meus propósitos, em comparação com a resposta de David, que também considera outros formulários.)

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
fonte