¿Cómo copiar el carrito en otro carrito para cambiar el id_cart?

Objetivos del blog.

Después de leer este blog, podremos copiar el carrito en otro carrito para cambiar el ID del carrito.

Requisito

Necesitamos modificar el siguiente archivo para arreglar el mismo. Estaremos haciendo cambios en el archivo Core para el mismo.

Root dir \ classes \ PaymentModule.php

Procedimiento

Necesitamos modificar la función de validar orden en el archivo de clase PaymentModule. Como esta función se llama solo una vez al completar el pedido. Así que hemos agregado el código en el mismo para evitar la creación de múltiples carros.

if (self :: DEBUG_MODE) {PrestaShopLogger :: addLog ('PaymentModule :: validateOrder - Función llamada', 1, null, 'Cart', (int) $ id_cart, true); } if (! isset ($ this-> context)) {$ this-> context = Context :: getContext (); } $ this-> context-> cart = new Cart ((int) $ id_cart);

El código siguiente debe agregarse en la función de validar orden después de las líneas anteriores.

// cambios iniciados // Para guardar la clave segura del ID del carrito actual y reasignar la misma al nuevo carrito $ old_cart_secure_key = $ this-> context-> cart-> secure_key; // Para guardar el ID de cliente del ID de carrito actual y reasignar el mismo al nuevo carrito $ old_cart_customer_id = (int) $ this-> context-> cart-> id_customer; // Para desasignar al cliente del carrito antiguo $ this-> context-> cart-> id_customer = 0; // Para actualizar el carrito $ this-> context-> cart-> save (); // Para obtener los productos del carrito actual $ cart_products = $ this-> context-> cart-> getProducts (); // Crear nuevo objeto de carrito $ this-> context-> cart = new Cart (); $ this-> context-> cart-> id_lang = $ this-> context-> language-> id; $ this-> context-> cart-> id_currency = $ this-> context-> currency-> id; // para agregar nuevo carrito $ this-> context-> cart-> add (); // para actualizar el nuevo carrito foreach ($ cart_products as $ product) {$ this-> context-> cart-> updateQty ((int) $ product ['cantidad'], (int) $ product ['id_product'], (int) $ product ['id_product_attribute']); } if ($ this-> context-> cookie-> id_guest) {$ guest = new Guest ($ this-> context-> cookie-> id_guest); $ this-> context-> cart-> mobile_theme = $ guest-> mobile_theme; } // para asignar el nuevo carrito con el cliente $ this-> context-> cart-> id_customer = $ old_cart_customer_id; // para guardar el nuevo carrito $ this-> context-> cart-> save (); if ($ this-> context-> cart-> id) {$ this-> context-> cookie-> id_cart = (int) $ this-> context-> cart-> id; $ this-> context-> cookie-> write (); } // para actualizar el $ id_cart con el del nuevo carrito $ id_cart = (int) $ this-> context-> cart-> id; $ this-> context-> cart-> secure_key = $ old_cart_secure_key; // cambios en

Después de seguir el procedimiento anterior, la lista del carrito de la compra se verá así, es decir, tendrá un carrito duplicado con los mismos detalles que el carrito con el que se realizó el pedido.
lista de carro de compras

Resumen

Después de seguir el procedimiento anterior, podrá copiar el carrito en otro carrito para cambiar el id_cart.


Obtén los últimos productos sin precios especiales (Opencart 2.3)

Objetivos del blog.

Después de leer este blog, podrá obtener productos de la base de datos de Opencart sobre la base del parámetro que se pasa desde la URL.

Requisito

Tenemos que mostrar los últimos productos sobre la base del parámetro pasado en la URL. Usando este parámetro, tenemos que decidir si debemos mostrar productos especiales o no.

Implementación de Código

Para implementar esto necesitamos hacer cambios en nuestro controlador y modelo. En el controlador, agregamos la condición para pasar el parámetro y en el modelo realizaremos cambios en la consulta de acuerdo con el parámetro pasado. Para manejar la condición estamos usando show_special Parámetro en el código. A continuación se muestra el código que tenemos que añadir en el controlador (catálogo / controlador / extensión / módulo / latest.php):

