Post Top Ad

Your Ad Spot

miércoles, 26 de agosto de 2020

Creación de un botón "Limpiar carrito" en PrestaShop 1.7

¡Veamos cómo crear un botón para vaciar el carrito de compras de PrestaShop 1.7 con un solo clic!
  • Versión utilizada: Prestashop 1.7.2.4
En este tutorial veremos cómo aplicar mi guía anterior sobre la creación de un botón "Limpiar carrito" en PrestaShop a PrestaShop 1.7, ya que no funciona de inmediato debido a la nueva plantilla.
El código básico todavía funciona y el proceso es más o menos el mismo, aunque los archivos que necesitan modificaciones son totalmente diferentes. Para este tutorial, usaré la plantilla clásica (o estándar), así que dondequiera que lea "nombre del tema", simplemente ponga clásico . Como un lado no, tenga en cuenta que algunos archivos pueden ser diferentes si usa un tema personalizado de PrestaShop.

Agregar el botón a la página del carrito en PrestaShop 1.7

La estructura de la plantilla de PrestaShop 1.7 es bastante diferente de la 1.6, por lo que debemos tener en cuenta eso. La vista principal del carrito ahora se encuentra en themes / * themename * / templates / checkout / , y se llama cart.tpl . Ábrelo y localiza el siguiente bloque:
1
2
3
{block name='cart_overview'}
  {include file='checkout/_partials/cart-detailed.tpl' cart=$cart}
{/block}
Esto representa el bloque de la lista de productos y queremos agregar el botón justo después de él:
1
2
3
<a class="btn btn-primary" style="float:right" id="removeAll" href="javascript:void(0)">
  Empty Cart
</a>
En este punto, a diferencia de 1.6 donde podríamos agregar nuestro código directamente a la plantilla, con PrestaShop 1.7 tenemos que usar un nuevo archivo, llamado custom.js .

Agregar nuevo javascript a una plantilla de PrestaShop 1.7

Abra custom.js , ubicado en themes / * themename * / assets / js .
Está vacío por defecto, así que si no (como en el caso de las plantillas personalizadas), simplemente agregue el código al final.
Este archivo se carga en todas las páginas, y dado que solo queremos ejecutarlo en el carrito, tenemos que envolver nuestro fragmento con una condición:
1
2
if(prestashop.page.page_name == 'cart')
{}
La variable javascript de prestashop es un nuevo global disponible en todas las páginas de la tienda, que contiene una serie de datos útiles que se pueden utilizar en scripts. En este caso, usamos el nombre de la página actual.
Aquí está todo el resto del código que necesitamos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
dieciséis
17
$(document).ready(function() {
        $('#removeAll').click(function(e) {
            e.preventDefault()
            $.ajax({
                type: 'POST',
                headers: { "cache-control": "no-cache" },
                url: prestashop.urls.base_url + "cart",
                async: true,
                cache: false,
                data: 'deleteAll=1&token=' + prestashop.token + '&ajax=true',
                success: function(data){   
                    window.location.reload();
                }
            })
        });
    });
Explicación: estamos usando la variable prestashop nuevamente, esta vez para buscar la URL base. Se puede acceder al controlador de carrito, que editaremos en breve, en / cart de forma predeterminada, por lo que pasamos esta url a la llamada ajax.
Para la cadena de consulta, pasamos deleteAll , para asegurarnos de que podemos hacer referencia a esta acción en el siguiente paso, un token requerido por PrestaShop 1.7, y ajax = true , para que el carrito sepa que la acción debe ejecutarse en modo ajax.
Si la llamada es exitosa, actualizamos la página para mostrar que el carrito ahora está vacío.

Editando el CartController

