Прячем ненужные поля товаров minishop'a в зависимости от раздела
При разработке очередного интернет-магазина возникла потребность в большом количестве фильтров по характеристикам товаров. Используя tv или опции тормозов не избежать — нужно расширять родную таблицу ms2_products.
И вроде бы все хорошо, но если в разных разделах нужны разные характеристики, то страница товара в админке превращается в свалку.
Для решения проблемы на ум пришел следующий способ:
1. Создаем tv-поле «Фильтры категории» (category_filters) и присваиваем его для шаблона категорий товаров.
Тип ввода: Список (одиночный выбор).
В возможных значениях перечисляем требуемые наборы характеристик.
2. На событие OnManagerPageBeforeRender вешаем плагин:
При необходимости, чтобы не плодить сущности, наборы характеристик можно вынести в системную настройку в json-формате, для последующего отображения актуальных фильтров/характеристик и во фронтэнде.
И вроде бы все хорошо, но если в разных разделах нужны разные характеристики, то страница товара в админке превращается в свалку.
Для решения проблемы на ум пришел следующий способ:
1. Создаем tv-поле «Фильтры категории» (category_filters) и присваиваем его для шаблона категорий товаров.
Тип ввода: Список (одиночный выбор).
В возможных значениях перечисляем требуемые наборы характеристик.
2. На событие OnManagerPageBeforeRender вешаем плагин:
<?php
switch ($modx->event->name) {
case 'OnManagerPageBeforeRender':
if(isset($_REQUEST['die']) || isset($modx->event->params['die'])) {
return;
}
if(!$config = $controller->config) {
return;
}
//Плагин срабатывает только для товаров (msProduct), лежащих в категории (msCategory)
switch ($config['controller']) {
case 'resource/create':
if (!$_REQUEST['class_key'] || !$_REQUEST['parent']) {
return;
}
if ($_REQUEST['class_key'] == 'msProduct') {
$parent_id = $_REQUEST['parent'];
}
break;
case 'resource/update':
if (!$scriptProperties = $controller->scriptProperties) {
return;
}
if ($scriptProperties['id']) {
if ($resource = $modx->getObject('modResource', array('id' => $scriptProperties['id'], 'class_key' => 'msProduct'))) {
$parent_id = $resource->get('parent');
}
}
break;
}
if (strlen($parent_id) > 0 && $parent_id != 0) {
if ($category = $modx->getObject('modResource', array('id' => $parent_id, 'class_key' => 'msCategory'))) {
//Указываем актуальное название созданного tv-поля
$category_type = $category->getTVValue('category_filters');
}
}
if (strlen($category_type) > 0) {
switch ($category_type) {
//Перечисляем возможные значения category_filters
case 'value_1':
//Перечисляем отображаемые характеристики
$allow_fields_list = 'price,color,hot,new';
break;
case 'value_2':
$allow_fields_list = 'price';
break;
//...
};
if ($allow_fields_list) {
$modx->setOption('ms2_product_extra_fields', $allow_fields_list);
}
}
break;
}
При необходимости, чтобы не плодить сущности, наборы характеристик можно вынести в системную настройку в json-формате, для последующего отображения актуальных фильтров/характеристик и во фронтэнде.
Комментарии: 2
Спасибо!
Недавно столкнулся со схожей задачей и ваш способ отработал на ура!
Недавно столкнулся со схожей задачей и ваш способ отработал на ура!
Спасибо, очень пригодилось.
Есть вопрос, а как под PHP 8+ переписать строки 37 и 46
Есть вопрос, а как под PHP 8+ переписать строки 37 и 46
if (strlen($parent_id) > 0 && $parent_id != 0) {
....
if (strlen($category_type) > 0) {
Ругается на parent_id и category_typePHP warning: Undefined variable $parent_id
PHP warning: Undefined variable $category_type
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.