Jump to content

[Solucionado] Integración de bases de datos (Importe CSV con medidas de producto)


Peibolvig

Recommended Posts

Hola,

 

Estoy tratando de integrar parte de una base de datos de una aplicación externa, con la base de datos de prestashop.

 

Principalmente la integración sería sólo de productos.

 

La idea es lanzar un script cada día que sincronice las bases de datos. Obviamente cada una tiene su estructura y la pregunta es.

 

Cómo me aconsejaríais hacer esto de forma automática?

 

Yo pensaba hacer "Inserts" en las tablas de producto, pero me estoy encontrando que hacer los Inserts a pelo es un problema, puesto que, a pesar de haber estado unas horas tratando de entender todos los lugares en los que se relacionan las tablas de producto entre si y demás, no me queda del todo claro qué datos serían imprescindibles, cuales no, y si me estoy dejando alguna relación importante por el camino.

 

Vi la opción que tiene prestashop de la importación de CSV, pero los campos que importa no son todos los que necesitaría, porque para producto no importa las medidas, según la lista de campos "importables".

Además, este tipo de importación no sabría cómo automatizarla.

 

 

Espero vuestra ayuda, que hasta ahora me ha sido muy valiosa.

 

 

Saludos!!

Edited by Peibolvig (see edit history)
Link to comment
Share on other sites

Indicarte que a la hora de importar un CSV desde el BO no tienes por qué insertar todos los campos. En cada uno tienes una opción para omitir esa columna y en la pantalla prefia a la visualización del CSV tienes los campos que requiere prestashop como obligatorios.

 

Aunque un insert que hagas directamente te permita obviar ciertos datos, sería bueno que validaras los campos como requiere prestashop porque sino puedes tener problemas una vez importados al intentar visualizarlos. Por ejemplo, introduce la fecha de creación del producto...en ocasiones da error al intentar modificarlo posteriormente desde el BO.

 

A partir de ahí, no deberías tener mayores problemas para hacer un insert.

Link to comment
Share on other sites

Hola,

 

Estoy tratando de integrar parte de una base de datos de una aplicación externa, con la base de datos de prestashop.

 

Principalmente la integración sería sólo de productos.

 

La idea es lanzar un script cada día que sincronice las bases de datos. Obviamente cada una tiene su estructura y la pregunta es.

 

Cómo me aconsejaríais hacer esto de forma automática?

 

Yo pensaba hacer "Inserts" en las tablas de producto, pero me estoy encontrando que hacer los Inserts a pelo es un problema, puesto que, a pesar de haber estado unas horas tratando de entender todos los lugares en los que se relacionan las tablas de producto entre si y demás, no me queda del todo claro qué datos serían imprescindibles, cuales no, y si me estoy dejando alguna relación importante por el camino.

 

Vi la opción que tiene prestashop de la importación de CSV, pero los campos que importa no son todos los que necesitaría, porque para producto no importa las medidas, según la lista de campos "importables".

Además, este tipo de importación no sabría cómo automatizarla.

 

 

Espero vuestra ayuda, que hasta ahora me ha sido muy valiosa.

 

 

Saludos!!

 

Por si te interesa un script de importación externo, mira este: http://www.mediafire.com/view/65evxlzxm8chda3/script_import.php

Link to comment
Share on other sites

Jesa:

El problema no es insertar todos los datos que me pide el CSV, si no que en los datos que importa desde CSV no incluye datos que me interesa importar, como son ancho, alto y profundidad del producto.

 

Sergio Ruiz:

No es exactamente lo que me hace falta, por la razón que le comento a Jesa, no puedo importar todos los campos de producto en los que estaría interesado usando la importación CSV, pero es interesante. Podría llegar a darle uso (si no para esto de ahora, si quizás en el futuro)

 

Gracias por la ayuda a ambos :)

 

Saludos!

Edited by Peibolvig (see edit history)
Link to comment
Share on other sites

Hola,

 

Estoy tratando de integrar parte de una base de datos de una aplicación externa, con la base de datos de prestashop.

 

Principalmente la integración sería sólo de productos.

 

La idea es lanzar un script cada día que sincronice las bases de datos. Obviamente cada una tiene su estructura y la pregunta es.

 

Cómo me aconsejaríais hacer esto de forma automática?

 

Yo pensaba hacer "Inserts" en las tablas de producto, pero me estoy encontrando que hacer los Inserts a pelo es un problema, puesto que, a pesar de haber estado unas horas tratando de entender todos los lugares en los que se relacionan las tablas de producto entre si y demás, no me queda del todo claro qué datos serían imprescindibles, cuales no, y si me estoy dejando alguna relación importante por el camino.

 

Vi la opción que tiene prestashop de la importación de CSV, pero los campos que importa no son todos los que necesitaría, porque para producto no importa las medidas, según la lista de campos "importables".

Además, este tipo de importación no sabría cómo automatizarla.

 

 

Espero vuestra ayuda, que hasta ahora me ha sido muy valiosa.

 

 

