Cómo Eliminar Productos SIN Stock del Carrito en PrestaShop 1.7

Eliminar Productos SIN Stock del Carrito en PrestaShop 1.7

PrestaShop 1.7 NO elimina los productos SIN Stock de los carritos de los clientes, por lo que puede causar bastantes problemas cuando se dispone de un stock limitado para ciertos productos de la tienda.

Si tenemos muchos clientes que se decanten por un mismo producto al mismo tiempo puede darse el caso de que un producto se agote cuando ya esté en el carrito de otra persona. Por ejemplo, puede pasar que dos clientes añadan al mismo tiempo la última unidad de un producto al carrito, entonces, al pasar por caja un pedido se tramitará correctamente y el otro no. Lo que sucede es que cuando el segundo cliente realiza el pedido, el producto ya no estará disponible y esto le causará una cierta confusión, especialmente si no puede reponer ese artículo específico en su carrito.

En este artículo vamos a descubrir cómo improvisar la experiencia de nuestros clientes llevando a cabo una simple modificación en PrestaShop 1.7 para solucionar el problema.

La Presentación del Carrito en PrestaShop 1.7

El archivo que necesitamos editar es “CartPresenter.php”, ya que es el encargado de mostrar la información del carrito en toda la tienda.

Este archivo se puede localizar en la siguiente ruta de la instalación de PrestaShop 1.7:

src/Adapter/Cart/CartPresenter.php

 

Una vez localizado el archivo en cuestión, hay que editarlo (en caso de estar con el Administrador de Archivos de cPanel: Click con el botón izquierdo del ratón para seleccionar el archivo. Después, click con el botón derecho del ratón para desplegar el menú y, seleccionar la opción de “Edit”, así como “Edit” de nuevo).

PS17 CartPresenter

Después de la línea 51 más o menos, en las propiedades de la clase, hay que añadir lo siguiente en la línea 52 o siguientes:

private static $removedProducts = [];

 

PS17 CartPresenter Edit

Tras ello, y justo después del siguiente segmento, que podremos encontrar a partir de la línea 280 más o menos:
 

if ($shouldSeparateGifts) {

    $rawProducts = $cart->getProductsWithSeparatedGifts();

} else {

    $rawProducts = $cart->getProducts(true);

}


Hay que añadir lo siguiente:

if(!self::$removedProducts)

    foreach ($rawProducts as $pk => $product)

    {

    // Quitar productos en caso de no estar disponibles

        if($product[‘quantity_available’] <= 0 && !Product::isAvailableWhenOutOfStock($product['out_of_stock']))

        {

            Context::getContext()->cart->deleteProduct($product[‘id_product’],$product[‘id_product_attribute’], $product[‘id_customization’], $product[‘id_address_delivery’]);

            self::$removedProducts[] = $product[‘name’];

            unset($rawProducts[$pk]);

            continue;

        }

    }

    

Context::getContext()->smarty->assign([‘removed_products’ => self::$removedProducts]);

\Media::addJsDef([‘removed_products’ => self::$removedProducts]);

 

PS17 CartPresenter Edit 2

Por cierto, NO se nos puede olvidar guardar los cambios en la parte superior del editor.

Antes de continuar, podemos asegurarnos de que el cambio introducido funciona. Para ello, podemos añadir un producto al carrito de nuestra tienda y luego editarlo a través del Backoffice de PrestaShop 1.7 para cambiarle la cantidad disponible a 0.

Cambiada la cantidad del producto a 0, si ahora refrescamos el carrito, el producto se eliminará. Sin embargo, esto queda un poco “feo”, ya que no se le avisa al cliente sobre la supuesta desaparición del producto de su carrito, así que podemos crear una especie de “Popup casero” para ello, tal y como vamos a indicar a continuación si se dispone de la plantilla original de PrestaShop 1.7.

Por lo visto con las versiones más recientes de PrestaShop 1.7 no funciona lo siguiente, sin embargo, en versiones más viejas de PrestaShop 1.7 sí.

Plantilla Original de PrestaShop 1.7

Podemos empezar por abrir el archivo “ps_shoppingcart.tpl” y editarlo.

Lo podemos encontrar en la siguiente ruta de la instalación de PrestaShop 1.7:

themes/classic/modules/ps_shoppingcart/ps_shoppingcart.tpl

 

ps_shoppingcart.tpl

Después, debemos introducir el siguiente código en la parte inferior del archivo “ps_shoppingcart.tpl” (a partir de la línea 41 por ejemplo):

{if isset($removed_products) && $removed_products}

  <div id="removed-modal" class="modal">

    <div class="modal-dialog">

      <div class="modal-content">

        <div class="modal-body">

          <p>{l s='Estos Productos No Tienen Stock Actualmente:' d='Shop.Theme.Checkout'}</p>

            <ul>

              {foreach from=$removed_products item='r_product'}

                <li>- {$r_product}</li>

              {/foreach}

            </ul>

            <p>{l s='Por lo que han sido eliminados de tu carrito' d='Shop.Theme.Checkout'}</p>

        </div>

 

      </div>

    </div>

  </div>

{/if}


ps_shoppingcart edit

Nuevamente, NO se nos puede olvidar guardar los cambios en la parte superior del editor.

Y, por último, tendríamos que añadir un código en el Javascript personalizado del theme:

themes/classic/assets/js/custom.js


ps17 custom.js

Habría que añadir lo siguiente:

if(removed_products.length > 0) {
    $('#removed-modal').modal('show');
}


ps17 custom.js edit

¡Y eso es todo!

Nota: Se puede acceder a estos archivos a través del administrador de archivos de cPanel o Plesk, así como mediante un cliente de FTP como FileZilla. Para este artículo hemos realizado capturas de pantalla del Administrador de archivos de cPanel.

¿Todavía no tienes una Tienda Online?
Con PrestaShop 1.7 puedes montar una fácilmente.

Aquí tienes todas las características de los planes PrestaShop que puedes contratar en Hostinet. Todos ellos corren bajo discos sólidos (SSD) para garantizar la máxima velocidad de carga para TU Tienda Online. Además, te garantizamos una IP española para TU Tienda Online.

Hosting PrestaShop