Jump to content

Recommended Posts

Hola a tod@s

Estoy buscando e intentando adaptar un script para importar productos desde un csv automáticamente, en un Prestashop

He visto una para Prestashop 1.6: Script Importacion Automatica Prestashop 1.6

Me gustaría poder adaptarlo para Prestashop 1.7 y dejarlo aquí para compartirlo

He adaptado parte del código, pero en Prestashop 1.7 ha cambiado las funcionalidades:

<?php


// definimos la cabecera y el juego de caracteres
header("Content-Type: text/html;charset=utf-8");

// colocamos el directorio de adminxxxxx en la variable cogiendo el directorio donde está este script con getcwd
define('_PS_ADMIN_DIR_', getcwd());

// incluimos los parametros que se definieron en la instalación
include(_PS_ADMIN_DIR_.'../../config/config.inc.php');

// incluimos las funciones php de Prestashop que vamos a usar
// Que esta dentro de la carpeta del admin donde entrtamos al panel
include(_PS_ADMIN_DIR_.'/functions.php');

// incluimos el script php que hace las importaciones de CSV de Prestashop
include_once '../../controllers/admin/AdminImportController.php';

// Duda si la funcionalidad para importar productos en PS 1.7 esta en:
//include_once '../../controllers/admin/AdminProductsController.php';

// loadProductsPost() -> loadProduct() ?
function loadProduct() {
    $_POST = array (
        'tab' => 'AdminImport',
        'skip' => '1',
        'csv' => 'productos.csv',
        'forceIDs' => '0',
        'match_ref' => '1',
        'convert' => '',
        'entity' => '1',
        'separator' => ';',
        'multiple_value_separator' => ',',
        'iso_lang' => 'es',
        'import' => 'Importar datos CSV',
        'type_value' =>
            array (
               1  => "ID",
               2  => "Activo (0/1)",
               3  => "Nombre *",
               4  => "Categorías (x,y,z...)",
               5  => "Precio impuestos excluidos",
               6  => "ID regla de impuestos",
               7  => "Precio de coste",
               8  => "En oferta (0/1)",
               9  => "Valor del descuento",
               10  => "Porcentaje de descuento",
               11  => "Descuento desde (aaaa-mm-dd)",
               12  => "Descuento hasta (aaaa-mm-dd)",
               13  => "Referencia nº",
               14  => "N° de referencia proveedor",
               15  => "Proveedor",
               16  => "Marca",
               17  => "EAN13",
               18  => "UPC",
               19  => "Ecotasa",
               20  => "Anchura",
               21  => "Altura",
               22  => "Profundidad",
               23  => "Peso",
               24  => "Cantidad",
               25  => "Cantidad mínima",
               26  => "Visible en",
               27  => "Coste adicional del envío",
               28  => "Unidad para el precio unitario",
               29  => "Precio unitario",
               30  => "Resumen", // Short Description
               31  => "Descripción", // Long Description
               32  => "Etiquetas (x,y,z...)",
               33  => "Meta título",
               34  => "Meta keywords",
               35  => "Meta descripción",
               36  => "URL reescrita",
               37  => "Etiqueta cuando se encuentra en stock",
               38  => "Etiqueta para cuando se permiten pedidos en espera",
               39  => "Disponible para pedidos (0 = No, 1 = Yes)",
               40  => "Fecha de disponibilidad del producto",
               41  => "Fecha de creación del producto",
               42  => "Mostrar Precio (0 = No, 1 = Yes)",
               43  => "URL's de las imágenes (x,y,z...)", // Url de la imagen
               44  => "Textos alternativos de imagen (x,y,z...)",
               45  => "Elimine las imágenes existentes (0 = No, 1 = Yes)",
               46  => "Característica (Nombre:Valor:Posición:Personalizado)", // Feature( Name:Value:Position )
               47  => "Solo disponible por Internet (0 = No, 1 = Yes)",
               48  => "Estado",
               49  => "Personalizable (0 = No, 1 = Yes)",
               50  => "Se pueden subir archivos (0 = No, 1 = Yes)",
               51  => "Campos de texto (0 = No, 1 = Yes)",
               52  => "Fuera de stock",   // Out of stock
               53  => "ID / Nombre de la tienda",
               54  => "Administración Avanzada de Stock ",
               55  => "Dependiendo del stock",
               56  => "Almacén",
            ),
    );
}

$import = New AdminImportController();

loadProduct();

¿Alguno ha podido adaptar un script similar? o ¿sabéis que funciones tengo que usar para enviar el csv?

Muchas gracias!

Edited by jat

Share this post


Link to post
Share on other sites

Hola,

Aun no he tenido la necesidad de hacerlo, pero te pregunto, ¿porque no hacerlo con el CSV desde la pagina de importación de productos de PrestaShop que al final esta hecho para eso y en ambiente gráfico?

 

