Jump to content

[Solucionado] modificar el módulo importar csv


Recommended Posts

Hola
¿Alguien sabe cómo se llama el módulo de Prestashop estándar encargado de la importación de los CSV?
Necesito modificarlo para resolver el fallo en el manejo de múltiples idiomas en las características del producto.
Gracias

Link to comment
Share on other sites

Hola

¿Alguien sabe cómo se llama el módulo de Prestashop estándar encargado de la importación de los CSV?

Necesito modificarlo para resolver el fallo en el manejo de múltiples idiomas en las características del producto.

Gracias

 

Hola !

 

Me llamo Raul Martinez,

 

No es ningún módulo va integrado internamente con Prestashop. (/controllers/admin/AdminImportController.php)

 

¿Creo que puedes importar ficheros *.csv por idioma, en Prestashop? ¿No te funciona?

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

Hola !

 

Me llamo Raul Martinez,

 

No es ningún módulo va integrado internamente con Prestashop. (/controllers/admin/AdminImportController.php)

 

¿Creo que puedes importar ficheros *.csv por idioma, en Prestashop? ¿No te funciona?

Gracias Raúl

Resulta que a la hora de importar un .csv puedes elegir el idioma con el que realizarás la importación. Sin embargo, aunque el proceso de importación del .csv asigna los valores de la mayoría de campos a cada uno de los idiomas que tengas definidos en la tienda, los campos: "etiquetas / (tags)" y "características / (features)" son asignados a todos los idiomas a la vez.

 

El resultado es que, si tienes 2 archivos .csv, uno para cada idioma, cuando importas el segundo .csv las etiquetas y las características de todos los idiomas son sobreescritas por los valores del último .csv

 

Es por ello que quiero modificar el código de /controllers/admin/AdminImportController.php que amablemente has indicado.

 

Ahora empezaré a estudiar ese código e intentaré modificarlo. Si alguien tiene alguna propuesta, será bienvenida.

Cuando consiga que funcione lo publicaré aquí :) .

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

Hola

¿Alguien sabe cómo se llama el módulo de Prestashop estándar encargado de la importación de los CSV?

Necesito modificarlo para resolver el fallo en el manejo de múltiples idiomas en las características del producto.

Gracias

 

SOLUCIONADO : NO HAY SOLUCIÓN ?

No hay solución dado que al importar un nuevo artículo en el idioma 1 puede pasar que el valor de la característica:

- NO exista

- SÍ exista

Si NO existe, entonces se crea un nuevo valor [tabla: ps_feature_value_lang] para todos los idiomas (dado que no pueden quedar vacíos)

Si SÍ existe, es que el valor de la característica está escrito en el mismo idioma. Entonces ¿qué valor deberíamos poner para el otro idioma? -> No se puede ya que no disponemos de ese dato en ese momento.

 

LA SOLUCIÓN : LA PRIMERA SOLUCIÓN

Todos los valores de las características tienen que estar dados de alta, con sus correspondientes variantes de idioma, antes de hacer la importación.

 

LA SEGUNDA SOLUCIÓN (para PRESTASHOP 1.5.4.0):

Esta solución es más drástica y tiene el problema de que será eliminada en cuanto se aplique una actualización de Prestashop ya que afecta al núcleo.

 

La modificación de los siguientes archivos del núcleo de Prestashop 1.5.4.0 corrige el defecto en la importación de artículos para varios idiomas:

- /controllers/admin/AdminImportController.php

- /classes/FeatureValue.php

 

El defecto consiste en que si tenemos 2 archivos para la importación de artículos, cada uno en un idioma distinto, al importar el campo características (features) del artículo en el idioma 1, escribe las características para los 2 idiomas y al importar el fichero en el idioma 2 vuelve a escribir las características para los 2 idiomas también.

Esta modificación permite la importación de de productos en varios idiomas y asigna el valor de la característica al idioma correspondiente.

No importa el orden en que se importan los archivos csv. Da igual cual sea el primer idioma de importación.

 

Creo que esta modificación del código debería ser incluida en futuras versiones de Prestashop, a menos que haya un cambio drástico en el tratamiento del multilenguaje.

 

Fichero: /controllers/admin/AdminImportController.php

Modificaciones:

// obtiene el idioma seleccionado para la importación
$actual_language_id = Language::getIdByIso(Tools::getValue('iso_lang'));

// Se añaden los parámetros $product->id y $actual_language_id
$id_feature_value = FeatureValue::addFeatureValueImport($product->id, $id_feature, $feature_value, $actual_language_id);

 

Función modificada: productImport

