Añadir nuevos campos en productos Virtuemart

Trabajando con joomla y virtuemart 1, son muchas las ocasiones a la hora de añadir productos en nuestra tienda online VirtueMart de Joomla, en las que deseariamos poder añadir nuevos campos como por ejemplo un número de registro para cada producto y NO* en los productos que añadimos en virtuemart.
En los foros de solojoomla ya han preguntado en algúna ocasion, por ejemplo para poder añadir una numeración que no fuese la que se incluye de forma automática en Virtuemart a un producto.
Buscando posibles soluciones a estas peticiones necesarias para muchos usuarios encontre una solución muy efectiva y bastante sencilla de implementar. Paso a redactar la solucion al castellano para un mejor entendimiento de los pasos a seguir…

*Tengo que precisar que esta opción no es para añadir tipos de productos, para eso ya esta la opción contemplada en el menu Productos de la administracion Virtuemart en “Añadir tipo de producto” Documentación .
El primer paso es hacer una copia de nuestros archivos y base de datos antes de ponernos a cambiar nada, como sabran, es fácil equivocarse en este tipo de tareas, asi que mas vale prevenir.
Una vez realizadas las copias pasaremos a crear en la tabla jos_virtuemart_products de (jos_vm_product en el caso de versiones antiguas de virtuemart) nuestra base de datos el nuevo campo que queremos añadir. Para poder añadir ese nuevo campo en la tabla utilizaremos el phpmyadmin desde nuestro panel de control, les resultara mas sencillo.

Crear nueva columna en base de datos para crear nuevo campo en productos

Una vez accedamos al phpmyadmin pincharemos en el nombre de nuestra base de datos y buscaremos la tabla jos_virtuemart_products.
Recordar que el prefijo jos_ no tiene porque ser el prefijo que ustedes tienen en los nombres de las tablas.
Es mas, cuando instalen su joomla por seguridad es conveniente cambiar ese prefijo por otro que solo usted conozca, les hara la vida algo mas dificil a quien intente fastidiarle.
Una vez localizada la tabla haremos clic en el nombre de la tabla y arriba en la pestaña Estructura, luego abajo del todo en Agregar o Añadir, dependiendo de la versión con la que trabajamos, seleccionamos donde lo vamos a situar y a continuar, que en este caso lo situaremos debajo del campo (Columna desde Phpmyadmin) SKU de virtuemart.
Añadir columna

Una vez que le hemos pinchado en continuar, vamos a pasar a darle un nombre y unas caracteristicas a nuestro campo situado debajo del campo SKU. Siguiendo las necesidades de las peticiones realizadas en el foro vamos a insertar un campo llamado “Mi Codigo” . En la siguiente pantalla que nos sera mostrada despues de pinchar en continuar, observaremos las distintas opciones como muestro en la siguiente imagen.

Insercion nombre campo y caracteristicas del mismo
Captura desde otra versión Phpmyadmin mas actual
Columna mysql

Campo / Nombre:
Ahi pondremos el nombre de nuestro campo, que en este caso sera mi_codigo , a recordar para las modificaciones en los archivos php.

Tipo:
VARCHAR es la abreviatura en castellano de Caracteres variados, pudiendo aplicar numero, letras… a nuestro codigo. Se puede aplicar otra forma, segun el campo que deseen añadir.

Longitud/Valores
:
Es el numero de caracteres permitidos

Cotejamiento:
El sistema de codificacion que vamos a utilizar

Nulo:
Señalando esa opcion, tendremos la opcion de dejar vacio el campo.

Auto increment
:
Señalando “Auto Increment”, cada vez que se agregue un registro aumentará en 1 el valor en el caso de ser numeracion.

Una vez rellenado pinchamos en GRABAR y ya tendremos mas o menos lista base de datos.

El siguiente paso son las modificaciones en los archivos php SOLO para Virtuemart 1.

En administrator/components/com_virtuemart/html/ editaremos el archivo product.product.form.php, bien desde nuestro cliente FTP o descargando el archivo a nuestro ordenador para luego una vez realizados los cambios actualizar el archivo, lo cual sera valido en ambos casos y para los demas archivos a modificar, parchear o hackear como lo quieran llamar.
Un editor gratuito excelente para editar codigos –> Notepad ++

Edición archivo product.product.form.php:

Busquen estas lineas de codigo en el archivo sobre la linea 217.

<tr class="row1">
 <td width="21%" >
 <div style="text-align:right;font-weight:bold;"><?php echo $VM_LANG->_('PHPSHOP_PRODUCT_FORM_SKU') ?>:</div>
 </td>
 <td width="79%">
 <input type="text" class="inputbox"  name="product_sku" value="<?php $db->sp("product_sku"); ?>" size="32" maxlength="64" />
 </td>
 </tr>

Justo despues de estas lineas añadan el siguiente código.

