Jump to content

Cambios en combinaciones de la vista rápida (quickview) que se trasladan a la ficha principal de producto


Prestafan33

Recommended Posts

Buenas tardes a todos.

Estoy desarrollando un tema para Prestashop 1.7 a partir del tema por defecto (classic). He activado los botones de vista rápida (quickview) para las miniaturas, y funcionan correctamente en los listados de categorías y búsquedas, pero tengo un problema cuando algún módulo de productos relacionados o similar los muestra en la ficha de producto.

El problema es que en la ventana modal del quickview se carga un producto mientras que en la vista principal de la página hay cargado otro diferente. Entonces, si se cambian las combinaciones en la ventana de vista rápida, esos mismos cambios se aplican también al producto principal que se está mostrando en la página. No sé si me explico bien: supongamos que se entra en la ficha de un producto que es ropa, que tiene combinaciones a partir de los atributos talla y color. Si en esa misma ficha de producto se abre la ventana de quickview de otro producto diferente relacionado y se cambia la talla o color de ese, se envía una petición AJAX y se actualizan los datos del producto en la ventana quickview, PERO ESOS CAMBIOS SE TRASLADAN TAMBIÉN EN LA FICHA PRINCIPAL DEL PRODUCTO, con lo cual la información que se muestra en la ventana principal ya no es la correcta (ni nombre del producto, ni imágenes, ni precio ni combinaciones).

El por qué del error lo tengo claro: como los nombres y las clases de los elementos son los mismos en la ventana modal del quickview y en la ficha de producto, al recibirse la respuesta AJAX por los cambios desde la ventana quickview, el contenido de la respuesta actualiza los elementos de ese modal, pero también los de la página principal que tienen los mismos nombres y clases. Lo que no soy capaz de localizar es en qué archivo está el Javascript que gestiona ese evento para intentar solucionarlo.

Supongo que más gente se habrá encontrado con este fallo tan tonto (y tan desesperante). ¿Alguna pista sobre cómo solucionarlo? Muchas gracias de antemano.

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

Bueno, he localizado dónde está el Javascript que provoca es error, y he encontrado una forma de parchearlo. El problema es que se encuentra dentro del archivo /themes/core.js, que es un archivo del núcleo de Prestashop y, aparte de que creo que no es buena idea modificar cosas ahí, los cambios tampoco serán permanentes, ya que en el momento que se actualice la versión de Prestashop supongo que se perderán.

El caso es que el problema está en este fragmento:

success: function (e, n, o) {
                                                var a = (0, r.default)("<div>").append(e.product_cover_thumbnails);
                                                (0, r.default)(".images-container").html() !== a.find(".images-container").html() && (0, r.default)(".images-container").replaceWith(e.product_cover_thumbnails),
                                                (0, r.default)(".product-prices").replaceWith(e.product_prices),
                                                (0, r.default)(".product-customization").replaceWith(e.product_customization),
                                                (0, r.default)(".product-variants").replaceWith(e.product_variants),
                                                (0, r.default)(".product-discounts").replaceWith(e.product_discounts),
                                                (0, r.default)(".product-additional-info").replaceWith(e.product_additional_info),
                                                (0, r.default)("#product-details").replaceWith(e.product_details),
                                                (0, r.default)(".product-flags").replaceWith(e.product_flags),
                                                function (e) {
                                                    var t = null;
                                                    (0, r.default)(e.product_add_to_cart).each(function (e, n) {
                                                        if ((0, r.default)(n).hasClass("product-add-to-cart"))
                                                            return t = (0, r.default)(n), !1
                                                    }),
                                                    null === t && d((0, r.default)("#product-availability"), "An error occurred while processing your request");
                                                    var n = (0, r.default)(".product-add-to-cart");

... que he modificado así:

success: function (e, n, o) {
                                                var parent = (0, r.default)("#product");
                                                if ((0, r.default)(".modal.quickview.in").length > 0) {
                                                  parent = (0, r.default)(".modal.quickview.in");
                                                }
                                                var a = (0, r.default)("<div>").append(e.product_cover_thumbnails);
                                                parent.find(".images-container").html() !== a.find(".images-container").html() && parent.find(".images-container").replaceWith(e.product_cover_thumbnails),
                                                parent.find(".product-prices").replaceWith(e.product_prices),
                                                parent.find(".product-customization").replaceWith(e.product_customization),
                                                parent.find(".product-variants").replaceWith(e.product_variants),
                                                parent.find(".product-discounts").replaceWith(e.product_discounts),
                                                parent.find(".product-additional-info").replaceWith(e.product_additional_info),
                                                parent.find("#product-details").replaceWith(e.product_details),
                                                parent.find(".product-flags").replaceWith(e.product_flags),
                                                function (e) {
                                                    var t = null;
                                                    (0, r.default)(e.product_add_to_cart).each(function (e, n) {
                                                        if ((0, r.default)(n).hasClass("product-add-to-cart"))
                                                            return t = (0, r.default)(n), !1
                                                    }),
                                                    null === t && d(parent.find("#product-availability"), "An error occurred while processing your request");
                                                    var n = parent.find(".product-add-to-cart");

Es decir, básicamente lo que hago es crear una variable padre a la cual asigno el elemento que tiene como ID "product" (que es el body), excepto en el caso que esté abierta la ventana modal del quickview, que en ese caso la pongo como padre a ella. Y luego ya todos los elementos que se buscan y reemplazan lo hago dentro de ese padre.

Como digo, así funciona correctamente, pero no me convence el sitio donde he tenido que hacer la modificación, aparte de dudar de su "durabilidad" en sucesivas actualizaciones. ¿A alguien se le ocurre alguna otra cosa?

Edited by Prestafan33 (see edit history)
  • Like 1
Link to comment
Share on other sites

  • 4 years later...

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