ebigfoot Posted July 28, 2013 Share Posted July 28, 2013 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 More sharing options...
Paula Martinez Posted July 28, 2013 Share Posted July 28, 2013 (edited) 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 July 28, 2013 by Raul Martinez (see edit history) Link to comment Share on other sites More sharing options...
ebigfoot Posted July 29, 2013 Author Share Posted July 29, 2013 (edited) 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 July 29, 2013 by ebigfoot (see edit history) Link to comment Share on other sites More sharing options...
ebigfoot Posted July 31, 2013 Author Share Posted July 31, 2013 (edited) 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 August 8, 2013 by ebigfoot (see edit history) Link to comment Share on other sites More sharing options...
Recommended Posts