karpoj23 Posted May 1, 2020 Share Posted May 1, 2020 Buenas, estoy intentando importar productos y no tengo mucha idea de como importar las imagenes desde mi base de datos por lo que he planteado lo siguiente: - Crear el producto y con el product id informar ps_image_shop, ps_image y ps_image_lang. Ejemplo productid 51 - Creo que las carpetas por productos van en /img/p/5/1/51.jpg. Paso las imagenes desde mi servidor por FTP y moviendolas por PHP - Ahora lo que no se muy bien es crear los Thumbnails, he visto que sea hace un extends de AdminImagesControllerCore. Lo suyo seria llamar a esta funcion por cada imagen que suba. Como se puede usar esa funcion?? Es correcto mi planteamiento? o veis otra forma mejor de hacerlo? Muchas gracias chicos!! Link to comment Share on other sites More sharing options...
val_carter Posted May 10, 2020 Share Posted May 10, 2020 Hola karpoj, no llego a entender muy bien en qué marco planteas la pregunta? un script php?, si es así puedo ayudarte que he usado varios para importar ficheros csv. Un saludo. Link to comment Share on other sites More sharing options...
gusman126 Posted May 10, 2020 Share Posted May 10, 2020 Yo te recomiendo usar codigo PHP tanto para subir la imagen al FTP, asignar esa imagen al producto , de esa manera se generan las miniaturas $urlimg = $file; Puedes usar un fichero ya existente en el servidor o una URL de otra web, $url = str_replace(' ', '%20', trim($url)); , utiliza esto solo si es URL de otra web, si esta en tu servidor, dará error al no encontrar el fichero con %20 en vez de espacios $imgenesp = Image::getImagesTotal($id_product); if($imgenesp > 0){ $cover = 0; }else{ $cover = 1; } if($imagen){ $urlimg = $file; $image = new Image(); $image->id_product = $id_product; $image->position = Image::getHighestPosition($id_product) + 1; if (($image->validateFields(false, true)) === true && ($image->validateFieldsLang(false, true)) === true && $image->add()){ $copy = copyImg($id_product, $image->id, $urlimg, 'products', true); if (!$copy){ $image->delete(); return 0; }else{ $image->cover = $cover; $image->save(); echo '<br>Imagen Añadida!'; unlink($file); } } } function copyImg($id_entity, $id_image = null, $url, $entity = 'products'){ $tmpfile = tempnam(_PS_TMP_IMG_DIR_, 'ps_import'); $watermark_types = explode(',', Configuration::get('WATERMARK_TYPES')); $image_obj = new Image($id_image); $path = $image_obj->getPathForCreation(); $url = str_replace(' ', '%20', trim($url)); if (!ImageManager::checkImageMemoryLimit($url)){ return; } if (@copy($url, $tmpfile)){ ImageManager::resize($tmpfile, $path.'.jpg'); $images_types = ImageType::getImagesTypes($entity); foreach ($images_types as $image_type){ ImageManager::resize($tmpfile, $path.'-'.stripslashes($image_type['name']).'.jpg', $image_type['width'], $image_type['height']); if (in_array($image_type['id_image_type'], $watermark_types)){ Hook::exec('actionWatermark', array('id_image' => $id_image, 'id_product' => $id_entity)); } } }else{ unlink($tmpfile); return; } unlink($tmpfile); return true; } Link to comment Share on other sites More sharing options...
karpoj23 Posted May 10, 2020 Author Share Posted May 10, 2020 muchisimas gracias, voy a darle caña!! Link to comment Share on other sites More sharing options...
val_carter Posted May 10, 2020 Share Posted May 10, 2020 (edited) Si tienes los ids y las imágenes en un servidor o alcanzables con una url, si tus productos afectados no tienen imagen una solución más sencilla tal vez es generar un fichero csv que contenga únicamente la referencia o id del producto (o variación, según tu tienda) y el campo url de imágenes. De esta manera puedes cargarlos desde el back e incluso hacer pruebas con ficheros más sencillos y te generará las imágenes y todas sus tamaños. Pero el código de @gusman126 mola! me lo quedo que tal vez me sirva Un saludo. Edited May 10, 2020 by val_carter (see edit history) Link to comment Share on other sites More sharing options...
karpoj23 Posted May 10, 2020 Author Share Posted May 10, 2020 (edited) Al final, cuando importo un item subo la imagen a mano por PHP a la carpeta y una vez alli genero las miniaturas Edited May 10, 2020 by karpoj23 (see edit history) Link to comment Share on other sites More sharing options...
gusman126 Posted May 10, 2020 Share Posted May 10, 2020 hace 1 minuto, val_carter dijo: Si tienes los ids y las imágenes en un servidor o alcanzables con una url, si tus productos afectados no tienen imagen una solución más sencilla tal vez es generar un fichero csv que contenga únicamente la referencia o id del producto (o variación, según tu tienda) y el campo url de imágenes. De esta manera puedes cargarlos desde el back e incluso hacer pruebas con ficheros más sencillos y te generará las imágenes y todas sus tamaños. Pero el código de @gusman126 mola! me lo quedo que tal vez me sirva Un saludo. Lo mejor como dices es un CSV mas seguro, mas rapido y ya incluido en el PS, pero el problema esta en que al importar desde el Back, lo debes hacer manualmente, si haces un modulo puedes programarlo con cron De nada por el codigo, es un pedazo del código que tengo en un modulo que asigna imágenes subidas a una carpeta del servidor a los productos usando el nombre del fichero, referencia, ID producto o EAN Link to comment Share on other sites More sharing options...
karpoj23 Posted May 10, 2020 Author Share Posted May 10, 2020 es muy bueno el cogido, Gracias!! cuando lo termine subire el mio por si le puede servir de ayuda a alguien. Mi idea es esa, poder ejecutar en un cron este codigo para cuando detecte que hay cambios en cierta carpeta Link to comment Share on other sites More sharing options...
gusman126 Posted May 10, 2020 Share Posted May 10, 2020 hace 1 minuto, karpoj23 dijo: es muy bueno el cogido, Gracias!! cuando lo termine subire el mio por si le puede servir de ayuda a alguien. Mi idea es esa, poder ejecutar en un cron este codigo para cuando detecte que hay cambios en cierta carpeta Ok, entonces usa todo el código que utilizo. aquí lo tienes, fíjate que yo compruebo un token de seguridad y si el fichero va a usar el id o referencia. <?php include_once('../../config/config.inc.php'); include_once('../../init.php'); $token = Tools::getValue("token"); $tokendb = Configuration::get('ADDIMAGESFROMFTP_TOKENDB'); if($token == $tokendb){ $carpeta = dirname(__FILE__).'/imagenes/'; $ficheros = scandir($carpeta); if(count($ficheros)>3){ foreach($ficheros as $fichero){ if($fichero == '.' || $fichero == '..' || $fichero == 'index.php'){ continue; } $file = dirname(__FILE__).'/imagenes/'.$fichero; $tipo = exif_imagetype($file); switch ($tipo) { case 2: $imagen = true; $ext = '.jpg'; break; case 3: $imagen = true; $ext = '.png'; break; default: $imagen = false; break; } $namefile = basename($file,$ext); $mas = strpos("-",$namefile); if($mas > 0){ $namefile = substr($namefile,0,$mas); } $uso = Configuration::get('ADDIMAGESFROMFTP_USE'); if($uso == 1){ $product = $namefile; $sql = "select id_product from ". _DB_PREFIX_ ."product where id_product = '".$product."'"; $id_product = Db::getInstance()->getValue($sql); if(!$id_product){ echo '<br>No coincide con producto!'; unlink($file); continue; } }else{ echo 'Ref'.$namefile; $sql = "select id_product from ". _DB_PREFIX_ ."product where reference = '".$namefile."'"; $id_product = Db::getInstance()->getValue($sql); if(!$id_product){ echo '<br>No coincide con producto!'; unlink($file); continue; } } $imgenesp = Image::getImagesTotal($id_product); if($imgenesp > 0){ $cover = 0; }else{ $cover = 1; } if($imagen){ $urlimg = $file; $image = new Image(); $image->id_product = $id_product; $image->position = Image::getHighestPosition($id_product) + 1; if (($image->validateFields(false, true)) === true && ($image->validateFieldsLang(false, true)) === true && $image->add()){ $copy = copyImg($id_product, $image->id, $urlimg, 'products', true); if (!$copy){ $image->delete(); return 0; }else{ $image->cover = $cover; $image->save(); echo '<br>Imagen Añadida!'; unlink($file); } } } } } } function copyImg($id_entity, $id_image = null, $url, $entity = 'products'){ $tmpfile = tempnam(_PS_TMP_IMG_DIR_, 'ps_import'); $watermark_types = explode(',', Configuration::get('WATERMARK_TYPES')); $image_obj = new Image($id_image); $path = $image_obj->getPathForCreation(); $url = str_replace(' ', '%20', trim($url)); if (!ImageManager::checkImageMemoryLimit($url)){ return; } if (@copy($url, $tmpfile)){ ImageManager::resize($tmpfile, $path.'.jpg'); $images_types = ImageType::getImagesTypes($entity); foreach ($images_types as $image_type){ ImageManager::resize($tmpfile, $path.'-'.stripslashes($image_type['name']).'.jpg', $image_type['width'], $image_type['height']); if (in_array($image_type['id_image_type'], $watermark_types)){ Hook::exec('actionWatermark', array('id_image' => $id_image, 'id_product' => $id_entity)); } } }else{ unlink($tmpfile); return; } unlink($tmpfile); return true; } Link to comment Share on other sites More sharing options...
karpoj23 Posted May 10, 2020 Author Share Posted May 10, 2020 (edited) la verdad que automatizando esto, te olvidas de estar pendiente de importar los csv. Eso si, siempre y cuando los ficheros esten bien formateados y no haya problemas con ellos Gracias! Edited May 10, 2020 by karpoj23 (see edit history) Link to comment Share on other sites More sharing options...
val_carter Posted May 10, 2020 Share Posted May 10, 2020 @gusman126, perdona que te moleste en esta tarde de Domingo, tengo un hilo abierto que no me ha escrito ni leido mis amigos, tu sabes algo del tema? te pego el link: Un saludo y gracias! esto lo podemos marcar como solucionado? soy nuevo en esto de postear. Link to comment Share on other sites More sharing options...
karpoj23 Posted May 10, 2020 Author Share Posted May 10, 2020 (edited) Encontre tambien esto en GitHub por si a alguien le ayuda: https://github.com/meetjey/imageRegeneratorPrestashop Por mi este tambien esta solucionado... creo que solo los admin pueden hacerlo? Edited May 10, 2020 by karpoj23 (see edit history) Link to comment Share on other sites More sharing options...
gusman126 Posted May 10, 2020 Share Posted May 10, 2020 hace 2 minutos, karpoj23 dijo: Encontre tambien esto en GitHub por si a alguien le ayuda: https://github.com/meetjey/imageRegeneratorPrestashop Ese codigo tiene un fallo, y es que no verifica si ya existe la imagen, y por lo tanto el Cron se para siempre en una imagen, si tienes mas de 100 olvidate, debes añadir que verifique si existe o no $thumb = substr($imgPath, 0, strrpos( $imgPath, '.' ) ).'-'.stripslashes($imageType[ 'name' ] ). '.jpg'; if(file_exists($thumb)){ }else{ ..... } Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now