Jump to content

Cargar en diferentes idiomas mediante importación CSV


Recommended Posts

Hola!

Soy relativamente nuevo en esto y llevo algunos días atascado con la importación de productos y categorías.

Estoy intentando cargar productos y categorías en castellano y en catalán. He hecho un csv en castellano y otro en catalán con toda la información. Al cargar cualquiera de los dos se me salta la restricción de idioma de la pantalla del import y me lo carga todo para las dos lenguas que tengo habilitadas (catalán y castellano). ¿Cómo debo hacerlo para poder cargar separadamente los csv de cada idioma?

 

Muchas gracias

Link to comment
Share on other sites

Sí, tengo un csv en el idioma A y otro para el B. El problema es que al cargarlo para el A me lo pone en el A y el B con lo que en la tienda me salen las categorias duplicadas ( las tengo escritas en A y en B).

Cuándo cargo el csv del idioma B me pasa lo mismo: me carga los datos en los dos idiomas.

Gracias

Link to comment
Share on other sites

Hola! Tengo la 1.5.3.1 instalada.

Ya solucioné, gracias a un post del foro, un error que había al importar los productos y que hacía que no se grabaran bien ni las categorias ni las url's de las imágenes de los productos.

Para este error de ahora no he encontrado aún ninguna solución,

Link to comment
Share on other sites

Hola!

Gracias por la ayuda pero al final despúes de buscar en el bugtracker dí con una posible solución. Según los de prestashop no se trata de un error. La herramienta de importación CVS no tiene soporte multiidoma. Es una mejora que se hará en un futuro.

 

Lo que he hecho para que me funcione ha sido:

  1. Pongo de idioma predeterminado catalan.
  2. Voy a Idiomas y dejo habilitado sólo el catalán.
  3. Cargo el CVS en catalán forzando los Id's.
  4. Cambio el idioma predeterminado a castellano.
  5. Voy a Idiomas y dejo habilitado sólo el castellano.
  6. Cargo el CVS en castellano forzando los Id's.
  7. Habilito de nuevo el idioma catalán-
  8. Y listos. Ya lo tengo cargado para los dos idiomas. :D

 

Espero que le sirva a alguien de ayuda en un futuro.

  • Like 1
Link to comment
Share on other sites

  • 1 month later...

Quelet

yo tb tengo que hacer la pagina en varios idiomas, 3. Entiendo bien que en la version 1.5.3 no se puede importar por CSV en mas de un idioma sin hacer lo que tu dices?

Lo de "forzar los id's" eso como se hace?

Mil gracias,

sl2

Yolanda

Link to comment
Share on other sites

  • 3 weeks later...

La herramienta de importación CVS no tiene soporte multiidoma. Es una mejora que se hará en un futuro.

 

Lo que he hecho para que me funcione ha sido:

  1. Pongo de idioma predeterminado catalan.
  2. Voy a Idiomas y dejo habilitado sólo el catalán.
  3. Cargo el CVS en catalán forzando los Id's.
  4. Cambio el idioma predeterminado a castellano.
  5. Voy a Idiomas y dejo habilitado sólo el castellano.
  6. Cargo el CVS en castellano forzando los Id's.
  7. Habilito de nuevo el idioma catalán-
  8. Y listos. Ya lo tengo cargado para los dos idiomas. :D

Espero que le sirva a alguien de ayuda en un futuro.

 

Gràcies Quelet. M'has salvat la vida. :)

Els de Prestashop només haurien d'afegir una columa per l'idioma a l'arxiu CSV i ja estaria solucionat B)

 

 

Gracias Quelet. Me has salvado la vida. :)

Los de Prestashop tan solo tendrían que añadir una columa para el idioma en el archivo CSV y ya estaría solucionado B)

Link to comment
Share on other sites

  • 3 weeks later...

Quelet

yo tb tengo que hacer la pagina en varios idiomas, 3. Entiendo bien que en la version 1.5.3 no se puede importar por CSV en mas de un idioma sin hacer lo que tu dices?

Lo de "forzar los id's" eso como se hace?

Mil gracias,

sl2

Yolanda

 

Yolanda, en la pestaña de importación tienes que marcar la opción de "Forzar todos los identificadores mientres dure la importación".

Espero que te sirva.

 

Gràcies Quelet. M'has salvat la vida. :)

Els de Prestashop només haurien d'afegir una columa per l'idioma a l'arxiu CSV i ja estaria solucionat B)

 

 

Gracias Quelet. Me has salvado la vida. :)

Los de Prestashop tan solo tendrían que añadir una columa para el idioma en el archivo CSV y ya estaría solucionado B)

De res. ;-)

De nada ;-)

Link to comment
Share on other sites

  • 3 months later...

Hola!

Gracias por la ayuda pero al final despúes de buscar en el bugtracker dí con una posible solución. Según los de prestashop no se trata de un error. La herramienta de importación CVS no tiene soporte multiidoma. Es una mejora que se hará en un futuro.

 

Lo que he hecho para que me funcione ha sido:

  1. Pongo de idioma predeterminado catalan.
  2. Voy a Idiomas y dejo habilitado sólo el catalán.
  3. Cargo el CVS en catalán forzando los Id's.
  4. Cambio el idioma predeterminado a castellano.
  5. Voy a Idiomas y dejo habilitado sólo el castellano.
  6. Cargo el CVS en castellano forzando los Id's.
  7. Habilito de nuevo el idioma catalán-
  8. Y listos. Ya lo tengo cargado para los dos idiomas. :D

 

Espero que le sirva a alguien de ayuda en un futuro.

 

He estado investigando a fondo el código de restashop 1.5.4.0 y he llegado a las siguientes conclusiones:

 

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

Link to comment
Share on other sites

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