Ответить Новая тема Новый опрос 
 Дублируются значения свойств при имопрте из csv
Leo_zh
Новичок
Сообщений: 1
Регистрация: 01-03-2013


23-10-2013 18:39
Здравствуйте!

PrestaShop™ 1.5.6.0
Столкнулся со следующей проблемой:
Когда импортируешь из csv товары с одинаковыми значениями свойств, то товару не присваивается существующее значение, а присваивается и заносится новое такое же значение.
Например:
Импортируем:
Свойство1:A:1, Свойство2:C:2, Свойство3:DD:3
Свойство1:A:1, Свойство2:C:2, Свойство3:DD:3
Свойство1:A:1, Свойство2:C:2, Свойство3:DD:3
Свойство1:B:1, Свойство2:C:2, Свойство3:DD:3

Хотим получить:

Свойство1, 2 значения - А, В;
Свойство2, 1 значение - С;
Свойство3, 1 значение - DD;

Получаем:

Свойство1, 4 значения: А, А, А, В;
Свойство2, 4 значения: С, С, С, С;
Свойство3, 4 значения: DD, DD, DD, DD;

Кто-нибудь с этим сталкивался?
 
Вне форума
ПМ 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
kolts
Новичок
Сообщений: 15
Регистрация: 26-09-2013


06-11-2013 04:09
Я столкнулся только что. Решение не нашел. Наверное надо откатиться на прошлую версию
 
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
RAGE
Cпециалист
Сообщений: 145
Регистрация: 11-12-2011


06-11-2013 04:22
если знаете PHP - вставьте проверку на существование свойства у товара...
и все... никуда откатываться не надо )
 
Вне форума
ПМ 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
kolts
Новичок
Сообщений: 15
Регистрация: 26-09-2013


06-11-2013 15:34
Ну это очевидно.
По идее эта функция не отрабатывает
Код:
public static function addFeatureImport($name, $position = false)
    {
        $rq = Db::getInstance()->getRow('
            SELECT `id_feature`
            FROM '._DB_PREFIX_.'feature_lang
            WHERE `name` = \''.pSQL($name).'\'
            GROUP BY `id_feature`
        ');
        if (empty($rq))
        {
            // Feature doesn't exist, create it
            $feature = new Feature();
            $languages = Language::getLanguages();
            foreach ($languages as $language)
                $feature->name[$language['id_lang']] = strval($name);
            if ($position)
                $feature->position = (int)$position;
            else
                $feature->position = Feature::getHigherPosition() + 1;
            $feature->add();
            return $feature->id;
        }
        else
        {
            if ($position && $feature = new Feature((int)$rq['id_feature']))
            {
                $feature->position = (int)$position;
                $feature->update();
            }

            return (int)$rq['id_feature'];
        }
    }

Что добавить чтоб при успешном условии выводилось какое то сообщение чтоб я знал что этот кусок кода работает нормально. Что то вроде message


Сообщение отредактировано kolts 06-11-2013 16:41 ...
 
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
RAGE
Cпециалист
Сообщений: 145
Регистрация: 11-12-2011


06-11-2013 16:59
эта функция public static function addFeatureImport($name, $position )
добавляет сами свойства, а не приписывает нужное свойство товару...)


попробуй найти Product::addFeatureProductImport
оно должно быть в цикле foreach
вот в этом цикле и посмотри почему не работает условие проверки существования свойства у товара...

если в импорте ВСЕГДА указаны ВСЕ свойства товара, то можно в качестве "кривой правки" перед циклом удалять все свойства товара, тогда при внесении новых не будет копий одинаковых...



 
Вне форума
ПМ 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
kolts
Новичок
Сообщений: 15
Регистрация: 26-09-2013


06-11-2013 17:24
Скорей всего этот файл c этой функцией не поменялся в новой версии. Я его заменил со старой. Пока откатился на старую версию. Может потом найду в чем проблема. Свойства я импортирую вместе c товарами.
Разрабы что-то поменяли у свойств и сломали проверку. Раньше когда я ипортировал свойства вместе c товарами у них было значение поля custom в таблице feature равное 1. Из-за этого они не попадали в блок многоуровневой фильтрации, поэтому я после импорта обращался к базе данных напрямую и менял все значения на 0. Теперь значение сразу 0, но плодится куча одинаковых свойств.
Пока это не горит, может исправят в следующей версии. Не хочется забивать голову c php она и так у меня забита кучей всего.


Сообщение отредактировано kolts 06-11-2013 18:26 ...
 
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
Vvasya
Новичок
Сообщений: 4
Регистрация: 11-11-2013


14-11-2013 21:27
Вот нашел искомую часть кода. Помогите понять почему не работает проверка...

Код:
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);
    $id_feature_value = FeatureValue::addFeatureValueImport($id_feature, $feature_value, $product->id, $id_lang);
    Product::addFeatureProductImport($product->id, $id_feature, $id_feature_value);
  }
}



Сообщение отредактировано Vvasya 14-11-2013 16:30 ...
 
Вне форума
ПМ 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
Vvasya
Новичок
Сообщений: 4
Регистрация: 11-11-2013


14-11-2013 23:14
Забыл уточнить, у меня версия 1.5.6
Нашел этот же участок кода в версии 1.4.11
Как мне исправить мою версию, чтоб проверялись значения?

Код:
foreach ($features as $feature => $value)
    if (Tools::strlen($product->{$feature}) && strncmp($feature, \'#F_\', 3) === 0)
    {
        $feature_name = str_replace(\'#F_\', \'\', $feature);
        $id_feature = Feature::addFeatureImport($feature_name);
        $feature_tmp = new Feature($id_feature);
        $flag = true;                                                
        if (Validate::isLoadedObject($feature_tmp))
        {
            $id_lang = (int)Language::getIdByIso(trim(Tools::getValue(\'iso_lang\')));
            $ProductFeatures = $product->getFeatures();
            foreach($ProductFeatures as $ProductFeature)
            {
                if (is_array($ProductFeature) && isset($ProductFeature[\'id_feature\']) && $ProductFeature[\'id_feature\'] == $id_feature)
                {
                    $featureValue = new FeatureValue((int)$ProductFeature[\'id_feature_value\']);
                    if(Validate::isLoadedObject($featureValue))
                    {
                        $featureValue->value[$id_lang] = $value;
                        $featureValue->update();
                        $flag = false;
                    }
                }
            }
        }
        if ($flag)
        {
            $id_feature_value = FeatureValue::addFeatureValueImport($id_feature, $product->{$feature});    
            Product::addFeatureProductImport($product->id, $id_feature, $id_feature_value);
        }
    }



Сообщение отредактировано Vvasya 14-11-2013 18:15 ...
 
Вне форума
ПМ 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
Ответить Новая тема Новый опрос