Работа с дублями вариантов характеристик

Я думаю многим владельцам магазина известна проблема:
При наполнении магазина в рамках одной характеристики появились несколько разных вариантов характеристики, которые по смыслу являются одним и тем же и их необходимо “склеить” в один вариант для корректной работы фильтров и оптимизации базы.
image

Штатно cs-cart не предлагал никакого решения для этой проблемы: решай сам, как хочешь. В какой-то момент я выработал следующую схему:

  1. Переименовывал все дубли вариантов в один нужный мне. Получалось что-то подобное:
    image
  2. Потом с помощью модуля объединения характеристик объединял нужную характеристику саму с собой и в получившейся новой характеристике дубли вариантов “склеивались” в один и задача решалась.

И вот жил да не тужил, но @cs-cart_team, чтоб жизнь мёдом не казалась, выпустили обновление 4.11.4, в котором при переименовании варианта характеристики, если переименовывалось в вариант, который уже есть, то происходило просто удаление обоих вариантов характеристики.
Весело, не правда ли?
Тогда я написал в ТП об этой проблеме. Как думаете, какой бы логичный ответ последовал на такой вопрос? Ну, наверное, что-то типа “спасибо за найденную ошибку в работе, мы исправим это и вернём к той логике, которая была раньше”.
Но нет. Правильный ответ следующий:
Текущее поведение было исправлено: теперь независимо от включенных модулей поведение будет одинаково: при переименовании варианта и совпадении имен с одним из существующих, переименование не происходит, вместо этого будет отображаться предупреждение об ошибке. Данное исправление войдёт в следующую версию CS-Cart (4.11.6).

Т.е. перевожу: “мы не будем исправлять эту ошибку, мы просто в принципе запретим переименовывать варианты в те, что уже есть”

И да, действительно, сейчас на 4.12.1 в принципе невозможно переименовать вариант характеристики, если желаемый вариант уже есть.

На мой вопрос, как теперь в принципе исправлять варианты характеристик (т.е. работать с контентом), поступил очень клиентоориентированный ответ:
Мы сожалеем, что решение было выполнено таким образом, но с точки зрения логики, такой вариант наиболее прозрачный для наших клиентов.
Для выполнения вашего запроса необходима дополнительная модификация кода, которую, к сожалению, мы не можем осуществить в рамках услуг технической поддержки.
Нам жаль, что наш продукт не может удовлетворить все запросы. Мы постоянно совершенствуем CS-Cart, и возможно, что нужная вам функциональность появится в будущем.

Собственно, у меня два вопроса:

  1. Может ли команда @cs-cart_team всё-таки решить проблему не просто выпиливанием функционала для работы, связанной с обслуживанием контента на сайте, а наоборот помогая их клиентам решать их задачи?
  2. Кто как из пользователей решает теперь эту проблему?
    Единственный вариант, какой сейчас я вижу, это делать по-старинке (до того, как я выработал схему с модулем объединения характеристик):

2.1. делаем экспорт всех товаров магазина по выбранной характеристике
2.2. в Excel заменой (CTRL+H) осуществляем переименование вариантов характеристик у товаров
2.3. удаляем полностью характеристику в админке
2.4. Заливаем всю таблицу с товарами с исправленной характеристикой

На всё-провсё (не учитывая само корректирование таблицы, чисто экспорт-импорт таблицы 150.000+ товаров) всего-навсего уходит примерно 30-60 минут. Добавьте сюда довольно высокую вероятность обрыва процесса импорта по какой-нибудь причине и получаете очень приятный процесс работы с контентом в магазине.

3 лайка

Для объединения вариантов характеристик купили модуль от @MAURISWEB.RU
https://marketplace.cs-cart.com/sgruppirovannye-varianty-harakteristik-dlya-cs-cart.html

Сегодня, кстати, по акции Киберпонедельник.

Пока полет нормальный. ТП отзывчивая.

2 лайка

72$ за функционал, который должен быть по дефолту это сильно конечно. В общем-то импорт работает хорошо, но с вариантами просто жесть

А откуда они вообще появляются эти разные варианты характеристик? Я бы на этапе добавления товаров приводил к стандартному виду.

Варианты характеристик как раз одинаковые. Проблема возникает когда варианты характеристики не преднастроены заранее в админке, а импортируется вместе с товарами.

Конкректно у нас проблема следующая: есть характеристика “макс. разрешение”, варианты указанные вручную “1920х1080”, “1280x720”, “1280x960”.
Далее в файле импорта помимо указанных вариантов, есть вариант “2688х1520” у 38 товаров. Вот и будет добавлено 38 одинаковых вариантов “2688х1520”. Хотя ожидается что вариант будет добавлен один и присвоен 38 товарам.

Что происходит в таком случае с фильтрами можете себе представить))

Ну и судя по первому посту в данной теме, а именно “Я думаю многим владельцам магазина известна проблема” это действительно проблема. Плюс есть платные дополнения решающие эту проблему.

Но, имхо, суть в том, что это не дополнительный функционал, который имеет смысл купить за деньги, это именно проблема движка

с этим может помочь такой хук , НО он не тестирован, если будете пробовать его применить делайте сначала на демо сайте

