Jump to content

Input de tipo password que no muestra el contenido


Recommended Posts

Hello!!

 

Estoy desarrollando un componente y me he encontrado con el siguiente problema.

Añado diferentes inputs en el panel de configuración, y alguno de ellos son de tipo password.

EL primer post del formulario parece que funciona bien y el contenido de los campos de tipo password se guardan correctamente pero al visualizar de nuevo el formulario el contenido de estos campos, sólo los de tipo password, aparece vacío.

En un primer momento pensé que el comportamiento sería así por temas de seguridad y si guardas de nuevo el formulario, al detectar que van vacíos no se cambiaría su contenido, pero mi sospresa ha sido que no y si envío el formulario con los campos vacíos se vacía su contenido en DB.

 

Después de darle mil vueltas a la config no encuentro nada al respecto y buceando entre las clases no doy con la clave.

 

¿Alguien puede ayudarme?

 

 

Información adiccional:

PrestaShop: 1.7.8.7

Modulo creado a partir del generador de plantillas de módulos: https://validator.prestashop.com/generator

 

//en modo text funciona correctamente
array(
  'col' => 6,
  'type' => 'text',
  'prefix' => '<i class="icon icon-key"></i>',
  'desc' => $this->l('Enter a valid KEY'),
  'name' => 'MYMODULE_PRIVATE_KEY',
  'label' => $this->l('KEY'),
),

//en modo password NO
array(
  'col' => 6,
  'type' => 'password',
  'prefix' => '<i class="icon icon-key"></i>',
  'desc' => $this->l('Enter a valid KEY'),
  'name' => 'MYMODULE_PRIVATE_KEY',
  'label' => $this->l('KEY'),
),

 

Link to comment
Share on other sites

19 hours ago, ventura said:

Por el codigo que muestras no se puede saber, sería necesario ver la parte del codigo donde se setean los datos

 

Este es el código fuente que uso para renderizar la información

 

/**
* Create the form that will be displayed in the configuration of your module.
*/
protected function renderForm()
{
    $helper = new HelperForm();

    $helper->show_toolbar = false;
    $helper->table = $this->table;
    $helper->module = $this;
    $helper->default_form_language = $this->context->language->id;
    $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG', 0);

    $helper->identifier = $this->identifier;
    $helper->submit_action = 'submitPaymentModule';
    $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false)
        .'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name;
    $helper->token = Tools::getAdminTokenLite('AdminModules');

    $helper->tpl_vars = array(
        'fields_value' => $this->getConfigFormValues(), /* Add values for your inputs */
        'languages' => $this->context->controller->getLanguages(),
        'id_language' => $this->context->language->id,
    );

    return $helper->generateForm(array($this->getConfigForm()));
}

/**
 * Set values for the inputs.
 */
protected function getConfigFormValues()
{
    return array(
        'MYMODULE_PRIVATE_KEY' => Configuration::get('MYMODULE_PRIVATE_KEY', null), 
    );
}

/**
 * Save form data.
 */
protected function postProcess()
{
    $form_values = $this->getConfigFormValues();

    foreach (array_keys($form_values) as $key) {
        Configuration::updateValue($key, Tools::getValue($key));
    }
}

 

Link to comment
Share on other sites

18 hours ago, stifler97 said:

Probé con un módulo ficticio y también enfrenté este problema.
hay un viejo tema aquí también:

 

Ese post es uno de los primeros que encontré, pero no resuelve mis dudas, por esa razón abrí un nuevo hilo.

Muchas gracias stifler97!!

  • Like 1
Link to comment
Share on other sites

No lo había entendido bien, si el problema es que el registro de la contraseña se guarda correctamente pero que al editar otro campo del formulario y guardar los cambios al estar el input vacío, se actualiza el registro guardado de la contraseña y se queda vacío en base de datos. Lo mejor seria hacer una validación en el postProcess() y que solo actualice si hay contraseña en el input para que se mantenga el registro guardado

 

if (Validate::isPasswd(Tools::getValue('MYMODULE_PRIVATE_KEY'))){
Configuration::updateValue('MYMODULE_PRIVATE_KEY', Tools::getValue('MYMODULE_PRIVATE_KEY'));		
}  

 

  • Like 1
Link to comment
Share on other sites

4 minutes ago, ventura said:

No lo había entendido bien, si el problema es que el registro de la contraseña se guarda correctamente pero que al editar otro campo del formulario y guardar los cambios al estar el input vacío, se actualiza el registro guardado de la contraseña y se queda vacío en base de datos. Lo mejor seria hacer una validación en el postProcess() y que solo actualice si hay contraseña en el input para que se mantenga el registro guardado

 

if (Validate::isPasswd(Tools::getValue('MYMODULE_PRIVATE_KEY'))){
Configuration::updateValue('MYMODULE_PRIVATE_KEY', Tools::getValue('MYMODULE_PRIVATE_KEY'));		
}  

 

Ok eso podría solucionar el problema, pero mi pregunta ahora es, ¿por qué si el input es de tipo text aparece el contenido y si es de tipo pass no?

¿Es algo que hace PS por defecto a nivel de seguridad?

Es que mostrar ese campo vacío despista.

 

Un saludo y gracias por la respuesta

Link to comment
Share on other sites

Así es, ese tipo de input tiene ese funcionamiento

Puedes añadir un atributo en el input para que muestre un mensaje informativo según este registrado, eg :

'desc' => (!empty(Configuration::get('MYMODULE_PRIVATE_KEY')) ? $this->l('Contraseña registrada') : $this->l('Añadir contraseña')),

 

 

Link to comment
Share on other sites

12 minutes ago, ventura said:

Así es, ese tipo de input tiene ese funcionamiento

Puedes añadir un atributo en el input para que muestre un mensaje informativo según este registrado, eg :

'desc' => (!empty(Configuration::get('MYMODULE_PRIVATE_KEY')) ? $this->l('Contraseña registrada') : $this->l('Añadir contraseña')),

 

 

Pues entendido eso... perfecto. Ahora ya sé como solucionarlo entonces.

Muchísimas gracias Ventura!!

Link to comment
Share on other sites

Pues ya lo he resuelto siguiendo vuestras recomendaciones.

Para la actualización he usado la siguiente estrategia (ya que tengo varios campos de tipo secret)

 

    /**
     * Save form data.
     */
    protected function postProcess()
    {
        $form_values = $this->getConfigFormValues();

        $configNotEmptyAllowed = [
            'MYMODULE_CONFIG_PASS_1',
            'MYMODULE_CONFIG_PASS_2',
            'MYMODULE_CONFIG_PASS_N'
        ];

        foreach (array_keys($form_values) as $key) {
            if(in_array($key ,$configNotEmptyAllowed) && empty(Tools::getValue($key))){
                continue;
            }

            Configuration::updateValue($key, Tools::getValue($key));
        }
    }

 

Gracias por todo!!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...