Saludos!

Share this post


Link to post
Share on other sites
hace 2 minutos, Rolige dijo:

Aun no he tenido la necesidad de hacerlo, pero te pregunto, ¿porque no hacerlo con el CSV desde la pagina de importación de productos de PrestaShop que al final esta hecho para eso y en ambiente gráfico?

Hola Rolige por que quiero dejar un script que lo haga automáticamente.

Es mucho más rapido y cubre mis necesidades de desarrollo.
Ya lo tengo hecho, en breve lo publicare.

Share this post


Link to post
Share on other sites

Excelente, seguro sera un buen aporte para quienes lo quieran hacer de esa manera.

Share this post


Link to post
Share on other sites

Buenas tardes. Me uno a la petición. Yo hice para prestashop 1.6 pero en esta versión 1.7 no funciona.

Espero con los brazos abiertos.

Saludos.

Share this post


Link to post
Share on other sites

Yo tengo hecho un script que actualiza el stock de las combinaciones y los productos sin combinaciones. Si ejecuto el script directamente por medio de la URL, funciona correctamente. ¿como hay que hacer para que se ejecute de manera automática?

Share this post


Link to post
Share on other sites

Usando un CronJob.

Hay modulos gratuitos de prestashop para esto. también revisa con tu server, posiblemente incluye una opción para tareas programadas recurrentes, usando tu url.

Fuera un buen aporte si nos compartes ese script. Puede ayudar a varios usuarios. 

 

Saludos

 

3 hours ago, xatursa said:

Yo tengo hecho un script que actualiza el stock de las combinaciones y los productos sin combinaciones. Si ejecuto el script directamente por medio de la URL, funciona correctamente. ¿como hay que hacer para que se ejecute de manera automática?

 

Share this post


Link to post
Share on other sites

Os dejo el script que he realizado para un Prestashop 1.7.4

Es para importar productos y combinaciones

 

Funciona todo menos las imágenes , estoy peleándome con ese tema. Sé que Prestashop espera un array al recibir este dato pero por mas pruebas que hago no doy con la solución.

En fin, aquí dejo esto para el que le pueda ser útil

 

<?php
header("Content-Type: text/html;charset=utf-8");
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);


if (!defined('_PS_ADMIN_DIR_'))
define('_PS_ADMIN_DIR_', getcwd());
include(_PS_ADMIN_DIR_.'/../config/config.inc.php');
include(_PS_ADMIN_DIR_.'/functions.php');
include_once './tabs/AdminImport.php';
require_once(_PS_ADMIN_DIR_.'/init.php');
$context = Context::getContext();


 
	$import = New AdminImportController();
	loadProductsPost();
    $import->productImport();	
	
	loadCombinationsPost();
    $import->attributeImport();
	
	
	function loadProductsPost() {
								
								$_POST = array (
								'tab' => 'AdminImport',
								'forceIDs' => '1',
								'skip' => '1',
								'csv' => 'productos.csv',
								'entity' => '1',
								'separator' => ';',
								'multiple_value_separator' => ',',
								'iso_lang' => 'es',
								'convert' => '',
								'import' => '1',	
								"type_value" => array(								
										  0 => 'id',
										  1 => 'active',
										  2 => 'name',
										  3 => 'category',
										  4 => 'price_tex',							  
										  5 => 'id_tax_rules_group',
										  6 => 'wholesale_price',
										  7 => 'on_sale',
										  8 => 'reduction_price',
										  9 => 'reduction_percent',
										  10 => 'reduction_from',
										  11 => 'reduction_to',
										  12 => 'reference',
										  13 => 'supplier_reference',
										  14 => 'supplier',
										  15 => 'manufacturer',
										  16 => 'ean13',
										  17 => 'upc',
										  18 => 'ecotax',
										  29 => 'width',
										  20 => 'height',
										  21 => 'depth',
										  22 => 'weight',
										  23 => 'quantity',
										  24 => 'minimal_quantity',
										  25 => 'visibility',
										  26 => 'additional_shipping_cost',
										  27 => 'unity',
										  28 => 'unit_price',
										  29 => 'description_short',
										  30 => 'description',
										  31 => 'tags',
										  32 => 'meta_title',
										  33 => 'meta_keywords',
										  34 => 'meta_description',										
										  36 => 'text_when_in_stock',
										  37 => 'text_when_backorder_allowed',
										  41 => 'show_price',
										  42 => 'image',
										  43 => 'image_alt',
										  44 => 'delete_existing_images',
										  45 => 'features',
										  46 => 'online_only',
										  47 => 'condition',
										  48 => 'customizable',
										  49 => 'uploadable_files',
										  50 => 'text_fields',							  
										  51 => 'out_of_stock',
										  52 => 'is_virtual',
										  53 => 'file_url',
										  54 => 'nb_downloadable',
										  55 => 'date_expiration',
										  56 => 'nb_days_accessible',
										  57 => 'shop',
										  58 => 'advanced_stock_management',
										  59 => 'depends_on_stock',
										  60 => 'warehouse',
										  61 => 'accessories',
							  
							  
							  
							),
							);
					}
			
			
			function loadCombinationsPost() {
								
								$_POST = array (
								'tab' => 'AdminImport',
								'forceIDs' => '1',
								'skip' => '1',
								'csv' => 'combinaciones.csv',
								'entity' => '2',
								'separator' => ';',
								'multiple_value_separator' => ',',
								'iso_lang' => 'es',
								'convert' => '',
								'import' => '2',	
								"type_value" => array(								
										 0 => 'id_product',
										 1 => 'product_reference',
										 2 => 'group',
										 3 => 'attribute',
										 4 => 'supplier_reference',
										 5 => 'reference',
										 6 => 'ean13',
										 7 => 'upc',
										 8 => 'wholesale_price',
										 9 => 'price',
										10 => 'ecotax',
										11 => 'quantity',
										12 => 'minimal_quantity',
										13 => 'weight',
										14 => 'default_on',
										15 => 'available_date',
										16 => 'image_position',
										17 => 'image_url',
										18 => 'delete_existing_images',
										19 => 'shop',
										20 => 'advanced_stock_management',
										21 => 'depends_on_stock',
										22 => 'warehouse',
							  
							),
							);
					}
	
	
		Tools::clearSmartyCache();
		Tools::clearXMLCache();
		Media::clearCache();
		Tools::generateIndex();


