Jump to content

¿Como importar imágenes de productos a la BBDD?


Recommended Posts

Hola,

Hice un script para importar desde un xml a la bbdd de prestashop miles de productos.

Ahora necesito importar mediante un script o mediante la sentencia UPDATE, eso he pensado, las imágenes correspondientes para todos los productos que tengo ya en la bbdd.

Según he estado mirando prestashop crea una carpeta para cada producto en una posición concreta (2 22 222, por ejemplo) y luego crea imágenes de distintos tamaños.

¿Como puedo hacer para insertar las imágenes de los muchísimos productos que tengo?

 

Gracias!!

Link to comment
Share on other sites

Hola,

Hice un script para importar desde un xml a la bbdd de prestashop miles de productos.

Ahora necesito importar mediante un script o mediante la sentencia UPDATE, eso he pensado, las imágenes correspondientes para todos los productos que tengo ya en la bbdd.

Según he estado mirando prestashop crea una carpeta para cada producto en una posición concreta (2 22 222, por ejemplo) y luego crea imágenes de distintos tamaños.

¿Como puedo hacer para insertar las imágenes de los muchísimos productos que tengo?

 

Gracias!!

Desconozco como has desarrollado el Script, pero puedes fijarte en el fichero:

controllers/admin/AdminImportController.php

Saludos,

Link to comment
Share on other sites

Lo ideal es haber "traducido" el xml a un csv compatible con prestashop y usar el importador oficial.

 

Si te fijas en el código de importación oficial en

 

controllers\admin\AdminImportController.php

 if (isset($product->image) && is_array($product->image) && count($product->image)) {
                    $product_has_images = (bool)Image::getImages($this->context->language->id, (int)$product->id);
                    foreach ($product->image as $key => $url) {
                        $url = trim($url);
                        $error = false;
                        if (!empty($url)) {
                            $url = str_replace(' ', '%20', $url);

                            $image = new Image();
                            $image->id_product = (int)$product->id;
                            $image->position = Image::getHighestPosition($product->id) + 1;
                            $image->cover = (!$key && !$product_has_images) ? true : false;
                            // file_exists doesn't work with HTTP protocol
                            if (($field_error = $image->validateFields(UNFRIENDLY_ERROR, true)) === true &&
                                ($lang_field_error = $image->validateFieldsLang(UNFRIENDLY_ERROR, true)) === true && $image->add()) {
                                // associate image to selected shops
                                $image->associateTo($shops);
                                if (!AdminImportController::copyImg($product->id, $image->id, $url, 'products', !$regenerate)) {
                                    $image->delete();
                                    $this->warnings[] = sprintf(Tools::displayError('Error copying image: %s'), $url);
                                }
                            } else {
                                $error = true;
                            }
                        } else {
                            $error = true;
                        }

                        if ($error) {
                            $this->warnings[] = sprintf(Tools::displayError('Product #%1$d: the picture (%2$s) cannot be saved.'), $image->id_product, $url);
                        }
                    }
                }

se crea la imagen con la API de prestashop ($image->add()) y luego se usa AdminImportController::copyImg.

 

En AdminImportController::copyImg se  copia desde la url de origen a la carpeta de destino y se usa ImageManager::resize entre otras para regenerar las imágenes

Link to comment
Share on other sites

Si es algo que tienes que hacer una sola vez (una primera carga masiva) yo crearía un csv con el id de producto (o la referencia), el nombre (creo que es obligatorio) y la columna imagenes.

 

Esta columna son las urls de las imagenes separadas por comas (puedes ver un ejemplo en el panel de administración > importación).  De esta forma el importador oficial te creará todo ok, la BBDD, las carpetas en img/p copiara las imagenes y generará las miniaturas.

 

Si no, habría que llamar al código de prestashop del importador desde el script que hayas creado. En ambos casos debes tener las imagenes en una url accesible.

Link to comment
Share on other sites

Muchas gracias por la ayuda,

La verdad es que debería haber traducido el xml a un csv compatible Enrique, puedo subsanar ahora el error utilizando AdminImportController.php?

 

¿Donde debo subir las imágenes que tengo preparadas, en que carpeta? 

 

Gracias.

Las puedes subir a un directorio llamado "subirImagenes"  (lo he dicho por poner un nombre)" y luego colocas las urls/rutas de las imagenes cuando realices la importación, si preparas bien el importador, y usas las funciones que te da Prestashop, el se encargara luego de copiar esas imágenes a los directorios adecuados de /img/p para los productos, /img/c/ para las categorías, ect..

Link to comment
Share on other sites

:P Se adelanto Enrique en la respuesta (por menos de 1 minuto D))

 

En fin, que raro va el foro, que en los años que lleva el foro, nunca me han saltado bien las respuestas (cuando responden y luego respondo y me llevo la sorpresa de que ya habían respondido, en todo caso siempre es bueno colaborar)

 

Prueba lo comentado y recuerda que es importante usar lo que tienes de base de Prestashop y ir ampliando tu código en base a lo te ofrece Prestashop.

 

Suerte y ya nos cuentas.

Link to comment
Share on other sites

Hola Enrique y nadie.

Estoy creando un csv  de un solo producto para hacer la prueba con 3 columnas (id, name, image url) separadas por comas.

Cuando subo el archivo me dice 

2 errores 

  1. (ID: 1) no se puede guardar
  2. Property Product->name is not valid

El ID del producto es 1 y el nombre es el correcto del producto 1.

No entiendo ese error, ¿Que puede estar pasando?

Link to comment
Share on other sites

Ahora, haciendo lo mismo no me da error,

Me dice que tengo que reconstruir la búsqueda de los productos. ¿Que es eso?

 

thump_97356183.jpg

 

En principio ese error es para que las busquedas (del propio buscador de prestashop) te encuentre los productos cuando por ejemplo usas el buscador en la tienda, si vas a la pestaña Preferencias -> Buscar puedes reconstruir el indice.

Link to comment
Share on other sites

En principio ese error es para que las busquedas (del propio buscador de prestashop) te encuentre los productos cuando por ejemplo usas el buscador en la tienda, si vas a la pestaña Preferencias -> Buscar puedes reconstruir el indice.

Gracias nadie, ya he solucionado ese apartado.

Ahora no entiendo porque en el campo name me asigna la url de la importación si como he mostrado en las imágenes de antes la asignación de columnas la hago bien.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...