Jump to content

Importar productos


Recommended Posts

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

  • 2 weeks later...

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

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 by val_carter (see edit history)
Link to comment
Share on other sites

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

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

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

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

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...