PrestaShop 1.7 desaconseja el uso de anulaciones, pero usaremos una en cualquier caso. :)
Cree un nuevo archivo en override / controllers / front y asígnele el nombre cartController.php . Busque el controlador de carro original en los controladores principales / frente , y copie todo el método updateCart , pegándolo en nuestro nuevo archivo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
dieciséis
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
protected function updateCart()
{
    // Update the cart ONLY if $this->cookies are available, in order to avoid ghost carts created by bots
    if ($this->context->cookie->exists() && !$this->errors && !($this->context->customer->isLogged() && !$this->isTokenValid())) {
        if (Tools::getIsset('add') || Tools::getIsset('update')) {
            $this->processChangeProductInCart();
        } elseif (Tools::getIsset('delete')) {
            $this->processDeleteProductInCart();
        } elseif (CartRule::isFeatureActive()) {
            if (Tools::getIsset('addDiscount')) {
                if (!($code = trim(Tools::getValue('discount_name')))) {
                    $this->errors[] = $this->trans('You must enter a voucher code.', array(), 'Shop.Notifications.Error');
                } elseif (!Validate::isCleanHtml($code)) {
                    $this->errors[] = $this->trans('The voucher code is invalid.', array(), 'Shop.Notifications.Error');
                } else {
                    if (($cartRule = new CartRule(CartRule::getIdByCode($code))) && Validate::isLoadedObject($cartRule)) {
                        if ($error = $cartRule->checkValidity($this->context, false, true)) {
                            $this->errors[] = $error;
                        } else {
                            $this->context->cart->addCartRule($cartRule->id);
                        }
                    } else {
                        $this->errors[] = $this->trans('This voucher does not exist.', array(), 'Shop.Notifications.Error');
                    }
                }
            } elseif (($id_cart_rule = (int)Tools::getValue('deleteDiscount')) && Validate::isUnsignedId($id_cart_rule)) {
                $this->context->cart->removeCartRule($id_cart_rule);
                CartRule::autoAddToCart($this->context);
            }
        }
    } elseif (!$this->isTokenValid() && Tools::getValue('action') !== 'show' && !Tools::getValue('ajax')) {
        Tools::redirect('index.php');
    }
}
Todo lo que tenemos que hacer ahora es agregar nuestra condición, como parte de todos esos ELSEIF:
1
2
3
4
5
elseif (Tools::getIsset('deleteAll')) {
    $this->context->cart->delete();
    $this->context->cookie->id_cart = 0;
    die(1);
}
Aquí está el código final:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
dieciséis
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
protected function updateCart()
{
    // Update the cart ONLY if $this->cookies are available, in order to avoid ghost carts created by bots
    if ($this->context->cookie->exists() && !$this->errors && !($this->context->customer->isLogged() && !$this->isTokenValid())) {
        if (Tools::getIsset('add') || Tools::getIsset('update')) {
            $this->processChangeProductInCart();
        } elseif (Tools::getIsset('delete')) {
            $this->processDeleteProductInCart();
        } elseif (Tools::getIsset('deleteAll')) { /* Nemo */
            $this->context->cart->delete();
            $this->context->cookie->id_cart = 0;
            die(1);
        } elseif (CartRule::isFeatureActive()) {
            if (Tools::getIsset('addDiscount')) {
                if (!($code = trim(Tools::getValue('discount_name')))) {
                    $this->errors[] = $this->trans('You must enter a voucher code.', array(), 'Shop.Notifications.Error');
                } elseif (!Validate::isCleanHtml($code)) {
                    $this->errors[] = $this->trans('The voucher code is invalid.', array(), 'Shop.Notifications.Error');
                } else {
                    if (($cartRule = new CartRule(CartRule::getIdByCode($code))) && Validate::isLoadedObject($cartRule)) {
                        if ($error = $cartRule->checkValidity($this->context, false, true)) {
                            $this->errors[] = $error;
                        } else {
                            $this->context->cart->addCartRule($cartRule->id);
                        }
                    } else {
                        $this->errors[] = $this->trans('This voucher does not exist.', array(), 'Shop.Notifications.Error');
                    }
                }
            } elseif (($id_cart_rule = (int)Tools::getValue('deleteDiscount')) && Validate::isUnsignedId($id_cart_rule)) {
                $this->context->cart->removeCartRule($id_cart_rule);
                CartRule::autoAddToCart($this->context);
            }
        }
    } elseif (!$this->isTokenValid() && Tools::getValue('action') !== 'show' && !Tools::getValue('ajax')) {
        Tools::redirect('index.php');
    }
}
¡Hemos terminado! Acceda a la oficina administrativa, los parámetros avanzados, el rendimiento y presione el botón borrar caché en la parte superior derecha para que se realice la anulación.
Si no funciona, verifique que Desactivar todas las anulaciones esté configurado en no, justo debajo de la misma página. Si aún no lo hace, intente editar el CartController.php principal.

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

outbrain

Páginas