<tr class="row1"> 
 <td width="21%" ><div style="text-align:right;font-weight:bold;"><?php echo $VM_LANG->_('PHPSHOP_PRODUCT_FORM_MI_CODIGO') ?>:</div>
 </td>
 <td width="79%" height="2"> 
 <input type="text" class="inputbox"  name="mi_codigo" value="<?php $db->sp("mi_codigo"); ?>" size="32" maxlength="64" />
 </td>
 </tr>

Se entiende que donde he puesto mi_codigo es el nombre del campo añadido a la tabla de la base de datos con lo cual si han puesto otro nombre al campo añadido en la tabla de la base de datos deberan poner el mismo.

Para activar el campo actualizado en su base de datos en administrator/components/com_virtuemart/classes/ editen el archivo ps_product.php y en sobre la linea 275 como se muestra en el siguiente codigo:

 

// Insert into DB
$fields = array ( 'vendor_id' => $vendor_id,
 'product_parent_id' => vmRequest::getInt('product_parent_id'),
 'product_sku' => vmGet($d,'product_sku'),

Añadan justo despues el siguiente codigo:

'mi_codigo' => vmGet($d,'mi_codigo'),

Y en el mismo archivo sobre la linea 475 haremos el mismo cambio, podran visualizar la similitud del codigo.

Luego para ponerle un nombre al campo traducido al castellano (español) editaremos el archivo spanish.php situado en administrator/components/com_virtuemart/languages/product/ sobre la linea 50 como se muestra aqui

'PHPSHOP_PRODUCT_FORM_SKU' => 'SKU',

Añadiremos justo despues el siguiente codigo:

'PHPSHOP_PRODUCT_FORM_MI_CODIGO' => 'Mi Codigo',

O como lo quieran llamar.

Ahora vamos a incluir este nuevo campo para las busquedas que se realizen con el objetivo encontrar un producto por su codigo, que es este caso, pero que podria ser del tipo de campo que hayan decidido añadir. Para esa tarea deberemos editar el archivo product.product.list.php que esta en administrator/components/com_virtuemart/html/ y sobre la linea 73 como se muestra en el siguiente cofigo:
$search_sql .= "#__{vm}_product.product_sku LIKE '%$keyword%' OR \n";

Añadiremos justo despues el siguiente codigo:

$search_sql = " (#__{vm}_product.mi_codigo LIKE '%$keyword%' OR \n";

Y para finalizar este pequeño tutorial o parche para añadir campos a los productos de la extension virtuemart de Joomla, les voy a mostrar como realizar el añadido para que el nombre o numero que se le asigne a un producto no pueda ser duplicado.

Editaremos el archivo ps_product.php situado en administrator/components/com_virtuemart/classes/ y sobre la linea 42 veran el siguiente codigo.

 

$q = "SELECT product_id,product_thumb_image,product_full_image FROM #__{vm}_product WHERE product_sku='";
 $q .= $d["product_sku"] . "'";
 $db->setQuery($q); $db->query();
 if ($db->next_record()&&($db->f("product_id") != $d["product_id"])) {
 $vmLogger->err( "A Product with the SKU ".$d['product_sku']." already exists." );
 $valid = false;
 }

Justo despues deberan añadir el siguiente codigo:

$q = "SELECT product_id,product_thumb_image,product_full_image FROM #__{vm}_product WHERE mi_codigo='";
$q .= $d["mi_codigo"] . "'";
$db->setQuery($q); $db->query();
if ($db->next_record()&&($db->f("product_id") != $d["product_id"])) {
 $vmLogger->err( "Un producto con este codigo ".$d['mi_codigo']." ya existe." );
 $valid = false;
 }

Espero les sirva de ayuda, como siempre. Este hack esta en ingles en los foros de virtuemart, pero al ver que no explicaba claramente por ejemplo como añadir campos en una tabla o distintas opciones a tener en cuenta en el caso de querer añadir un campo diferente y todo en ingles considere oportuno realizar uno propio en castellano.

En Versiones Virtuemart 3 tenemos la opción de serie en Productos / Campos Personalizados.

15 comentarios en «Añadir nuevos campos en productos Virtuemart»

  1. ¿Y por qué no hacerlo como dice el manual en [url=http://virtuemart.net/documentation/User_Manual/Product_Types.html]4.6.5. Product Types Management[/url] que no requiere trastear con nada externo al web interface de VirtueMart? ¿O estamos hablando de cosas diferentes?

  2. Si y No. En el tutorial que redacte sobre virtuemart la opcion “[b]Añadir tipo de producto[/b]” Justamente aqui https://solojoomla.com/tutorial-virtuemart-en-espanol-para-joomla/4.html pongo “Proximamente” . Esta opcion es para [u]tipos de productos[/u]. Aqui se trata de añadir campos, no en los detalles de un producto. Aunque seguramente has hecho bien en decirmelo ya que puede conducir a error. Vere como precisar este punto. Gracias.

  3. Lo siento, sigo sin entender la diferencia. Lo que me parecía que decía el manual, es que si quieres añadir propiedades personalizadas a un producto, el modo es primero crear un tipo de producto nuevo, y luego crear dentro de éste nuevos parámetros (campos). Todo mediante el interface web.

    Es decir, uno crea el tipo de producto “camiseta”, y luego en éste, puedes añadir el campo “color” a la lista de los que ya te proporciona VirtueMart. Así los nuevos productos que crees, a los cuáles les asignes el tipo “camiseta” tendrán un campo “color” que el resto no tendrán.

  4. Ya hice la precison. Es simple, esto sirve para añadir campos por ejemplo una numeracion o codigo propio y no la que asigna por defecto virtuemart a cada producto, numeracion o nombre. En el caso de numeracion que pueda auto incrementarse de forma automatica. Esto no es posible con la opcion “Añadir tipos de producto” cuando se le añade un parametro al tipo de producto.

  5. Hola, he seguido este manual paso a paso porque queria añadir un campo de fecha de fabricacion a los productos y todo correcto excepto que no me acualiza la tabla, se queda siempre con el mismo valor por defecto, ¿he hecho algo mal?

  6. [quote name=”redlo”]En la opcion [b]Tipo[/b] ¿que has seleccionado?[/quote]
    Ya he conseguido que me actualice la tabla, no habia cambiado el nombre de campo en una linea, he puesto tipo VARCHAR de longitud 4 porque me interesa el año solamente, el problema que tengo ahora es que no me visualiza el campo en la lista de productos, si pongo cualquier otro campo me lo visualiza pero el nuevo no, he copiado incluso un campo de la tabla y le he cambiado el nombre, el tipo, null… todo pero no hay manera de que visualice este campo

  7. Si lo he entendido bien… Este es otro campo o el del año que querias añadir y por eso te preguntaba que habias seleccionado en Tipo, ya que tienes la posibilidad de incorporar alguna de las opciones DATE and TIME y no la de VARCHAR. De todas formas revisa bien los añadidos y modificaciones de los archivos php. Y si vas a utilizar una numeracion y quieres que se actualize debes selecionar la opcion AUTO INCREMENT en las caracteristicas del campo.

  8. A ver si logro explicarme que es algo que no se me da bien:
    Necesito un campo para introducir el año del articulo, le he llamado FECHA con una longitud de 4 y VARCHAR.
    Funciona todo correctamente, se visualiza en el apartado de añadir productos, se da de alta correctamente en la base de datos etc,etc.
    El problema lo tengo a la hora de visualizarlo, he modificado el template, añadido la cabecera pero no me visualiza este campo ¿¿?? la misma linea que he añadido la modifico cambiando solamente el nombre del campo para ver que si me he equivocado en el codigo y cambio el nombre por el del campo product_sku y si funciona, entonces no entiendo que pasa, he probado el tipo INT y el DATE y sigue igual

  9. Ha sido muy útil y muy fácil, gracias
    -¿Cómo puedo hacer para que se muestren los nuevos campos en el front?
    – A veces cuando introduzco los datos, le doy a guardar y al refrescar la página desaparecen

  10. Como Logro Hacer que se Muestre en el Front?
    Hola A Todos, Segui este tutorial y la verdad, como aqui lo explicas es muy facil y concreto, mis respetos, es excelente ya que lo logré hacer sin complicaciones, Muchas gracias !

    Pero como hago para que este campo que se ha dado de alta, o que se ha configurado, aparezca en el front?

  11. En VM 1.1.9
    Pues gracias por el esmero del post, pero me surgio duda, todo iba bien hasta lo que sigue de [b]Para activar el campo actualizado en su base de datos en administrator/components/com_virtuemart/classes/ editen el archivo ps_product.php y en sobre la linea 275 como se muestra en el siguiente codigo:[/b]
    no encuentro ninguna linea que se paresca a ‘[b]PHPSHOP_PRODUCT_FORM_SKU’ => ‘SKU’,[/b]
    posiblemente por que mi version de vm es 1.1.9
    Saludos

  12. Version virtuemart
    ¿Que version estas utilizando? Acabo de comprobarlo en la version 1.1.9 y ese codigo aparece tal como lo indican en este tutorial.

    [quote name=”yeyupa”]Pues gracias por el esmero del post, pero me surgio duda, todo iba bien hasta lo que sigue de [b]Para activar el campo actualizado en su base de datos en administrator/components/com_virtuemart/classes/ editen el archivo ps_product.php y en sobre la linea 275 como se muestra en el siguiente codigo:[/b]
    no encuentro ninguna linea que se paresca a ‘[b]PHPSHOP_PRODUCT_FORM_SKU’ => ‘SKU’,[/b]
    posiblemente por que mi version de vm es 1.1.9
    Saludos[/quote]

Deja un comentario

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de sus datos para estos propósitos. Ver
Privacidad