/ * Comprobación de la clave show_special en el parámetro get * Esta clave ($ show_special) se utilizará para recuperar condicionalmente datos de la base de datos. * es decir, si $ show_special = 1 muestra productos que * special $ show_special = 0 muestra productos que no tienen especial * else * muestra todos los productos independientemente de special * / if (isset ($ this-> request-> get [' show_special '])) {// pasando el valor en la variable si se establece en la URL $ show_special = $ this-> request-> get [' show_special ']; } else {// De lo contrario, se pasará una cadena vacía $ show_special = ''; } // Crear una variable para pasar al modelo $ filter_data = array ('start' => ($ page - 1) * $ limit, 'limit' => $ limit, 'show_special' => $ show_special); // Llamando a la función de modelo para obtener datos de la base de datos de acuerdo con los datos pasados ​​en la matriz filter_data. $ results = $ this-> model_catalog_product-> getProductLatest ($ filter_data);

En este código primero hemos comprobado que si 'show_special'parámetro está configurado en la URL o no. Si es así, establezca el valor del parámetro en una variable $ show_special y si no, entonces establezca la variable como en blanco. Entonces hemos creado una matriz ($ default_data) con los valores en nombre de los cuales tenemos que buscar productos de la base de datos. Entonces hemos llamado función de modelo. getProductLatest () para obtener los últimos productos de acuerdo con la variable pasada ($ filter_data) en la función. Aquí está la función que tenemos que agregar en el modelo (catálogo / modelo / catálogo / producto):

función pública getProductLatest ($ data = array ()) {// Configurando los parámetros $ join y $ condition para obtener datos de productos especiales si ($ data ['show_special'] == '1') {$ join = "LEFT JOIN" . DB_PREFIX. "product_special ps ON (ps.product_id = p.product_id)"; $ condition = "AND ps.customer_group_id = '". (int) $ this-> config-> get ('config_customer_group_id'). "'AND ((ps.date_start =' 0000-00-00 'OR ps.date_start <NOW ()) AND (ps.date_end =' 0000-00-00 'OR ps.date_end> NOW () O ps.date_end = '0001-01-01')) "; } // Configurando los parámetros $ join y $ condition para obtener datos de productos que no son específicos ($ data ['show_special'] == '0') {$ join = "LEFT JOIN". DB_PREFIX. "product_special ps ON (ps.product_id = p.product_id)"; $ condition = "AND ps.product_id IS NULL"; } else {// Estableciendo los parámetros $ join y $ condition para obtener datos de todos los productos, independientemente de la especial $ join = ''; $ condición = ''; } // Consulta para obtener datos de productos de la base de datos. Se agregaron los parámetros $ join y $ condition en la consulta para obtener datos en consecuencia $ sql = "SELECT DISTINCT p.product_id FROM". DB_PREFIX. "producto p ÚNICA IZQUIERDA". DB_PREFIX. "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN". DB_PREFIX. "product_to_store p2s ON (p.product_id = p2s.product_id) $ join WHERE p.status = '1' AND p.date_available <= NOW () AND p2s.store_id = '". (int) $ this-> config-> get ('config_store_id'). "'$ condition GROUP BY p.product_id ORDER BY p.product_id DESC"; // Establecer el límite en la consulta si se pasa LIMIT desde el controlador. if (isset ($ data ['start']) || isset ($ data ['limit'])) {if ($ data ['start'] <0) {$ data ['start'] = 0; } if ($ data ['límite'] <1) {$ data ['límite'] = 20; } $ sql. = "LIMIT". (int) $ datos ['inicio']. ",". (int) $ datos ['límite']; } $ product_data = array (); // Ejecutar consulta $ consulta = $ esto-> db-> consulta ($ sql); // Bucle para establecer los datos recuperados en la variable para pasar en el controlador. foreach ($ consulta-> filas como $ resultado) {$ product_data [$ resultado ['product_id']] = $ this-> getProduct ($ result ['product_id']); } // Devolver los datos de los productos al controlador. devuelve $ product_data; }

En el modelo hemos establecido variables. $ unirse y $ condición Sobre la base de las siguientes tres condiciones:

  1. Si show_special es 1: En este caso solo hemos mostrado productos que son especiales. Como en Opencart, los datos de productos especiales se almacenan en la tabla oc_product_special, por lo que hemos agregado la combinación de oc_product table con la tabla oc_product_secial para obtener datos de productos especiales únicamente.
  2. Si show_special es 0: En este caso, hemos mostrado productos que no están configurados como especiales. Entonces, para encontrar productos que no sean especiales, tenemos que buscar productos que están en una tabla especial pero en la tabla oc_product_special. Para esto hemos agregado la combinación IZQUIERDA de la tabla oc_product con la tabla oc_product_secial y la condición agregada "ps.product_id IS NULL".
  3. Si show_special es distinto de 0 y 1: En este caso, tenemos que buscar todos los productos, ya sean especiales o no. Así que para esto hemos obtenido directamente datos de la tabla oc_product.

Después de agregar las tres condiciones posibles, hemos escrito la consulta y la ejecutamos. Entonces hemos puesto todos los datos recuperados en $ product_data Array y devuelve lo mismo al controlador.

Nota: aquí para obtener los últimos productos que acabamos de utilizar 'Ordenar por product_id DESC' en la consulta. Si desea obtener datos de productos que se agregaron en los últimos días, puede agregar una condición más en la cláusula WHERE, es decir, fecha_added> 'cualquier fecha'.

Resumen

Después de seguir el procedimiento anterior, podrá obtener los últimos productos especiales sobre la base del parámetro pasado para productos especiales en la URL.


¿Cómo calcular el envío gratuito en función del precio total final en Prestashop?

Después de leer este blog, podremos calcular el envío gratuito en función del precio total final del carrito.

Planteamiento del problema

Actualmente, cuando agregamos productos al carrito y pasamos a la sección de pago para aprovechar el descuento y el envío, vemos que el descuento se aplica después del envío. digamos,

  • El monto total del carrito es de $ 100 que aprovechan el envío gratuito y también se agrega un descuento del 5%
  • Luego, después de que el monto total del descuento del carrito se establece por debajo de $ 100, pero aún así, se aplica el envío gratuito, lo que no debería suceder. El envío gratuito debe aplicarse al monto total final del carrito después del descuento.
  • Este es el proceso predeterminado de Prestashop. Consulte la captura de pantalla a continuación donde el envío debe ser gratuito si el total del pedido es> 50 pero se ha aplicado el envío gratuito mientras que el total del pedido es <50 después del descuento:

Lectura recomendada: Estrategias de envío gratis: ¿Por qué ofrecer? ¿Cómo ofrecer? ¿Cuándo ofrecer?

¿Por qué el problema actual está ahí?

El problema actual está ahí porque el monto del envío se calcula sobre el monto total del pedido que se establece en el carrito antes de aplicar el descuento. Puede verificar las líneas de código a continuación donde se usa el total del pedido sin el monto del descuento para calcular el envío:

$shipping_cost += $carrier->getDeliveryPriceByPrice($the_total_price, $id_zone, (int)$this->id_currency);

Requisito

Necesitamos modificar el archivo mencionado a continuación para arreglar lo mismo. Anularemos las líneas correspondientes del archivo de clase para evitar cualquier cambio en los archivos Core.

A continuación se muestra la lista de archivos de clase que se anularán-

1. Directorio raíz\clases\Cart.PHP

Procedimiento para resolver el problema-

Siga los pasos mencionados a continuación:

1. Función de reescritura�getPackageShippingCost

2. Después de la línea dada a continuación –

// Total del pedido en la moneda predeterminada sin cargos $order_total = $this->getOrderTotal(true, Cart::BOTH_WITHOUT_SHIPPING, $product_list);

3. Agregue la siguiente declaración:

$listeDescuentos = $this->getCartRules(); $descuentos_totales = 0; if (is_array($listeDiscounts)) { if (isset($listeDiscounts[0]['value_real'])) $total_discounts = $listeDiscounts[0]['value_real']; } $price_to_apply_shipment = floatval($order_total) - floatval($total_descuentos); Lectura recomendada: La mejor extensión de administrador de envío gratuito para la tienda OpenCart

4. Reemplace las líneas mencionadas a continuación:

Reemplazar esta línea

$check_delivery_price_by_price = Carrier::checkDeliveryPriceByPrice($row['id_carrier'], $total_order, (int)$id_zone, (int)$this->id_currency);

Con

$check_delivery_price_by_price = Carrier::checkDeliveryPriceByPrice($row['id_carrier'], $price_to_apply_shipment, (int)$id_zone, (int)$this->id_currency);

————Y—————–

Reemplazar esta línea

$shipping_cost += $carrier->getDeliveryPriceByPrice($the_total_price, $id_zone, (int)$this->id_currency);

Con

$shipping_cost += $carrier->getDeliveryPriceByPrice($price_to_apply_shipment, $id_zone, (int)$this->id_currency);

5. Limpia la caché y ejecuta.

Consulte la captura de pantalla a continuación después de aplicar los cambios al código:

Después de seguir el procedimiento anterior, podrá calcular el Envío sobre el monto Total Final del Carrito.

Conclusión

Cuando se trata de compras en línea, toda la estructura de precios juega un papel crucial para los clientes. Uno de los factores que pueden hacer o deshacer sus conversiones es la disponibilidad de envío gratuito. Un método para determinar las opciones y costos de envío en un sitio web de comercio electrónico es el Complemento de administrador de envío gratuito de Knowband. Uno de los requisitos más importantes para aumentar las ventas promedio es brindar apertura en la transacción.

Las tiendas que utilizaron este módulo de envío gratuito aumentaron el tráfico del sitio, los ingresos y las tasas de conversión. Con la ayuda de este complemento de envío gratuito, los administradores de la tienda pueden definir las pautas y condiciones para los costos de envío. Aún mejor, el administrador de la tienda puede agregar o eliminar esta función del sitio web.

Los minoristas en línea pueden establecer el umbral sobre el cual se ofrece el envío gratuito. Como resultado, incluso alienta a los clientes a realizar compras más grandes para calificar para el envío gratuito. Para obtener más información sobre la funcionalidad del Módulo de envío gratuito, no dude en contactarnos en support@knowband.com