Saludos!!

 

Si quieres saber la estructura de la base de datos en Prestashop, tienes este mapa: http://doc.prestasho...65853000&api=v2 (Que tambien puedes obtener dentro del directorio /docs/dev/)

Edited by Sergio Ruiz (see edit history)
Link to comment
Share on other sites

Si, estuve echándole un ojo a la base de datos (usando el workbench), gracias por el documento igualmente.

Quizás puedo hacer la sincronización en dos pasos... primero rellenar todos los datos posibles con el importador y luego completar con consultas SQL los datos que me falten, pero me gustaría poder hacer todo en un solo paso.

 

Alguna sugerencia?

 

Podría tratar de hacer una copia del controlador AdminImportController y modificarlo para hacer los Inserts que me falten.

Si alguien me pudiera pasar alguna sugerencia de cómo llevar a cabo la modificación se lo agradecería mucho.

Link to comment
Share on other sites

Yo siempre digo que lo mejor es entender en la medida de lo posible como hace el import prestashop con los CSV y a partir de ahí montar nuestro propio import mediante un script o modificando esa clase.

En tu caso si lo vas a hacer con CSV quizás te sea más sencillo modifcar lo que ya está y simplemente añadir los campos que te faltan. En el constructor de la clase tienes para definir los campos para cada entidad. Supongo que algo más tendrás que hacer después en el método productImport() pero posiblemente sea la forma más rápida y sencilla de hacerlo.

Link to comment
Share on other sites

Si, yo siempre procuro comprender cómo hace la funcionalidad la propia arquitectura, pero antes trato de buscar mucha información y si alguien lo hizo antes.

En este caso encontré gente que tiene la misma "duda" que yo, pero no encontré una implementación que haya hecho alguien, así que me toca ponerme (y espero poder compartirla por aquí, para devolver la ayuda prestada, pero aún tengo pendiente documentar la solución de otro post que escribí hace unas semanas... se me acumula el trabajo,...)

 

Bueno, voy a ponerme con esto a ver si consigo algo.

No llevo mucho tiempo con prestashop y me cuesta comprender algunas cosas.

 

Gracias por la ayuda!

Link to comment
Share on other sites

Hola,

 

Yo pensaba hacer "Inserts" en las tablas de producto, pero me estoy encontrando que hacer los Inserts a pelo es un problema, puesto que, a pesar de haber estado unas horas tratando de entender todos los lugares en los que se relacionan las tablas de producto entre si y demás, no me queda del todo claro qué datos serían imprescindibles, cuales no, y si me estoy dejando alguna relación importante por el camino.

 

 

Si no es fácil. Si te fijas en la documentación http://doc.prestasho...ore+development se sigue un patrón Active Record así que en la variable $definition se define el Modelo de datos, con lo que al hacer un $prod=new Product() (el objeto estrella de Prestashop :D ) rellenar esa definición y hacer un $prod.add() debería ser suficiente, pero si te fijas en el controlador que se ocupa de añadir el producto (AdminProductsController) a parte de el add() hace más cosas adicionales:

 

