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


#1

Я думаю многим владельцам магазина известна проблема:
При наполнении магазина в рамках одной характеристики появились несколько разных вариантов характеристики, которые по смыслу являются одним и тем же и их необходимо “склеить” в один вариант для корректной работы фильтров и оптимизации базы.
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 минут. Добавьте сюда довольно высокую вероятность обрыва процесса импорта по какой-нибудь причине и получаете очень приятный процесс работы с контентом в магазине.


#2

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

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

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


#3

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


#4

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


#5

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

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

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


#6

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

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


#7

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

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']);
  }
}

Дублирование вариантов в характеристиках
#8

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


#9

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

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


#10

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

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

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


#11

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


#12

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

создайте файл 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');