function fn_my_changes_add_feature_variant_pre($feature_id, &$variant)
{

  if (empty($variant['variant']) && (!isset($variant['variant']) || $variant['variant'] !== '0'))
  {
    return false;
  }

  $lang_code = DESCR_SL;
  $fields = ['fvd.variant_id'];
  $joins = [
    'product_feature_variants' => db_quote('INNER JOIN ?:product_feature_variants fv ON fv.variant_id = fvd.variant_id')
  ];
  $conditions = [
    'feature_id' => db_quote('feature_id = ?i', $feature_id),
    'lang_code'  => db_quote('lang_code = ?s', $lang_code),
    'variant'    => db_quote('LOWER(variant) = ?s', fn_strtolower($variant['variant']))
  ];

  $limit = db_quote('LIMIT 1');

  $exists_variant = db_get_hash_single_array(
    'SELECT ?p FROM ?:product_feature_variant_descriptions AS fvd ?p WHERE ?p ?p',
    ['variant_id', 'variant_id'],
    implode(', ', $fields),
    implode(' ', $joins),
    implode(' AND ', $conditions),
    $limit
  );


  if (!empty($exists_variant))
  {
    unset($variant['variant']);
  }
}
3 лайка

Спасибо большое, теперь работает как нужно! Странно что этого нет по дефолту

Вообще то это странное поведение, такого не должно быть. Должен создаться один новый вариант и присвоиться всем товарам, для которых указано в файле импорта.

На примере человека, который писал выше:
Например, сначала заносились товары с вариантом “1280x720”, а потом в другом файле импорта от другого поставщика, например, вариант выглядит так “1280*720”. У третьего выглядит так “1280X720”.
В итоге создадутся три разных варианта по сути одного реального варианта. Отследить это на стадии импортирования нереально, т.к. как правило импортируется не одна характеристика, а несколько десятков характеристик, перепроверить вручную это всё нереально.

Максимально странное и неожиданное поведение, но предложенный вариант с хуком решил вопрос. Еще раз спасибо leonidov.

Конкретно у нас проблема не с тем что варианты похожи “1280x720” и “1280Х720”, а в том что как раз в файле импорта они идентичны, например у 38 товаров абсолютно одинаково указано “1280x720”, а вносится не один вариант, а 38 ))

Перед импортом файлик проверяется максимально, и например устраняются такое как русская “х” и англ “х”, лишние пробелы и прочие косяки контентщиков

подскажите пожалуйста по подробнее куда вставлять?

Включите модуль “Мои изменения”

создайте файл app/addons/my_changes/func.php

<?php
function fn_my_changes_add_feature_variant_pre($feature_id, &$variant)
{

  if (empty($variant['variant']) && (!isset($variant['variant']) || $variant['variant'] !== '0'))
  {
    return false;
  }

  $lang_code = DESCR_SL;
  $fields = ['fvd.variant_id'];
  $joins = [
    'product_feature_variants' => db_quote('INNER JOIN ?:product_feature_variants fv ON fv.variant_id = fvd.variant_id')
  ];
  $conditions = [
    'feature_id' => db_quote('feature_id = ?i', $feature_id),
    'lang_code'  => db_quote('lang_code = ?s', $lang_code),
    'variant'    => db_quote('LOWER(variant) = ?s', fn_strtolower($variant['variant']))
  ];

  $limit = db_quote('LIMIT 1');

  $exists_variant = db_get_hash_single_array(
    'SELECT ?p FROM ?:product_feature_variant_descriptions AS fvd ?p WHERE ?p ?p',
    ['variant_id', 'variant_id'],
    implode(', ', $fields),
    implode(' ', $joins),
    implode(' AND ', $conditions),
    $limit
  );


  if (!empty($exists_variant))
  {
    unset($variant['variant']);
  }
}

после создайте файл app/addons/my_changes/init.php

 <?php 

  fn_register_hooks( 'add_feature_variant_pre');
2 лайка

Всем привет, столкнулся с похожей проблемой. С характеристиками на английском всё отлично работает, а вот с названиями полей на русском начинаются танцы с бубмном. Если поля названы кириллицей, то происходят странные вещи, то слетают сопоставления, то задваиваются названия характеристик, но это ладно, переименовал все столбцы на английский, но как быть если само значение на русском? оно также задваивается, а точнее растет с количеством позиций, при этом вручную не даёт добавить одинаковые значения

стоит последняя версия cscart!

попробовал загрузить этот же файл на демо сервере, всё отлично работает, дублей нет

1 лайк

Столкнулись с той же проблемой. Чистую сборку поставили и на ней куча дублированных значений характеристик. Как починить?

Да интересует этот же вопрос - кто как решал? У нас много цветов типа “синий” “темно синий” “очень синий” Хотелось бы объединить в просто “синий”

вашу задачу можно решить модулем https://marketplace.cs-cart.com/sgruppirovannye-varianty-harakteristik-dlya-cs-cart.html

1 лайк

У меня такая же проблема создаются дубли при импорте, к сожалению хук не помог, от CS Cart будет решение?

обнаружил у себя такую же проблему: создаются дубли вариантов характеристик при импорте. Тикет в ТП cs-cart создал.
@cs-cart_team посмотрите, пожалуйста, проблема массовая