MarcoDev2022 Posted August 4, 2022 Share Posted August 4, 2022 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 More sharing options...
ventura Posted August 4, 2022 Share Posted August 4, 2022 Por el codigo que muestras no se puede saber, sería necesario ver la parte del codigo donde se setean los datos Link to comment Share on other sites More sharing options...
Ali Samie Posted August 4, 2022 Share Posted August 4, 2022 Probé con un módulo ficticio y también enfrenté este problema. hay un viejo tema aquí también: Link to comment Share on other sites More sharing options...
MarcoDev2022 Posted August 5, 2022 Author Share Posted August 5, 2022 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 More sharing options...
MarcoDev2022 Posted August 5, 2022 Author Share Posted August 5, 2022 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!! 1 Link to comment Share on other sites More sharing options...
ventura Posted August 5, 2022 Share Posted August 5, 2022 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')); } 1 Link to comment Share on other sites More sharing options...
MarcoDev2022 Posted August 5, 2022 Author Share Posted August 5, 2022 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 More sharing options...
ventura Posted August 5, 2022 Share Posted August 5, 2022 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 More sharing options...
MarcoDev2022 Posted August 5, 2022 Author Share Posted August 5, 2022 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 More sharing options...
MarcoDev2022 Posted August 5, 2022 Author Share Posted August 5, 2022 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now