public function productImport()
{
$this->receiveTab();
$handle = $this->openCsvFile();
$default_language_id = (int)Configuration::get('PS_LANG_DEFAULT');
AdminImportController::setLocale();
$shop_ids = Shop::getCompleteListOfShopsID();

// obtiene el idioma seleccionado para la importación
$actual_language_id = Language::getIdByIso(Tools::getValue('iso_lang'));

for ($current_line = 0; $line = fgetcsv($handle, MAX_LINE_SIZE, $this->separator); $current_line++)
{
...

		// Features import
		$features = get_object_vars($product);

		if (isset($features['features']) && !empty($features['features']))
			foreach (explode($this->multiple_value_separator, $features['features']) as $single_feature)
			{
				$tab_feature = explode(':', $single_feature);
				$feature_name = trim($tab_feature[0]);
				$feature_value = trim($tab_feature[1]);
				$position = isset($tab_feature[2]) ? $tab_feature[2]: false;

				if(!empty($feature_name) && !empty($feature_value))
				{
					$id_feature = Feature::addFeatureImport($feature_name, $position);

					// Se añaden los parámetros $product->id y $actual_language_id
					$id_feature_value = FeatureValue::addFeatureValueImport($product->id, $id_feature, $feature_value, $actual_language_id);

					Product::addFeatureProductImport($product->id, $id_feature, $id_feature_value);
				}
			}
		...
}

 

Fichero: /classes/FeatureValue.php

Modificaciones:

$rq = Db::getInstance()->executeS('
	[color=#0000ff]SELECT fv.`id_feature_value`
	FROM ('._DB_PREFIX_.'feature_value fv
	LEFT JOIN '._DB_PREFIX_.'feature_product fp USING (`id_feature_value`))
	JOIN '._DB_PREFIX_.'product p USING (`id_product`)
	WHERE fv.`id_feature` = '.(int)$id_feature.'
	AND p.`id_product` = '.(int)$id_product[/color]
);

else {
	// Update Feature value with actual lang value
	// Actualiza el valor de la característica con el valor del idioma actual
	Db::getInstance()->execute('
		UPDATE '._DB_PREFIX_.'feature_value_lang
		SET `value` = \''.pSQL($name).'\'
		WHERE `id_feature_value` = '.(int)$id_feature_value.'
		AND `id_lang` = '.(int)$id_lang
	);
}

 

Función modificada: addFeatureValueImport

public static function addFeatureValueImport($id_product, $id_feature, $name, $id_lang = 1)
{
$rq = Db::getInstance()->executeS('
	[color=#0000ff]SELECT fv.`id_feature_value`
	FROM ('._DB_PREFIX_.'feature_value fv
	LEFT JOIN '._DB_PREFIX_.'feature_product fp USING (`id_feature_value`))
	JOIN '._DB_PREFIX_.'product p USING (`id_product`)
	WHERE fv.`id_feature` = '.(int)$id_feature.'
	AND p.`id_product` = '.(int)$id_product[/color]
);

if (!isset($rq[0]['id_feature_value']) || !$id_feature_value = (int)$rq[0]['id_feature_value'])
{
	// Feature doesn't exist, create it
	$feature_value = new FeatureValue();

	$languages = Language::getLanguages();
	foreach ($languages as $language)
		$feature_value->value[$language['id_lang']] = strval($name);

	$feature_value->id_feature = (int)$id_feature;
	$feature_value->custom = 1;
	$feature_value->add();

	return (int)$feature_value->id;
}
else {
	// Update Feature value with actual lang value
	// Actualiza el valor de la característica con el valor del idioma actual
	Db::getInstance()->execute('
		UPDATE '._DB_PREFIX_.'feature_value_lang
		SET `value` = \''.pSQL($name).'\'
		WHERE `id_feature_value` = '.(int)$id_feature_value.'
		AND `id_lang` = '.(int)$id_lang
	);
}
return (int)$id_feature_value;
}

 

Si queréis, se pueden eliminar los valores de las características de producto que se han ido acumulando en sucesivas importaciones y que no se corresponden con características establecidas a través del elemento del menú del Backoffice Características (Features)

Así se elimina "basura" de la base de datos

Hacerlo sólo si a continuación vais a recargar todos los productos mediante importación de uno o varios archivos CSV.

Este código hay que ejecutarlo directamente contra la base de datos.

 

DELETE ps_feature_value, ps_feature_value_lang
 FROM ps_feature_value LEFT JOIN ps_feature_value_lang USING (id_feature_value)
WHERE custom = 1;

 

Un saludo

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

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