?>

 

Share this post


Link to post
Share on other sites

Al final ya puedo subir imágenes. Este es el código completo:

 

<?php
header("Content-Type: text/html;charset=utf-8");
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);


if (!defined('_PS_ADMIN_DIR_'))
define('_PS_ADMIN_DIR_', getcwd());
include(_PS_ADMIN_DIR_.'/../config/config.inc.php');
include(_PS_ADMIN_DIR_.'/functions.php');
include_once './tabs/AdminImport.php';
require_once(_PS_ADMIN_DIR_.'/init.php');
$context = Context::getContext();


	function copyImg($id_entity, $id_image, $url, $entity = 'products', $regenerate = true) {
        $tmpfile = tempnam(_PS_TMP_IMG_DIR_, 'ps_import');
        $watermark_types = explode(',', Configuration::get('WATERMARK_TYPES'));

          switch ($entity) {
              default:
              case 'products':
                  $image_obj = new Image($id_image);
                  $path = $image_obj->getPathForCreation();
                  break;
              case 'categories':
                  $path = _PS_CAT_IMG_DIR_ . (int) $id_entity;
                  break;
              case 'manufacturers':
                  $path = _PS_MANU_IMG_DIR_ . (int) $id_entity;
                  break;
              case 'suppliers':
                  $path = _PS_SUPP_IMG_DIR_ . (int) $id_entity;
                  break;
          }
          $url = str_replace(' ', '%20', trim($url));


          // Evaluate the memory required to resize the image: if it's too much, you can't resize it.
          if (!ImageManager::checkImageMemoryLimit($url))
              return false;


          // 'file_exists' doesn't work on distant file, and getimagesize makes the import slower.
          // Just hide the warning, the processing will be the same.
          if (Tools::copy($url, $tmpfile)) {
              ImageManager::resize($tmpfile, $path . '.jpg');
              $images_types = ImageType::getImagesTypes($entity);


              if ($regenerate)
                  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 false;
          }
          unlink($tmpfile);
          return true;
	}

 
	$import = New AdminImportController();
	
	$url = "http://localhost/mi_imagen.jpg";
	$image = new Image();
    $image->id_product = (int) $Codigo_del_articulo;
    $image->position = Image::getHighestPosition($Codigo_del_articulo) + 1;
    $image->cover =  true;
    $image->add();
    if (!copyImg($Codigo_del_articulo, $image->id, $url, 'products', !Tools::getValue('regenerate'))) {
        $image->delete();
    }


	loadProductsPost();
    $import->productImport();	
	loadCombinationsPost();
    $import->attributeImport();
	
	
	function loadProductsPost() {
								
								$_POST = array (
								'tab' => 'AdminImport',
								'forceIDs' => '1',
								'skip' => '1',
								'csv' => 'productos.csv',
								'entity' => '1',
								'separator' => ';',
								'multiple_value_separator' => ',',
								'iso_lang' => 'es',
								'convert' => '',
								'import' => '1',	
								"type_value" => array(								
										  0 => 'id',
										  1 => 'active',
										  2 => 'name',
										  3 => 'category',
										  4 => 'price_tex',							  
										  5 => 'id_tax_rules_group',
										  6 => 'wholesale_price',
										  7 => 'on_sale',
										  8 => 'reduction_price',
										  9 => 'reduction_percent',
										  10 => 'reduction_from',
										  11 => 'reduction_to',
										  12 => 'reference',
										  13 => 'supplier_reference',
										  14 => 'supplier',
										  15 => 'manufacturer',
										  16 => 'ean13',
										  17 => 'upc',
										  18 => 'ecotax',
										  29 => 'width',
										  20 => 'height',
										  21 => 'depth',
										  22 => 'weight',
										  23 => 'quantity',
										  24 => 'minimal_quantity',
										  25 => 'visibility',
										  26 => 'additional_shipping_cost',
										  27 => 'unity',
										  28 => 'unit_price',
										  29 => 'description_short',
										  30 => 'description',
										  31 => 'tags',
										  32 => 'meta_title',
										  33 => 'meta_keywords',
										  34 => 'meta_description',										
										  36 => 'text_when_in_stock',
										  37 => 'text_when_backorder_allowed',
										  41 => 'show_price',
										  42 => 'image',
										  43 => 'image_alt',
										  44 => 'delete_existing_images',
										  45 => 'features',
										  46 => 'online_only',
										  47 => 'condition',
										  48 => 'customizable',
										  49 => 'uploadable_files',
										  50 => 'text_fields',							  
										  51 => 'out_of_stock',
										  52 => 'is_virtual',
										  53 => 'file_url',
										  54 => 'nb_downloadable',
										  55 => 'date_expiration',
										  56 => 'nb_days_accessible',
										  57 => 'shop',
										  58 => 'advanced_stock_management',
										  59 => 'depends_on_stock',
										  60 => 'warehouse',
										  61 => 'accessories',
							  
							  
							  
							),
							);
					}
			
			
			function loadCombinationsPost() {
								
								$_POST = array (
								'tab' => 'AdminImport',
								'forceIDs' => '1',
								'skip' => '1',
								'csv' => 'combinaciones.csv',
								'entity' => '2',
								'separator' => ';',
								'multiple_value_separator' => ',',
								'iso_lang' => 'es',
								'convert' => '',
								'import' => '2',	
								"type_value" => array(								
										 0 => 'id_product',
										 1 => 'product_reference',
										 2 => 'group',
										 3 => 'attribute',
										 4 => 'supplier_reference',
										 5 => 'reference',
										 6 => 'ean13',
										 7 => 'upc',
										 8 => 'wholesale_price',
										 9 => 'price',
										10 => 'ecotax',
										11 => 'quantity',
										12 => 'minimal_quantity',
										13 => 'weight',
										14 => 'default_on',
										15 => 'available_date',
										16 => 'image_position',
										17 => 'image_url',
										18 => 'delete_existing_images',
										19 => 'shop',
										20 => 'advanced_stock_management',
										21 => 'depends_on_stock',
										22 => 'warehouse',
							  
							),
							);
					}
	
	
		Tools::clearSmartyCache();
		Tools::clearXMLCache();
		Media::clearCache();
		Tools::generateIndex();


?>

 

Share this post


Link to post
Share on other sites

Muchisimas gracias por el aporte, funciona perfecto excepto lo de las imaganes. No entiendo muy bien si es que hay que subirlas antes a una carpeta o no.

Podrias explicarlo un poco, gracias.

Share this post


Link to post
Share on other sites

La función copyImg es la que se encarga de todo.

 

Suponiendo que tienes un artículo con un id = 555 y quieres añadirle  una imagen que está en  "http://localhost/img/imagen1.jpg" o "https://tudominio.com/img/imagen1.jpg"  la llamada a la función sería:

 

$url = "http://localhost/img/imagen1.jpg";
	$image = new Image();
    $image->id_product = (int) 555;
    $image->position = Image::getHighestPosition(555) + 1;
    $image->cover =  true;
    $image->add();
    if (!copyImg(555, $image->id, $url, 'products', !Tools::getValue('regenerate'))) {
        $image->delete();
    }

Dependiendo del resto de tu código y como realizas el bucle, igual tienes que colocar este código en otro lugar mas adecuado. Si el contenido de $url tiene más de una imagen, estás van separadas por comas. 

Share this post


Link to post
Share on other sites
hace 2 horas, alexloma dijo:

$image->cover = true;

¿Esto no puede dar problemas si ya existe una cover añadida?

Mejor si comprueba la posición , si es cero que sea cover, si es mayor no es cover

$position = Image::getHighestPosition(555);
if($position == 0){
	$image->cover = true;
}else{
	$image->cover = false;
}

 

Share this post


Link to post
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

×

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More