public function processAdd()
{
 $this->checkProduct();
 if (!empty($this->errors))
 {
  $this->display = 'add';
  return false;
 }
 $this->object = new $this->className();
 $this->_removeTaxFromEcotax();
 $this->copyFromPost($this->object, $this->table);
 if ($this->object->add())
 {
  $this->addCarriers();
  $this->updateAccessories($this->object);
  $this->updatePackItems($this->object);
  $this->updateDownloadProduct($this->object);

 

Nota: en el método copyFromPost se rellena el objeto con la info enviada en el formulario.

 

A falta de un absoluto conocimiento del modelo de datos de Prestashop la opción mas sensata (no la mas eficiente) es usar un script que utilize la Api orientada a objetos de "alto nivel".

 

Tengo pendiente mirar si existe alguna herramienta para poder comparar la base de datos en dos puntos diferentes, es decir, foto1 de la base de datos, guardas un producto, foto2 de la base de datos y luego que te compare y te diga que diferencias existe, así te puedes hacer una idea real de como funciona el modelo de datos.

 

Saludos

Link to comment
Share on other sites

Hola Enrique,

 

Pues me parece una buena opción, y es una información que seguro que me viene bien para el futuro, porque lo había visto en su momento pero no me acababa de quedar clara la manera de proceder con los métodos de la clase producto, no sabía que sólo el método add() ya era más que suficiente para hacer la inserción. Muchas gracias!!

 

Al final, busqué un poco más y en estos mismos foros (en francés) encontré la solución para lo que planteaba, así que os pongo aquí el desarrollo (junto con el enlace del post original del que saqué la información).

Es una modificación pequeña, haciendo un override de la clase AdminImportController

 

La modificación para lo que yo buscaba basta con aplicarlo a producto, pero también se lo apliqué a las combinaciones tal como hacían en la fuente original.

 

Solución probada en la versión 1.5.4.1

 

1º Hacer una copia de: controllers/admin/AdminImportController.php en override/controllers/admin/AdminImportController.php

 

2º En el fichero recién copiado (el de override/controllers/admin), hacemos las siguientes modificaciones:

a. Para hacer el override de la clase.

Localizamos la linea:

class AdminImportControllerCore extends AdminController

Y la cambiamos por:

class AdminImportController extends AdminControllerCore

 

b. Para que al seleccionar "Declinaciones" (combinaciones) en el desplegable de la importación CSV, nos aparezcan estos campos también como campos "importables".

(Para la modificación que yo buscaba basta con aplicarlo a producto, pero al final también se lo apliqué a las combinaciones tal como hacían en la fuente original).

 

Localizamos el código:

case $this->entities[$this->l('Combinations')]:
$this->required_fields = array(
	'id_product',
	'group',
	'attribute'
);
$this->available_fields = array(
 'no' => array('label' => $this->l('Ignore this column')),
 .....
 'weight' => array('label' => $this->l('Impact on weight')),

Y justo debajo pegamos el siguiente código:

'height' => array('label' => $this->l('Height')),
'width' => array('label' => $this->l('Width')),
'depth' => array('label' => $this->l('Depth')),

Quedando la modificación así:

case $this->entities[$this->l('Combinations')]:
$this->required_fields = array(
	'id_product',
	'group',
	'attribute'
);
$this->available_fields = array(
 'no' => array('label' => $this->l('Ignore this column')),
 .....
 'weight' => array('label' => $this->l('Impact on weight')),
 'height' => array('label' => $this->l('Height')),
 'width' => array('label' => $this->l('Width')),
 'depth' => array('label' => $this->l('Depth')),

 

c. Para que por defecto los nuevos campos de las combinaciones tengan valor 0.

Localizamos el código un poco más abajo que el del anterior punto:

self::$default_values = array(
'reference' => '',
'supplier_reference' => '',
'ean13' => '',
'upc' => '',
'wholesale_price' => 0,
'price' => 0,
'ecotax' => 0,
'quantity' => 0,
'minimal_quantity' => 1,
'weight' => 0,
'default_on' => 0,
);

Y le añadimos, debajo de 'weight', las 3 lineas referentes a las medidas, quedando así:

self::$default_values = array(
'reference' => '',
'supplier_reference' => '',
'ean13' => '',
'upc' => '',
'wholesale_price' => 0,
'price' => 0,
'ecotax' => 0,
'quantity' => 0,
'minimal_quantity' => 1,
'weight' => 0,
'height' => 0,
'width' => 0,
'depth' => 0,
'default_on' => 0,
);

 

c) Por último, para añadirselo a la opción de importar Producto, y que en el desplegable de la importación CSV, nos aparezcan estos campos también como campos "importables".

Localizamos el código:

case $this->entities[$this->l('Products')]:
self::$validators['image'] = array(
 'AdminImportController',
 'split'
);
$this->available_fields = array(
 'no' => array('label' => $this->l('Ignore this column')),
 .....
 'weight' => array('label' => $this->l('Weight')),

Y justo debajo de weight, pegamos las 3 lineas de los parámetros que queremos añadir:

'height' => array('label' => $this->l('Height')),
'width' => array('label' => $this->l('Width')),
'depth' => array('label' => $this->l('Depth')),

Con lo que quedaría así:

case $this->entities[$this->l('Products')]:
self::$validators['image'] = array(
 'AdminImportController',
 'split'
);
$this->available_fields = array(
 'no' => array('label' => $this->l('Ignore this column')),
 .....
 'weight' => array('label' => $this->l('Weight')),
 'height' => array('label' => $this->l('Height')),
 'width' => array('label' => $this->l('Width')),
 'depth' => array('label' => $this->l('Depth')),

 

Con esos cambios, tenemos ya lista la posibilidad de importar desde CSV las medidas, tanto en productos como en combinaciones.

 

Adjunto el fichero entero ya modificado, que repito, es para la versión 1.5.4.1 ;)

 

El post original en francés, es este: http://www.prestasho...eur-profondeur/

 

Los campos en el fichero CSV ahora quedarán en este orden:

..... UPC Ecotasa Peso Alto Ancho Profundidad Cantidad Descripción breve .....

 

Adjunto un csv de ejemplo con todos los campos, probado y que funciona tras la modificación.

OJO: Como este foro no permite subir ficheros con extensión .csv lo renombré a .txt

Si lo queréis probar, tendréis que renombrarlo a .csv

 

Podría haberlo hecho de manera más sutil quizás, no lo sé, pero no puedo dedicarle más tiempo (por ahora) a este asunto, así que así es como quedará hasta que me pueda parar a analizar si se puede mejorar y hacer un override más específico, y no de toda la clase AdminImportController.

 

Sergio, al final es muy probable que utilice el script que me pasaste, muchas gracias ;)

 

 

 

Saludos y gracias a todos por las sugerencias.

AdminImportController.php

EjemploCSV_conMedidas.txt

  • Like 1
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...