Jump to content

[Aporte] Guardar Campos De Texto Personalizados Sin Botón De Guardar En Prestashop 1.6


FranciscoVillen

Recommended Posts

Buenas,

 

He decidido compartir esto con vosotros porque creo que es un problema habitual, tener que pulsar el botón de guardar en los campos de textos personalizados es realmente molesto y va en contra de la experiencia del usuario.

 

Comentar que hay un post al respecto en el foro inglés,  aunque lleva 11 páginas y se comentan soluciones para versiones 1.4 y 1.5 de prestashop. Si teneis una versión antigua de Prestashop os puede ser de utilidad:

 

https://www.prestashop.com/forums/topic/76874-how-to-remove-save-button-for-customized-fields/

 

La solución que voy a compartir con vosotros, no la he realizado yo, la he encontrado en una web en inglés y me ha sido de mucha utilidad.

 

Hay que realizar tres pasos:

 

1. Modificar el archivo ajax-cart.js del modulo del carrito (el cual estará en /themes/tu-tema/js/modules/blockcart/ajax-cart.js). Si no tienes esta ruta de archivo es recomendable que te la crees y copies ahi el archivo ajax-cart.js desde /modules/blockcart/ajax-cart.js:

 

Debeis añadir al principio de la funcion add (sobre la linea 256)

add : function(idProduct, idCombination, addedFromProductPage, callerElement, quantity, whishlist)

Lo siguiente:

if(addedFromProductPage && $('#customizationForm').length > 0)
        {
             console.log("llega aqui");
            $('#quantityBackup').val($('#quantity_wanted').val());
            customAction = $('#customizationForm').attr('action');
            $('body select[id^="group_"]').each(function() {
                console.log("llega al each");
                customAction = customAction.replace(new RegExp(this.id + '=\\d+'), this.id +'=' + this.value);
            });

            // ajax to product page with custom action
            var customization_entries = $('#customizationForm').serialize();
            $.ajax({
                async:false,
                type: 'POST',
                data: customization_entries+ '&ajax=1',
                dataType: 'json',
                url: customAction,
                success: function(data){
                     if(typeof(data.errors) !== 'undefined')
                    {
                        alert('Error while saving customization data');
                        return;
                    }
                }
            });  
             
        }

2. Añadir una función a /controllers/front/ProductController.php (mucho mejor si le haceis un override para no perder la modificación cuando actualiceis Prestashop), la función es la siguiente:

 public function postProcess()
    {
        if (Tools::getValue('ajax') && Tools::isSubmit('submitCustomizedDatas'))
        {
            if (!$this->context->cart->id && isset($_COOKIE[$this->context->cookie->getName()]))
            {
                $this->context->cart->add();
                $this->context->cookie->id_cart = (int)$this->context->cart->id;
            }
     
            $this->pictureUpload();
            $this->textRecord();
            $this->formTargetFormat();
     
            if($this->errors)
            {
                $error_list = implode('; ', $this->errors);
                die(Tools::jsonEncode(array('errors' => $error_list)));
            } else
                die(Tools::jsonEncode(array('success' => true)));
                 
        }
    }

3. Modificar el archivo /js/tools.js en la funcion checkCustomizations (linea 316):

 

Tendreis que cambiar una linea:

if (parseInt(customizationFields[i][1]) == 1 && ($('#' + customizationFields[i][0]).html() == '' ||  $('#' + customizationFields[i][0]).text() != $('#' + customizationFields[i][0]).val()) && !pattern.test($('#' + customizationFields[i][0]).attr('class')))

Por:

if (parseInt(customizationFields[i][1]) == 1 && ($('#' + customizationFields[i][0]).val() == ''))

De este archivo no se puede hacer un override por lo que tened en cuenta que ante una actualización de Prestashop perdereis la modificación.

 

Por último tendreis que ocultar el botón de guardar de los campos personalizados, en el caso de mi plantilla es añadir la siguiente regla de estilo:

#customizedDatas{
 display: none;
}

Nota: para que os funcione teneis que tener habilitado ajax en la configuración de modulo blockcart

 

 

Obtenido de: http://nemops.com/save-prestashop-custom-fields-add-to-cart/#.VqJEQvE8zkx

Edited by FranciscoVillen (see edit history)
Link to comment
Share on other sites

  • 1 month later...

Hola FranciscoVillen he intentado hacer lo que sugieres. Pero no me ha funcionado. Tienes idea de por qué prodría ser?? He seguido todos los pasos y copiado el código tal y como lo presentas aquí.

Ah, el campo de texto que quiero añadir lo he diseñado con un datepicker para que me muestre un calendario.

Muchas gracias por tu aportación

Edited by santidrod (see edit history)
Link to comment
Share on other sites

Hola Santidrod, ¿La modificación de /controllers/front/ProductController.php la has hecho con un override o sobre el original?.

 

Si has hecho el override, a veces Prestashop no te coge la modificación de primeras y es necesario borrar el fichero class_index.php (tras borrarlo se volverá a regenerar) que se encuentra en la carpeta /cache.

Link to comment
Share on other sites

  • 2 months later...

No me ha funcionado, tengo que cargar 2000 productos personalizados y me estoy volviendo loco.

 

ya tengo la pagina funcionando y tengo miedo de que se caiga todo ya que probe esto que indicas mas arriba y se me ha caido la pagina productos.

 

ya llevo una semana sin poder resolver, alguien pudo saber algo mas?

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...