Virtuemart

VirtueMart es componente de Joomla que nos da una solución de e-comercio. Ambos tiene la Licencia Pública General de GNU, por lo que son libres para su descarga, uso y modificación.
Te puedes descargar la ultima versión en su pagina oficial de virtuemart. Este paquete contiene 3 componente comprimidos, estos los tienes que instalar de forma independiente cada uno como cualquier otro componente de Joomla :
- CORE: El codigo del componente.
- AIO ( All in one): " Todo en uno" es decir plugins y modules de todo tipo para el componente (formas envío,formas de pago,....)
- TPDF : Librería que utiliza virtuemart para generar los pdf.
Tiene una web para la documentación muy amplia, tiene un foro que alimenta la comunidad de Virtuemart ademas de hacer soporte, tiene una API para hacer extensiones o plugins para interactuar con Virtuemart. Está traduccida a un mogollon de idiomas con sus paquetes, por supuesto tienes el paquete en español, a demas puedes participar en esas traducciones en transifex.
También podrías ver los cambios y como va el proyecto en el repositorio SVN.
Virtuemart fue la primera solución que convierta en un e-comerce tu Joomla, ambos fueron de la mano desde sus inicios, hoy en día, ya existen muchos mas componentes de Joomla que crean una tienda on-line y seguro que muy buenas, aunque nosotros seguimos siendo fieles a VIRTUEMART, el motivo principal es que lo conocemos su funcionamiento casi a la perfección.
- Andres Cordeiro
- Virtuemart
Descripción del problema
Hace unos días detectamos un error puntual en una web de comercio electrónico basada en Joomla + VirtueMart. Al acceder a determinados productos desde el frontend, la página dejaba de cargarse y mostraba el siguiente mensaje:
0 Division by zero
El problema apareció justo después de una migración de servidor, lo que inicialmente nos llevó a pensar en un fallo de configuración, compatibilidad de versiones o estructura de categorías.
Proceso de análisis
El primer paso fue comprobar los elementos más evidentes:
- Verificación de categorías y subcategorías.
- Reasignación de productos a sus categorías correspondientes.
- Comprobación de menús y enlaces.
Sin embargo, el error persistía. Además, no solo se producía en el frontend: al acceder al administrador de VirtueMart y filtrar productos hasta llegar a la categoría afectada, el error volvía a aparecer exactamente igual.
Esto nos indicó que no se trataba de un problema de plantilla o vista, sino de algo más profundo, probablemente asociado a los propios datos del producto.
Para obtener mensajes de error más detallados, decidimos reproducir el entorno en una instalación local con una configuración menos restrictiva. Fue entonces cuando, al acceder a la misma categoría desde el administrador, apareció un mensaje mucho más revelador:
vmError: Img2Thumb NewImgCreate with imagecreatefromstring failed
Este error apuntaba directamente al sistema de creación de miniaturas (thumbnails) de VirtueMart.
Causa del problema
VirtueMart genera automáticamente miniaturas de las imágenes de producto utilizando librerías gráficas de PHP. Para ello, solo admite determinados formatos de imagen correctamente codificados.
En este caso, uno de los productos tenía asociada una imagen con una extensión válida a simple vista, pero que internamente no era procesable por el sistema de redimensionado. Al no poder obtener correctamente sus dimensiones, VirtueMart acababa realizando un cálculo inválido que desembocaba en un error de tipo división por cero.
Este comportamiento se manifestó de forma crítica en producción debido a un entorno PHP más estricto tras la migración, mientras que en local el sistema mostraba un error más descriptivo.
Solución aplicada
Para resolver el problema de forma segura, seguimos los siguientes pasos:
-
Desactivar temporalmente la creación automática de miniaturas Desde la configuración de VirtueMart, deshabilitamos la opción de redimensión dinámica de miniaturas dentro de la sección de archivos multimedia.
-
Corrección del producto afectado Accedimos al producto problemático, eliminamos la imagen asociada y guardamos los cambios. A continuación, subimos una nueva imagen válida y correctamente generada.
-
Reactivar la creación automática de miniaturas Una vez sustituida la imagen, volvimos a habilitar la generación automática de miniaturas.
Tras estos pasos, el error desapareció tanto en el frontend como en el backend.
Medidas preventivas
El tratamiento de imágenes en VirtueMart puede resultar especialmente delicado, sobre todo cuando las imágenes proceden de catálogos externos o proveedores.
Para evitar incidencias similares en el futuro, utilizamos un proceso automatizado de normalización de imágenes mediante scripts que:
- Reconvierte todas las imágenes a un formato estándar compatible.
- Garantiza una codificación correcta.
- Ajusta dimensiones y optimiza peso.
De este modo, todas las imágenes cumplen los requisitos necesarios antes de ser importadas al gestor de contenidos.
Conclusión
Aunque el error apareció tras una migración de servidor, la causa real no estaba en la infraestructura ni en la configuración de VirtueMart, sino en una imagen inválida que provocaba un fallo durante la generación de miniaturas.
La clave para resolver el problema fue reproducir el error en un entorno local y obtener mensajes más detallados. Una vez identificada la causa, la solución resultó sencilla.
Este tipo de incidencias pone de manifiesto la importancia de validar y estandarizar los recursos multimedia en plataformas de comercio electrónico para evitar errores difíciles de rastrear en producción.
Si recibes un email de tu web que en el asunto "Error con su forma de pago paypal en su tienda online" y en el body del email pone:
"Hola,
Error con su forma de pago paypal en su tienda Online. Los detalles están logueados en el archivo paypal.2.log.php
El equipo de VirtueMart"
No te asustes, es un error que se produjo en Pay Pal, en el archivo que indica, podras ver que tipo error fue.
Ahora voy tratar el siguiente error os indico que le apareció a varios clientes que les llevamos el mantenimiento web.
"ERROR checkPaypalIps: Error with REMOTE IP ADDRESS "
The remote address of the script posting to this notify script does not match a valid PayPal IP address
Si a ti, te aparece otro error no dudes en ponerte en contacto con nosotros y te lo estudiamos.
La intención con este post es ir anotando las errores que vamos encontrando para ello vamos diferencias cuando lo tenemos instalado en joomla 3.10.11 o en joomla 4.2.3, ya que hay errores diferentes en ambos.
Virtuemart 4.0.6.10690
- No encuentra en productos con la Ñ, en las versiones anteriores si lo hacía.
Busque cual era el error y encontré que en la clase de producto /administrator/components/com_virtuemart/models/product.php en la linea 454 tenía un filtro de string con el siguiente código:
$keyword = vRequest::filter(html_entity_decode($keyword, ENT_QUOTES, "UTF-8"),FILTER_SANITIZE_FULL_SPECIAL_CHARS,FILTER_FLAG_ENCODE_LOW);
Si lo sustituimos por uno menos estricto, por este:
$keyword = vRequest::filter(html_entity_decode($keyword, ENT_QUOTES, "UTF-8"),FILTER_SANITIZE_SPECIAL_CHARS,FILTER_FLAG_ENCODE_LOW);
Pues funciona , perfectamente.
El caso es que cuando fui ver si le podía mandar un issue a los creadores, me doy cuenta que en las nuevas versiones ya lo resolvieron, y lo cambiaron muchos mas ficheros, no me diera cuenta que fallaban también.
Llegué tarde :-)
Virtuemart genera json para metadatos en fichero sublayout/snippets.php
Nosotros nos encontramos con el dilema que nosotros redondeamos el precio a dos decimales, aunque en el metadatos ponemos todos los digitos, esto hace que google mechants nos rechace la ficha, ya que la web pone un precio y el metadato otro.
Para solicionarlo modificamos ese fichero en nuestra plantilla, redondeando el campo de precio : product->prices['salesPrice']
El codigo lo dejamos asi:
$description = str_replace('"','\"',htmlspecialchars(strip_tags($description)));
$PrecioFinal = number_format($product->prices['salesPrice'], 2, '.', ' '); // Precio ya con descuento..
?>.....
Hoy actualizando el servidor a php 8.0 , una web que tenía Joomla 3.10.2 a 3.10.6 , que tengo virtuemart 3.8.8 10472 , no me deja editar un producto de virtuemart.
Rompe en la parte administrativa con el siguiente error:
0 Missing format specifier at end of string
Call stack
# Function Location
1 () JROOT/administrator/components/com_virtuemart/helpers/vmtext.php:154
2 sprintf() JROOT/administrator/components/com_virtuemart/helpers/vmtext.php:154
3 vmText::sprintf() JROOT/administrator/components/com_virtuemart/views/product/tmpl/product_edit_customer.php:72
4 include() JROOT/libraries/src/MVC/View/HtmlView.php:701
5 Joomla\CMS\MVC\View\HtmlView->loadTemplate() JROOT/administrator/components/com_virtuemart/views/product/tmpl/product_edit_status.php:126
6 include() JROOT/libraries/src/MVC/View/HtmlView.php:701
7 Joomla\CMS\MVC\View\HtmlView->loadTemplate() JROOT/administrator/components/com_virtuemart/helpers/adminui.php:248
8 AdminUIHelper::buildTabs() JROOT/administrator/components/com_virtuemart/views/product/tmpl/product_edit.php:47
Os pongo pantallazo:
