Hace tiempo generamos esta consulta en los foros de Prestashop, dado que nos surgía un problema a la hora de generar un producto con cajas de 6 botellas, y solo podían venderse por cantidades de 6, o mejor dicho cajas de 6 unidades o múltiplos del mismo.
Hoy nos ha vuelto a ocurrir el problema y para ello, vamos a postear aquí la solución así como en enlace al foro:
Agregar el siguiente código en el processChangeProductInCart() del fichero CartController.php
(Ubicación del fichero CartController.php – www/controllers/front)
// Cantidad minima por producto if ((int)$this->id_product_attribute) $minimal_quantity = Attribute::getAttributeMinimalQty($this->id_product_attribute); else $minimal_quantity = $product->minimal_quantity; if ($this->qty % $minimal_quantity != 0) { $this->errors[] = Tools::displayError('You can only only add this item to your cart with a quantity multiple of ').' '.$minimal_quantity; } // fin Cantidad minima por producto
Este código debe insertarse después de la linea:
// If no errors, process product addition if (!$this->errors && $mode == 'add') {
Y antes de la linea:
// Add cart if no cart found if (!$this->context->cart->id) {
Comentar que esto solo afecta a productos con cantidades mínimas, es decir, si un producto marcamos como cantidad minima 6, deberá ir en múltiplos de 6, 12, 18, 24… si lo marcamos con cantidad 10, mas de lo mismo… Funciona correctamente. Lo podéis ver en ardoaonline.com, la mejor tienda de vinos online en España.
Si te ha molado la info, o quieres darnos las gracias por la info que tanto nos costo encontrar, déjanos un comentario o algo!
Esta solución se la debemos a martinjean el cual dejo su respuesta en el foro aquí
Actualización 28/5/2019:
Gracias al aporte de Humberto Albarrán, documentamos una nueva opción:
Señores, he probado en PS 1.7.4.4 y funciona perfectamente todo. Pero no fue fácil configurar todo. Les explico. Ya encontré la solución a los múltiplos.
- Primero agregué el código de este artículo en raiz/controllers/front/CartController.php (en la línea 439) Justo después de «if (!$this->errors) {»
- Me aseguré de que el código funcionaba, si. Pero al darle click a las fechas para agregar más cantidad de unidades del mismo artículo no respetaba los múltiplos (sumar o restar de docena en docena por ejemplo).
- Edité el archivo raiz/themes/TUTHEME/assets/js/theme.js (por desgracia en mi theme, estaba minificado y lo tuve que desminificar para poder entenderlo).
- Una vez desminificado, ubique la sección del código que manejaba el «touchspin-up y touchspin-down» de la página y lo hallé entre las líneas 5513 y 5523. (son los pequeños iconos que en mi theme se emplean para sumar o restar cantidad de unidades de un artículo). Otros themes usan los glyphicon-plus y glyphicon-minus.
- Al ver el código pude observar que indica cuánto debe ser la cantidad mínima de artículo (min), y cuánto debe ser la cantidad máxima (max), pero no tiene nada de cómo debe incrementarse cada que vez que hagamos el evento: click en estos íconos. Y fue eso lo que agregué, agregué una línea que le indicara cómo debía ser ese incremento.
- Entre las lineas MIN(5521) y MAX(5523) agregué step: parseInt(e.attr(«min»), 10),
- Simplemente le dije que cada vez que ejecute un incremento, lo haga en una cantidad que sea igual a la cantidad mínima. Eso resuelve el tema de los múltiplos, de los packs, de las docenas, y de paquetes de 50.
- Espero haber sido suficientemente explicativo y que a todos les pueda servir.
Gracias a Humberto por el aporte.
52 Comentarios. Dejar nuevo
Hola, con un producto con atributos, por qué me sale este error?
Error
Class ‘Attribute’ not found
in file /controllers/front/CartController.php at line 211
// If no errors, process product addition
206: if (!$this->errors && $mode == ‘add’) {
207:
208:// Cantidad minima por producto
209:
210: if ((int)$this->id_product_attribute)
211: $minimal_quantity = Attribute::getAttributeMinimalQty($this->id_product_attribute);
212: else
213: $minimal_quantity = $product->minimal_quantity;
214: if (($minimal_quantity>1) && ($this->qty % $minimal_quantity != 0))
215: {
216: $this->errors[] = Tools::displayError(‘Solo puede agregar este artículo a su carrito con una cantidad multiple de ‘).’ ‘.$minimal_quantity;
217: }
218:// fin Cantidad minima por producto
219:
220: // Add cart if no cart found
221: if (!$this->context->cart->id) {
Buenas, me ha valido el código, mi único problema es el carrito de la compra que si permite en mi caso añadir de 1 en uno en vez de 4 en 4 como en el producto (4 es la cantidad mínima), si agrego el step a mano en la función:
“ function r() {
a.default.each((0, a.default)(u), function(t, e) {
(0, a.default)(e).TouchSpin({
verticalbuttons: !0,
verticalupclass: “material-icons touchspin-up”,
verticaldownclass: “material-icons touchspin-down”,
buttondown_class: “btn btn-touchspin js-touchspin js-increase-product-quantity”,
buttonup_class: “btn btn-touchspin js-touchspin js-decrease-product-quantity”,
min: parseInt((0, a.default)(e).attr(“min”), 10),
step: 4,
max: 1e6
})
}), p.switchErrorStat()
}”
funciona bien, pero si al step le meto lo mismo que el min, no carga valores el input porque ese valor es NaN.
Alguien sabe cómo arreglar esto?
muchas gracias de antemano
Por si a alguien le sirve, lo he arreglado también para que funcione en el carrito de la compra.
En el archivo (cart-detailed-product-line.tpl) que está en (themes/tu tema/templates/checkout/_partials)
he añadido estas dos líneas [en mi caso por la línea 127 de código]:
– step=”{$product.minimal_quantity}”
– id=”quantity_wanted_cart”
quedando de la siguiente manera:
” ”
Y despues en el archivo (theme.js) que está en (themes/tu tema/assets/js) en la función que está en la linea 1811 en mi caso, he añadido estas 2 lineas:
– var quant = document.getElementById(“quantity_wanted_cart”);//by id
– step: quant.step,
Quedando la función de la siguiente manera:
” function r() {
var quant = document.getElementById(“quantity_wanted_cart”);//by id
a.default.each((0, a.default)(u), function(t, e) {
(0, a.default)(e).TouchSpin({
verticalbuttons: !0,
verticalupclass: “material-icons touchspin-up”,
verticaldownclass: “material-icons touchspin-down”,
buttondown_class: “btn btn-touchspin js-touchspin js-increase-product-quantity”,
buttonup_class: “btn btn-touchspin js-touchspin js-decrease-product-quantity”,
step: quant.step,
min: parseInt((0, a.default)(e).attr(“min”), 10),
max: 1e6
})
}), p.switchErrorStat()
}”
Con esto cuando abramos el carrito tiene que hacer los saltos según la cantidad mínima que tengamos puesto en el producto.
Esto de mi ultimo comentario solo funciona con 1 artículo en el carrito, con más de 1 no funciona.
En mi estructura de prestashop, la ruta “raiz/themes/TUTHEME/assets/js/theme.js” no dispongo de la carpeta assets, para poder modificar las contoles que suman y restan cantidad.
Puede ser que sea diferente versión, y ya no esté ahi ubicado… Es de una versión de hace 4 años…
Buenas. A mi me funciona correctamente desde el front-office, pero claro cuando meto el pedido desde el back-office, si me coge las unidades minimas, pero no los mltiplos de estas….
Donde se pondria el codigo para que aplique los multiplos desde el front-office.
Gracias.
Hola! Me funciona perfecto pero tengo un problema. Los productos que tengo cantidad mínima 1 (los que no quiero que se compren múltiples) no me deja comprarlos. En teoría con 1 se desactiva la opción de múltiple no? Me dice “Imposible añadir al carrito”.
Alguna idea?
Con cantidad minima 0*
Foto: Al poner cantidad minima en los que SI quiero mutliplos (esto funciona bien):
https://i.ibb.co/vVhNDPm/1.png
Foto: Al poner cantidad minima 1 en los que NO quiero multiplos (esto funciona mal):
https://i.ibb.co/RCWyLJC/2.png
Buenas, en prestashop 1.7.6 he pegado el código tal cual pero no me funciona. Me podrías ayudar? Gracias
Para la versión: 1.7.5.2 (19 de Julio 2019)
* como anotación para el archivo “theme.js”
Se hizo el des-minificado del archivo JS mencionado (Descomprimir el JS)
en mi caso me quedó el cambio en la línea:
2759: que comienza por: default)(“#quantity_wanted”);
Así que despues de la linea: 2765: que indica:
min: parseInt(t.attr(“min”), 10),
Lo que hice fue duplicarla y justo en la linea de abajo, cambie el “min: ” por un “step”
quedando así:
min: parseInt(t.attr(“min”), 10),
step: parseInt(t.attr(“min”), 10),
la diferencia del código mostrado para la versión anterior, con esta, radíca en que se cambió el nombre de la variable “e” por “t”, la razón es lógica, hay una función que usa el parámetro “t”.
Cualquier duda, solo con esta parte, con gusto les ayudo.
Señores, he probado en PS 1.7.4.4 y funciona perfectamente todo. Pero no fue fácil configurar todo. Les explico. Ya encontré la solución a los múltiplos.
1. Primero agregué el código de este artículo en raiz/controllers/front/CartController.php (en la línea 439) Justo después de “if (!$this->errors) {”
2. Me aseguré de que el código funcionaba, si. Pero al darle click a las fechas para agregar más cantidad de unidades del mismo artículo no respetaba los múltiplos (sumar o restar de docena en docena por ejemplo).
3. Edité el archivo raiz/themes/TUTHEME/assets/js/theme.js (por desgracia en mi theme, estaba minificado y lo tuve que desminificar para poder entenderlo).
4. Una vez desminificado, ubique la sección del código que manejaba el “touchspin-up y touchspin-down” de la página y lo hallé entre las líneas 5513 y 5523. (son los pequeños iconos que en mi theme se emplean para sumar o restar cantidad de unidades de un artículo). Otros themes usan los glyphicon-plus y glyphicon-minus.
5. Al ver el código pude observar que indica cuánto debe ser la cantidad mínima de artículo (min), y cuánto debe ser la cantidad máxima (max), pero no tiene nada de cómo debe incrementarse cada que vez que hagamos el evento: click en estos íconos. Y fue eso lo que agregué, agregué una línea que le indicara cómo debía ser ese incremento.
6. Entre las lineas MIN(5521) y MAX(5523) agregué step: parseInt(e.attr(“min”), 10),
7. Simplemente le dije que cada vez que ejecute un incremento, lo haga en una cantidad que sea igual a la cantidad mínima. Eso resuelve el tema de los múltiplos, de los packs, de las docenas, y de paquetes de 50.
8. Espero haber sido suficientemente explicativo y que a todos les pueda servir.
Desde Caracas-Venezuela, un fuerte abrazo para todos.
Muchas gracias por tu aporte, lo añadimos a la entrada!
Hola Humberto,
gracias por el código, funciona perfectamente en la pagina de detalle de un producto.
El problema viene en la página del carrito. En esta página los botones de sumar o restar no realizan bien su función. Si un producto tiene una cantidad mínima de 6, al pulsar el touchspin-up la caja se queda como estaba y no aumenta, aunque en la zona de la derecha donde se indica el detalle si que aumenta 1 unidad.
Sabes como se podría solucionar?
Buenas ahora estoy en prestashop 1.7.4 y no me funciona. Me aparece
// If no errors, process product addition
if (!$this->errors) {
sale diferente. A ver si tenéis una solucion a esto
Gracias
Con la version 1.6.1.18 , tambien deberia de funcionar este codigo no ?
Buenas Miguel, nosotros lo tenemos probado sobre 1.6.0.13, aunque hay ciertos comentarios que aseguran que funciona en 1.7.3.0…
He probado a ponerlo , como esta el codigo , y borrando todas las caches de la pagina pero se queda igual .
Hola, para implementar este código en Prestashop 1.7 sería muy diferente? Que debería hacer para que funcione?? Gracias.
Buenas Juan, a día de hoy no lo hemos probado…. nos imaginamos que no debería de variar mucho el código. Puedes intentarlo con este mismo, o esperar a que lo publiquemos.
Gracias de antemano.
Estimados muchas gracias por buscar una solución a este dilema. Me gustaría saber si habéis probado en Prestashop 1.6.
Un cordial saludo
Buenas Dani, la ultima notificación que tenemos es que sobre funcionaba correctamente sobre PS 1.6.0.13.
Así que puedes probar sin problema.
Juan y Ander R.M. Os confirmo que funciona perfecto en 1.7.3.0
Lo suyo sería encontrar la forma de que la cantidad mínima fuera cambiando en sus múltiplos al darle al + o al – cuando añadimos un producto.
He visto módulos de pago que lo hacen pero seguramente se pueda resolver con una modificación similar a ésta.
¿Alguien sabe algo de esto?.
Buenas, desgraciadamente, lo que estás viendo actualmente ya no es un Prestashop, es un WordPress con Woocommerce…
Era mucho más sencillo para este tipo de necesidades, y nuestra gestión diaria, así que decidimos cambiar de plataforma… Encontramos esa “pequeña” solución en PS que tampoco nos convence pero algo es algo… En WordPress es mucho más fácil gestionar por múltiplos, además de manera nativa. Entiendo que PrestaShop habrá tenido que mejorar algo…
Un saludo.
Ok gracias Ander R.M. , ya he encontrado un módulo para poder hacer esto. Me quedo con las ganas de poder hacerlo gratis jeje.
Buenas tardes.
Gracias por la ayuda.
Creo que he pegado el código donde corresponde y aún así , mis productos con cantidad mínima siguen añadiéndose al caro de 1 en 1.
Mi versión de prestashop es la 1.6.1.10
Soy muy nuevo en ps, igual pregunto alguna tontería pero, ¿Al actualizar el archivo CartController en el ftp con el código nuevo, el cambio tendría que verse inmediatamente? ¿o hay que regenerar algo en prestashop, o limpiar alguna caché?
Si funcionase tal cual se describe en el artículo, me solucionaría muchísimos problemas que tengo ahora mismo en la tienda…
Quedo a la espera, un saludo.
Buenas Luis, en principio debería verse inmediatamente, pero a tener en cuenta 2 cosas:
1.- Limpiar siempre la caché del navegador que estés usando.
2.- Limpiar toda la caché que haya podido generar tu PrestaSHop
Desde el backend de prestashop, Parámetros Avanzados => Rendimiento, en la parte inferior puedes habilitar o deshabilitar la cache de prestashop, o incluso en la parte superior derecha: “Vaciar el caché o cookies permanentes”.
Te sugiero que si estas aún trabajando en tu sitio mantengas desactivado esta opcion, sólo actívala en tu sitio en producción.
Buenas tardes, y gracias por el aporte. Veo que en la web ardoaonline.com os funciona de maravilla. ¿Qué versión de prestashop estáis utilizando 1.5 o 1.6?
Gracias y un saludo.
Buenas josecont, Este articulo es algo antiguo, y la web de ardoaonline.com la migramos a WordPress hace cosa como de una año.. De todas formas, la versión en la que lo teníamos probado era la de Prestashop 1.5.6
Hola,
cuando estas en el carrito(resumen) donde seria y que funcion para que realice los incrementos de cantidad en lugar del tipico +1 -1 en funcion de la cantidad minima establecida por producto.
Ej: botellas cant.minima : 6
cantidad suba en incrementos de 6 mas : 6 / 12 /…
Hola,
que ficheros y funciones debo modificar para que realice los incrementos de cantidad en lugar del tipico +1 -1 en funcion de la cantidad minima establecida por producto.
Ej: botellas cant.minima : 6
cantidad suba en incrementos de 6 mas : 6 / 12 /…
Buenas Pepe, la ubicación en (Prestashop 1.5.6) es:
(Ubicación del fichero CartController.php – www/controllers/front)
Disculpa pero queria decir cuando estas en el carrito(resumen) donde seria y que funcion para que realice los incrementos de cantidad en lugar del tipico +1 -1 en funcion de la cantidad minima establecida por producto.
Muito obrigado pela dica! Já estou usando!
Thanks to tip! Using already! Best regards;
Buenas tardes, tengo un modulo que me muestra todos los atributos en una tabla y me permite agregar las cantidades de cada uno que quiera de una vez. Mi pregunta es con ese codigo como puedo limitar para que el total de atributos agregar sea minimo 4 o multiplo de 4?, pero no de un solo valor, sino 4 entre todos los valores.
Seria de gran ayuda. Gracias
Buenas Juan, seria cuestión de probarlo. Este código esta probado con prestashop 1.6, no sabemos como reaccionara con la versión actual, ni con los módulos que tu tengas instalados ajenos a prestashop.
Hola a todos,
Ya se que este post tiene algo de tiempo pero buscando una solucion a lo mismo lo he estado en vuestra tienda online y he elegido un producto, concretamente la ref. RIO-CON-GR-2009 cuya cantidad mínima son 6 unidades y al pulsar sobre el “+” la cantidad no sube a 12 sino a 7.
La cosa es que he probado el codigo en mi tienda online de material de oficina y no hacia nada.
Quisiera saber si pudisteis resolverlo finalmente y como quedó el codigo. Yo uso la version 1.6.0.14
muchas gracias y hasta pronto
Buenas Miguel Angel, debido a la nueva actualización mas reciente de Prestashop, ahora mismo no tenemos el código implantado, pero hasta ese momento funciono perfectamente. En unos dias, haremos de nuevo la implantación del código y te notificaremos de si sigue funcionando en la version 1.6.0.14
Gracias por el comentario.
Hola,
tenemos instalada la versión 1.6.1.1 de Prestashop. Copiando este código, no acaba de funcionar del todo bien, ya que no sale ningún error si seleccionas 7, 8, 9, 10 u 11. Vais a actualizar el código para que funcione en 1.6.1.1?
Muchas gracias!
Buenas, el código realmente no es nuestro, pero en cuanto lo revisemos lo publicaremos de nuevo.
Gracias por el comentario!
PERFECTO! Lo he probado en la versión 1.6 y me ha funcionado!!!
Hola, Me puedes mostrar como queda el código completo, para ver lo que estoy haciendo de errado.. gracias
Genial!!
(casi) justo lo qu estoy buscando :-)))
Una pregunta… por lo que veo, lo que hace esta modificación es avisar al comprador que es necesario añadir un múltiplo de la cantidad mínima. Si, por ejemplo, añades tu cantidad mínima es “2” y añades 3 el combo queda señalado en rojo… y si aún así le das “Añadir al carrito” aparece este modal: “You can only only add this item to your cart with a quantity multiple of 2”
Mi pregunta es doble… ¿es posible que ese mensaje aparezca en lugar de “La cantidad mínima en el pedido de compra para el producto es X” cuando le das al “+” de Cantidad? Y la otra pregunta (la del millón)… Sería genial que sumara directamente la cantidad superior… Es decir, si la cantidad mínima para ese producto es “2” y pulso en el “+”, automáticamente se me añadieran “4”.
¿Por qué te comento esto último? Nuestro cliente vende material químicos y los incrementos van en cantidades un poco raras… Por ejemplo de “1,23 gramos”… Es difícil que el cliente caiga que en lugar de poner “2” gramos tiene que buscar “2,46 gramos”. Lo ideal es que si selecciona “+” a partir de la primera cantidad, se le sumara directamente “2,46”… No sé si me explico?
Anyway… MUCHÍSIMAS GRACIAS POR EL TIEMPO DEDICADO!!!
Saludos!
Buenas Jordi, en primer lugar, gracias por tu comentario. Respecto a tus 2 consultas, no te podemos resolver ninguna puesto que esta momificación de código, es algo sencillo y rápido para, en nuestro caso, generar automáticamente con la función de cantidad mínimas, múltiplos de X. Nuestros problema vino en nuestra web de venta de vino online: ardoaonline.com, cuando queriamos meter cantidades de cajas de 6 botellas, y queriamos automatizarlo, y notificar al cliente de las variables del producto. Entendemos perfectamente tus 2 consultas y son totalmente lógicas, pero tanto no tenemos controlado.
No obstante tu segunda consulta, en su día ya lanzamos tal petición a Prestashop, por lo que esperamos que en cierto tiempo quede resuelta.
Gracias por tu visita.
Hola Ander, Me puedes mostrar como queda el código completo, para ver lo que estoy haciendo de errado.. gracias
Buenas Hélder. Me temo que este código funcionaba con Prestashop 1.5.6, y ya no con versiones mas modernas. De todas formas, por lo que he leído en otro mensaje, como bien te comenta el POP UP, con este código te limita a introducir multiples de 6 en el carro (6, 12, 18 etc), nada mas. De ser así, te funciona correctamente.
Hola, estoy empezando la web y el codigo me viene perfecto, aunq por alguna extraña razón no lo añado bien. He localizado la función processChangeProductInCart() y añado el código dentro, el problema creo que me viene el problema creo que me viene al insertar el codigo despues de la linea y antes
¿lo que quieres decir es insertar el código una vez acaba la función y antes de empezarla? Un saludo y gracias
Buenas Manu, tienes que pegar exactamente ese código dentro de la función processChangeProductInCart(), del fichero CartController.php exactamente como comentamos en el post:
Este código debe insertarse después de la linea:
// If no errors, process product addition
if (!$this->errors && $mode == ‘add’)
{
Y antes de la linea:
// Add cart if no cart found
if (!$this->context->cart->id)
{
Entre esas 2 lineas, que vienen por defecto, es donde debes pegar el código.
Coméntanos por si tienes algún problema.
Me viene genial esta aportación, sólo comentar que la cantidad mínima es un atributo predeterminado o hay que crearlo. De ser así como sería? 😉 Gracias
Buenas Juanma, la cantidad minima es un atributo por defecto en una de las opciones de producto de Prestashop. La encontraras dentro de la gestión del producto. EN este caso usamos esa funcionalidad para hacer múltiplos, dado que nosotros la usamos en un ecommerce de vinos, y las cajas son de 6 botellas.
Gracias por tu comentario.
muchas gracias por la rapidez en la respuesta