Павел Романов

Павел Романов

Был в сети 30 июля 2026, 15:23
Заказы принимаю
Вы можете скрывать ненужные кнопки через CSS по id, в котором используется ID TV-шек.

Допустим, у TV с ID=17 надо скрыть кнопку отмены:


Делаем CSS файлик admin.css и кладем в /manager:
#tv17_undo {display:none !important;}

И подключаем его через плагин на событие OnManagerPageInit:
<?php
if ($modx->event->name == 'OnManagerPageInit') $modx->regClientCSS('../manager/admin.css');
У товара делаете TV «prtype», где прописываете тип:
Напольная==1||Настенная==2||Плинтус==3

На странице коллекции собираете дочерние товары, у которых отмечены данные значения. Для этого можно сделать сниппет:
<?php
$items = $modx->runSnippet('pdoResources', array(
'limit'=>0,
'parents'=>$modx->resource->get('id'),
'tpl'=>$tpl,
'includeTVs'=>$includeTVs,
'tvFilters'=>'prtype==='.$prtype,
//еще какие-о параметры pdoResources
));

if($items) return $modx->getChunk('outer-tpl', array('items'->$items, 'title'=>$title));

Делаете чанк outer-tpl c [[+title]] (заголовок) и [[+items]] (товары):
<div>
	<h3>[[+title]]</h3>
	<div>[[+items]]</div>
</div>


Вызываете на странице:

[[Snippet?
&tpl=`******`
&includeTVs=`******`
&prtype=`1`
&title=`Напольная`
]]

[[Snippet?
&tpl=`******`
&includeTVs=`******`
&prtype=`2`
&title=`Настенная`
]]

[[Snippet?
&tpl=`******`
&includeTVs=`******`
&prtype=`3`
&title=`Плинтус`
]]
Делайте просто ссылками, а не select-ом:

<div class="sorting__cat sorting__cat-top" id="mse2_sort">
	<div class="selectheader">По умолчанию</div>
	<div class="selectbody" style="display:none;">
		<a href="#" data-sort="resource|menuindex" data-default="asc" class="sort" >По умолчанию</a>
		<a href="#" data-sort="resource|pagetitle" data-default="asc" class="sort" >Название (А - Я)</a>
		<a href="#" data-sort="resource|pagetitle" data-default="desc" class="sort" >Название (Я - А)</a>
		<a href="#" data-sort="ms|price" data-default="asc" class="sort" >Цена (по возрастанию)</a>
		<a href="#" data-sort="ms|price" data-default="desc" class="sort" >Цена (по убыванию)</a>
	</div>
</div>

selectbody выводите по клику или наведению на selectheader.
В сам selectheader помещайте текст через JS на основании .sort.active.

Ну или попробуйте переопределить свойство sort_link, добавив в вызов mFilter2 параметр:
&filterOptions=`{"sort_link:": "#mse2_sort option"}`
Да все правильно делаете.
Но вообще, должно работать. TV точно называется slider?

Если в чанке mini_sliderTPL прописать:
[[+tv.slider]]

и вывести так:
[[getResources?
&parents=`6,10,12,15`
&showHidden=`1`
&tpl=`mini_sliderTPL`
&limit=`7`
&includeTVs=`1`
]]

Единички выводятся там, где отмечены?
Добавьте GET-параметр в кнопку:
<a data-type="iframe" class="button-link" data-src="[[~7? &subject=`Тема1`]]" href="javascript:;">Заказать</a>

А в самой форме ловите и подставляйте:
<input name="subject" value="[[!#GET.subject:default=`Тема письма по-умолчанию`]]" />

Если pdoTools не установлен, то сделайте простенький сниппет getSubj:
<?php
return htmlentities(trim(strip_tags((string) $_GET['subject'])), ENT_QUOTES, 'UTF-8', false);

И тогда так:
<input name="subject" value="[[!getSubj:default=`Тема письма по-умолчанию`]]" />
PS
Одновременно с Алексеем )))
Так у Вас это один ресурс, в котором MIGX-поле partners которое надо обработать?
Тогда все проще:
<?php
if(!$tv) return;
$countries = array();
$arr = json_decode($tv, true);
foreach($arr as $partner){
	$countries[] = $partner['country'];
}
$countries = array_unique($countries);
natsort($countries);
foreach($countries as $country){
    $out .= $modx->getChunk($tpl, array('country'=>$country));
}
return $out;

И вызываете:
[[getCountries? 
&tv=`[[*partners]]`
&tpl=`country-tpl`
]]


Если же структура такая:
Раздел (15)
	Ресурс(16)
	Ресурс(17)
	Ресурс(18)
	...

… и эти TV partners у ресурсов 16, 17 и 18, то сниппет такой:
<?php
if(!$tvname) return;
if(!$parent) $parent = $modx->resource->get('id');

$countries = array();

foreach ($modx->getIterator('modResource', array('parent' => $parent)) as $resource) {
	$tv = $resource->getTVValue($tvname);
	$arr = json_decode($tv, true);
	foreach($arr as $partner){
    		$countries[] = $partner['country'];
	}
}

$countries = array_unique($countries);
natsort($countries);

foreach($countries as $country){
    $out .= $modx->getChunk($tpl, array('country'=>$country));
}

return $out;

И тогда вызываете:
[[getCountries? 
&parent=`15`  
&tvname=`partners`
&tpl=`country-tpl`
]]
Так что-нибудь выводит?
<?php
if(!$tvname) return;
if(!$parent) $parent = $modx->resource->get('id');

$countries = array();

foreach ($modx->getIterator('modResource', array('parent' => $parent)) as $resource) {
	$tv = $resource->getTVValue($tvname);
	echo $tv;
	$arr = json_decode($tv, true);
    	$countries[] = $arr[0]['country'];
}

$countries = array_unique($countries);
natsort($countries);

foreach($countries as $country){
    $out .= $modx->getChunk($tpl, array('country'=>$country));
}

return $out;
У mFilter2 есть параметр &toSeparatePlaceholders.
Цитата из
документации:
Работает так же как и &toPlaceholders, только в раздельные плейсхолдеры попадает еще и filters. Например, если вы укажете &toSeparatePlaceholders=`my.` и &filters=`tv|test,resource|pagetitle` то получите плейсхолдеры [[+my.results]], [[+my.total]], [[+my.tv|test]] и [[+my.resource|pagetitle]].

Соответственно, можете вызов сделать общим, а блоки фильтров выводить по отдельности — категории, бренды и тип товаров.