Registro de Joomla: eliminar campos innecesarios

16

Primero, soy consciente de esta pregunta:

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

Pero el enlace en su respuesta está muerto, y la ruta del archivo mencionada no existe en la última versión de Joomla (versión 3.3), por lo que la respuesta no sirve de nada.

Lo que quiero es simple: el formulario de registro para Joomla se ve así:

imagen de registro predeterminada

Quiero asegurarme de que el proceso de registro sea lo más simple posible para mis usuarios para que realmente lo completen, y hay algunos problemas:

Seguramente esta es una página de registro mucho mejor:

mejor imagen de registro

Modifiqué el archivo \ components \ com_users \ models \ forms \ Registration.xml para que el formulario se vea como lo que quiero, ¡y funcionó! Pero cada vez que envío el formulario, la validación aún busca los campos faltantes, por lo que me informa que debo proporcionar un nombre:

"Error de registro: ingrese su nombre".

¿Cómo puedo desactivar las verificaciones para el campo de nombre, así como los dos campos de confirmación?

Como se requiere un nombre, me gustaría establecer el nombre para el nombre de usuario proporcionado (de modo que nombre de usuario y nombre son los mismos por defecto). Si el usuario realmente quiere establecer un nombre real en su página de perfil después del registro, debería poder hacerlo, pero no debería ser obligatorio.

¿Voy por esto de la manera incorrecta? He leído en algunos lugares que modificar los archivos principales de Joomla no es bueno, ya que podría interrumpirse en una actualización, y que en su lugar deberían usarse "anulaciones". Por lo general, estas respuestas simplemente enlazan a la página de Joomla en anulaciones, y no brindan más explicaciones sobre cómo usarlas para hacer lo que el autor de la pregunta. Traté de resolverlos, pero no puedo, así que si las anulaciones son el camino a seguir, explique cómo haría esto con ellos, en lugar de simplemente vincularme al tutorial de anulación.

Apreciaría mucho cualquier ayuda que me puedan brindar, ¡he estado tratando de resolver esto por unas horas ahora!

gfrung4
fuente
1
Me gustaría señalar a JED como una posible fuente de extensiones que hacen algo como esto.
Valentin Despa 01 de
@Lodder gracias por la información que ha insertado para omitir el proceso de validación, pero me temo que no funciona en mi plantilla. ¿Podría verificar el código y actualizarlo con uno que funcione? Mientras seguía el proceso de @Rickster y funcionó a las mil maravillas . Soy novato en Joomla y, por lo tanto, solicito su ayuda a este respecto. Gracias por adelantado.
Encontré que la respuesta a esta pregunta de Stackoverflow podría ser lo que desea: Cómo deshabilitar la validación de algunos campos en el registro de Joomla 3
Rob L

Respuestas:

12

Idealmente, todo esto se hará en un complemento de usuario. No estoy seguro de que mucha gente se dé cuenta de esto, pero puede editar el formulario desde un complemento (no se requiere un hack core).

Del mismo modo, el complemento verá la entrada antes de que el modelo intente guardar la entrada, por lo que puede burlarse de algunos de los campos de duplicación de campo para forzarlo a pasar la validación.

Esta función en un complemento de "usuarios" le permite modificar el formulario:

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

Luego puede usar una función onUserBeforeSave para restablecer cualquiera de los campos que necesita restablecer para pasar la validación. (Esto puede no ser totalmente necesario, así que intente sin ver qué errores obtiene).

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

Ok, estaba pensando en un enfoque sin tener que hackear nada o instalar extensiones de terceros. Mi método implicará una anulación de plantilla que deberá realizar para el componente com_users , específicamente la vista de registro .

Ahora para los campos (suponiendo que su anulación de plantilla esté configurada), no los eliminaremos, sino que los ocultaremos ya que el controlador y el modal requieren datos de ellos. Abra el siguiente archivo que ahora es su anulación de plantilla:

templates / YOUR_TEMPLATE / html / com_users / Registration / default.php

y agregue el siguiente código cerca de la parte superior del archivo justo despué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);

He agregado algunos comentarios para que sepa qué está haciendo cada fragmento de código.

Espero que esto ayude :)

Lodder
fuente
1

La respuesta de @ DavidFritsch fue muy útil. Sin embargo, un par de problemas que encontré fueron:

A) No puede eliminar por completo ciertos campos obligatorios ya que causa problemas con el filtrado de datos en el envío del formulario (vea los comentarios en el código a continuación). Para combatir esto, oculte en lugar de eliminar los campos del objeto de formulario. B) El evento onUserBeforeSave no se activa hasta que sea demasiado tarde para evitar que la lógica de validación de registro rechace el envío del formulario. En su lugar, use el evento onUserBeforeDataValidation.

En mi caso particular, todo lo que quería era dirección de correo electrónico y contraseña. Sin embargo, Joomla arrojó una complicación aquí, ya que la dirección de correo electrónico aparecía después de la contraseña (dictada por el orden de los campos declarados en el archivo Registration.xml), que se vería tonto desde la perspectiva de la experiencia del usuario. Para evitarlo, volví a etiquetar el campo de nombre de usuario como 'Dirección de correo electrónico' y, en su lugar, oculté el campo de dirección de correo electrónico. El correo electrónico se omite del nombre de usuario en el envío del formulario.

(Nota menor: he restringido el complemento para que solo funcione en el formulario 'com_users.registration' para mis propósitos, en comparación con la respuesta de David, que también considera otros formularios).

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
fuente