Выбор нескольких значений одной характеристики в динамических категориях.
Насколько я понял динамические категории несколько недоработаны и есть возможность выбрать только одно значение характеристики для создания категории, мне же нужно несколько, к примеру цвет ярко красный, темно красный, фактурно красный объеденить в просто красный
Пробую писать плагин, если захардкодить все получается, но хотелось бы иметь возможность обновляться, пишу плагин.
Ввод сделал, теперь в базе данных по сабмиту формирую запись со значением вида cpu.value_id IN(8,9)&brand.value_id IN(69) в стандартном случае формировались параметры только с одним значением типа brand.value_id (69) , далее насколько я понял эта запись обрабатывается в shopProductsCollection который парсит это значение но ставит везде между параметрами логическое И, то есть, чтобы обработать несколько значений я пишу свой обработчик IN и добавляю в класс (если хардкодить). Вопрос как вынести этот обработчик в плагин. Прошу откликнуться разработчиков вебассист (техподдержка попросила указать теги webasyst для привлечения внимания разработчиков). Заранее спасибо.
8 ответов
Для цветов можете например использовать https://www.webasyst.ru/store/plugin/shop/col/
Да, спасибо, но там не только цвета, хотелось бы все таки получить раширение фильтров динамической категории. Так получается класс shopProductsCollection нельзя расширить в плагине ? или я как то неясно спрашиваю ?
Что бы расширить класс, нужно его наследовать. Следовательно в своем плагине создайте класс, например shopMyProductsCollection c содержимым:
И добавьте туда нужные вам методы. Далее в коде плагина используйте вами созданный класс.
Спасибо, да это понятно, о дело в том, что я этот класс в плагине не использую, его используют уже функции дывижка для вывода категории в админке и на фронте. Чтобы было понятней, что я делаю вот код в shopProductsCollection.class.php:
стандартный
$part = str_replace(array($escapedBS, $escapedAmp), array('\\\\', '\\&'), $part);
if ($temp = preg_split("/(\\\$=|\^=|\*=|==|!=|>=|<=|=|>|<)/uis", $part, 2, PREG_SPLIT_DELIM_CAPTURE)) {
$name = trim(array_shift($temp));
if ($name == 'tag') {
$temp[1] = explode('||', $temp[1]);
}
if ($name != 'price') {
$result[$name] = $temp;
} else {
if ($temp[0] == '>=') {
$result[$name][0] = $temp;
} else if ($temp[0] == '<=') {
$result[$name][1] = $temp;
} else {
$result[$name] = $temp;
}
}
}
который мне нужен
$part = str_replace(array($escapedBS, $escapedAmp), array('\\\\', '\\&'), $part);
if ($temp = preg_split("/(\\\$=|\^=|\*=|==|!=|IN|>=|<=|=|>|<)/uis", $part, 2, PREG_SPLIT_DELIM_CAPTURE)) {
$name = trim(array_shift($temp));
if ($name == 'tag') {
$temp[1] = explode('||', $temp[1]);
}
if($temp[0] == 'IN') {
$temp[1] = explode(',', str_replace(array('(',')'), '',$temp[1]));
}
if ($name != 'price') {
$result[$name] = $temp;
} else {
if ($temp[0] == '>=') {
$result[$name][0] = $temp;
} else if ($temp[0] == '<=') {
$result[$name][1] = $temp;
} else {
$result[$name] = $temp;
}
}
}
То есть я добавляю shopProductsCollection.class.php:
if($temp[0] == 'IN') {
$temp[1] = explode(',', str_replace(array('(',')'), '',$temp[1]));
}
А затем уже этот класс вызывается методами вебасиста.
Как это вынести в плагин, чобы при обновлениях не слетало это все.
Только модификация существующего класса. Просто после каждого обновления приложения добавляйте эту правку. Плагин отрабатывает по вызову в определенном месте, в указанном вам коде нет вызова какого либо плагина.
Спасибо, а подменить весь класс также нельзя ? Может какой то запрос разработчикам ну хук в этом месте можно отправить ? Я посмотрел по форуму, запросов на расширение этих фильтров достаточно много.
Конечно: https://support.webasyst.ru/forum/ideas/