Прячем ненужные поля товаров minishop'a в зависимости от раздела

При разработке очередного интернет-магазина возникла потребность в большом количестве фильтров по характеристикам товаров. Используя tv или опции тормозов не избежать — нужно расширять родную таблицу ms2_products.

И вроде бы все хорошо, но если в разных разделах нужны разные характеристики, то страница товара в админке превращается в свалку.


Для решения проблемы на ум пришел следующий способ:


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-формате, для последующего отображения актуальных фильтров/характеристик и во фронтэнде.
Максим Кузнецов
08 января 2018, 01:46
modx.pro
27
2 315
+9

Комментарии: 2

Дмитрий Середюк
01 марта 2018, 13:05
0
Спасибо!
Недавно столкнулся со схожей задачей и ваш способ отработал на ура!
    Илья Александрович
    07 ноября 2023, 13:50
    0
    Спасибо, очень пригодилось.
    Есть вопрос, а как под PHP 8+ переписать строки 37 и 46
    if (strlen($parent_id) > 0 && $parent_id != 0) {
        ....
        if (strlen($category_type) > 0) {
    Ругается на parent_id и category_type
    PHP warning: Undefined variable $parent_id
        PHP warning: Undefined variable $category_type
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      2