Максим Кузнецов

Максим Кузнецов

Был в сети 04 августа 2021, 21:51
Заказы принимаю
Подскажите, пожалуйста, можно ли привязать рейтинг к mFilter2, вызывающий товары minishop2 посредством Join'ов?

[[!mFilter2? &suggestions=`0` &showLog=`1` &limit=`25` &select=`{"Data":"[[!getProductDataFields]]"}` &paginator=`pdoPage@Pagination` &class=`msProduct` &element=`msProducts` &depth=`0` &toPlaceholders=`mse2_` &includeThumbs=`70x70` &showEmptyFilters=`0`
	&filters=`[[*category_filters]]`
	&sort=`price:asc`
	&where=`{"class_key":"msProduct"}`
	&leftJoin=`{
		"VoteFormThread": {
		"class": "VoteFormThread",
		"on": "msProduct.id = VoteFormThread.resource AND VoteFormThread.form = 1"
		}
	}`
	&select=`{
		"msProduct": "*",
		"Vendor": "*",
		"70x70": "*",
		"VoteFormThread": "rating"
	}`
	]]
Мм, что мешает вызывать их при помощи pdoResources «старым» способом через Join'ы?

[[pdoResources? &loadModels=`ms2gallery` &limit=`0` &sortby=`rank` &sortdir=`ASC` &class=`msResourceFile` &tpl=`gallery.Item` &context=`перечисляем контексты`
	&where=`{"parent": 0, "active": 1, "resource_id": (айди ресурса, из которого достаем)}`
	&leftJoin=`{
		"75x75":{"class":"msResourceFile","alias":"75x75", "on":"75x75.parent=msResourceFile.id AND 75x75.path LIKE '%/75x75/'"}
	}`
	&select=`{
		"msResourceFile":"*"
		,"75x75":"75x75.url as 75x75"
	}`
]]

— единственная сложность — связывать соответствующие айди ресурсов из разных контекстов и передавать их в сниппет, ну да это, думаю, решается за счет плагина.

upd: упс, пардон, привел пример для ms2gallery, но для msgallery можно реализовать по аналогии join'ами.
так и вызываете — [[!today]]. В крайнем случае, если вдруг это не сработало, в сниппете today можно заменить возвращаемое значение, на выставление плейсхолдера:

today
$modx->setPlaceholder('todayPlaceholder',date("U"));

и вызывать в шаблоне:
[[!today]] //просто выполнит сниппет, ничего не возвращая

[[+todayPlaceholder]] //в нужном месте - выведет только значение, без обработки

+ я так понимаю, т.к. у вас страница с вызовом — это «событие» календаря, то необходимо смотреть tv-параметр, по которому определяется дата «проведения» события, а не его создания в админке. И тогда вам или нужно преобразовать дату из tv в unix-формат (фильтром :strtotime) или настроить формат «вывода» в настройка тв-параметра.
js не позволит скрыть его совсем.

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

Допустим, создаем сниппет today со следующим кодом:

return date("U");
— который выведет текущую дату в unix-формате. А дальше, при помощи фильтров сравниваем приведенную к этому же формату дату события и, если она меньше today-даты — выводить «прием заявок окончен», иначе — форму заявки.
Смотри, все довольно просто. Создаешь свой сниппет, допустим, yoba1 с кодом:

<?php
	if ($modx->resource->hasChildren() != 0) { //смотрим кол-во потомков ресурса
		$params = array(); //перечисляем в массиве параметры сниппета
		$params['level'] = 2;
		$params['outerClass'] = 'side-menu';
		$params['tplParentRow'] = '@INLINE <li[[+classes]]><h3 [[+attributes]]>[[+menutitle]]</h3>[[+wrapper]]</li>';
		
		$result = $modx->runSnippet('pdoMenu', $params); //вызываем сниппет pdoMenu с нужными параметрами
	}
	else {
		$params = array();
		$params['parents'] = 52;
		$params['depth'] = 0;
		$params['tpl'] = 'tpl.SideNews';

		$result = $modx->runSnippet('pdoResources', $params);
	}
	return $result; //возвращаем результат

И вызываешь в нужном месте [[!yoba1]]. Итог: в 2 раза меньше запросов к бд.
В вашем примере вы можете воспользоваться плейсхолдером results и выводить в условии уже результаты.
Но… «вложенные условия» работают несколько иначе, чем в php, а именно — [[действия]] срабатывают «изнутри», т.е. сначала срабатывают все внутренние сниппеты/чанки, а уже потом — внешние.

Грубо говоря, в вашем примере сначала 2 раза срабатывает pdoResources, а уже потом условие. Из-за этого при генерации страницы обрабатываются ненужные запросы. Лучший выход при таких задачах (имхо) — писать свой сниппет на пшп, где используются обычные условия if else, а уже внутри — запускаются сниппеты.
mFilter2 реализует фильтрацию найденных результатов. Соответственно, т.к. в найденных результатах есть ресурсы с тв только со значением «черное» — он и отобразит лишь этот цвет.

Соответственно, если вы хотите вывести все «возможные» значения, при том что их еще нет в фильтруемом списке (а значит при выборе их по-умолчанию фильтр выдаст «подходящих товаров не найдено»), вам нужен свой шаблон вывода (кастомный чанк) и своя логика фильтрации.