Алексей Шумаев

Алексей Шумаев

Был в сети Вчера в 09:45
Заказы принимаю
Создать свой класс-обработчик расширяющий mse2FiltersHandler (см. документацию).
Переопределить функцию buildParentsFilter (см. Файл core/components/msearch2/model/msearch2/filters.class.php).
вместо: $q->select('id,pagetitle,context_key,menuindex');
$q->select('id,pagetitle,menutitle,context_key,menuindex');

...

$titles[$value] = $parent['pagetitle'];
Добавить:
if(!empty($parent['menutitle'])) {
	$titles[$value] = $parent['menutitle'];
}
Пока дизайн.
Код после праздников будет ибо хочу это реализовать, подумаю на досуге.
НО. Весьма вероятно, что это будет кастомизация, закрывающая возможность обновления компонента. Опять же — я не профессиональный разработчик, качества не гарантирую ;-)

Здесь пример кода, частично реализующего нужный функционал.

Поэтому, если сообществу нужен такой функционал, то правильнее — попросить Василия о новой версии mSearch2 или даже отдельном продукте на базе mSearch2…
Соответственно, чтобы понять, надо оно или нет — те кому надо — «лайкаем» тему.
Добавлю изображение, наглядно поясняющее, как можно было бы использовать наличие возможности сортировки по типу ресурса или, что ещё лучше — разбитие выдачи поиска по типу ресурса/шаблону/...:


Аналогично для полного поиска.
На странице выводов результата вызываем последовательно:

{$_modx->runSnippet('!mSearch2', [
	'where' => '{"class_key:!=":"msProduct"}'
])}
,

затем

{$_modx->runSnippet('!mFilter2@Products', [ #дополнительные параметры ])}
.

Получаем работающие фильтры по найденным товарам + отдельно оформленный результат поиска по остальным ресурсам.
Можно было бы сразу join'ить данные товаров при запуске mSearchForm, но у меня есть разные типы цен, зависящие от группы покупателя. Цена для вывода на фронт определяется плагином на msOnGetProductPrice, поэтому в данном случаем мне представляется правильным сделать именно так.
Итак, временное решение — может кому пригодиться.

1. Запуск (Fenom)
{$_modx->runSnippet('mSearchForm', [
	'pageId' => 5,
	'element' => 'pdoResources',
	'limit' => 15,
	'tpl' => 'tpl.mSearch2.ac',
	'class' => 'modResource'
])}

2. Результат работы mSearchForm в tpl.mSearch2.ac отдаётся сниппету prepareSearchResult:
<?php
$out = '';

$tpls = array (
	'msCategory'  => 'tpl.mSearch2Category.ac',
	'modDocument' => 'tpl.mSearch2Document.ac',
	'msProduct'  => 'tpl.mSearch2Product.ac'
	);

if(isset($class_key) && isset($id)) {
	
	$pdo = $modx->getService('pdoTools');
	$tpl = $tpls[$class_key];
	
	$placeholders['pagetitle'] = $pagetitle;
	$placeholders['description'] = $description;
	
	if($class_key == 'msProduct') {
		$product = $modx->getObject('msProduct', $id);
		$placeholders['price'] = $product->get('price');
		$thumb = $product->get('thumb');
		if(empty($thumb)) {
			$placeholders['thumb'] = '/assets/templates/img/no-photo.png';
		}
		else {
			$placeholders['thumb'] = $product->get('thumb');
		}
	}
	
	$out = $pdo->getChunk($tpl, $placeholders);
}
return $out;

3. Пример куска чанка для продукта (с использованием Fenom):
<div class="img-wrapp">
		<img src="{$thumb}" alt="{$pagetitle}">
	</div>
	<div class="search-body">
		<span class="item-name">{$pagetitle}</span>
		{if $decription?}
			<span class="item-descript">{$description}</span>
		{/if}
	</div>
	<div class="item-price">{$price}<small> руб.</small></div>
1 вариант: тоже о таком думал. Пока не знаю как сделать в случае с mSearchForm — необходимо отдать оба результата в 1 response.
2 вариант: тоже без шаманства не прокатит, т.к. нужно подтягивать данные товара (картинка/цена). У меня в UI autocomplete они выводятся.
У меня для этого сделано так:
1) id форм, цели, адреса почты и сообщения посетителям хранятся в полях MIGX и менеджер сайта может настраивать их как угодно для каждой формы.
2) написан класс, который обрабатывает все формы на сайте и выводит цели и сообщения в соответствии с заданными пользователем.
Новые формы пользователь не может создать, т.к. не его это дело; разработчику для новой формы достаточно указать id, которому менеджер добавит все параметры.

Всё хочу в компонент собрать, да руки не доходят…