Dan

Dan

Был в сети 16 июля 2026, 08:56
Заказы не принимаю
Теперь понял. Можно в принципе плагином или если у вас есть дополнение Console, в нем скриптом отметить все галочки у всех ресурсов-карточек. А далее уже рутинная работка — снимать галочки у ненужных. Вообще, если по логике, у всех товаров, привязанных к одной категории, должны быть какие-то общие свойства для выборки. Есть такое?
Значит вам нужно открыть div в первом результат и в каждом 4-м, и закрывать его в последнем и каждом 3-м. И при этом выводить отдельный чанк после каждого-3го или последнего. Вызов будет примерно следующий:
[[!pdoResources?
    &parents=`[[*id]]`
    &tpl=`one_test`
    &tplFirst=`one_test.open`
    &tplFirst=`one_test.open`
    &tpl_n3=`one_test.close`
    &tplLast=`one_test.close`
    &includeTVs=`img,newHome,change,price,street`
]]
И код чанков примерно следующий:
1. one_test — просто вывод блока, без оборачивающего div-а
2. one_test.open следующий:
<div> <!--открывается div обертка-->
<!--далее код из чанка one_test-->
3. one_test.close следующий:
<!--код из чанка one_test-->
</div> <!--закрывается div обертка-->
[[$другой_чанк]]
Как понять «он заменяет ресурс»?
Вы вроде написали, что каждый 3-ий результат должен выводиться в другом чанке.
Чем вам не подходит tpl_N?
Либо распишите задачу более подробно, чтобы можно было дать точный ответ.
Дело в разметке. За вывод выбранных фильтров отвечает метод handleSelected. Если посмотрите код default.js от mSearch2, то увидите, что:
1) По умолчанию, контейнер фильтра — это ближайший родительский тег fieldset
2) Заголовок берется из дочернего элемента контейнера с классом .filter_title

Поэтому, раз у вас своя разметка, то нужно:
1) Создать новый js, например custom.js по адресу assets/components/msearch2/js/web/ и скопировать в него код из default.js, находящегося в той же директории.
2) В системных настройках по ключу mse2_frontend_js укажите созданный вами js-файл
3) В самом файле на 15-16 строчках замените значения filter_title и filter_wrapper на нужные вам.

Либо не трогая js указать это в вызове сниппета в параметре filterOptions
Я у себя протестил, такой код норм чистит. Вы после сохранения страницу ресурса обновите в админке и увидите, что слова удалились из контента.
<?php
switch ($modx->event->name) {
        case 'OnDocPublished':
        case 'OnBeforeDocFormSave':
        case 'OnDocFormSave':
        $res = $modx->getObject('modResource', 1);
        $words = json_decode($res->getTVValue('words'), true);
           
        $content = $resource->get('content');
        $pattern = '/(?:' . join('|', $words) . ')/i';
        $content = preg_replace($pattern, '', $content);
        
        $resource->set('content', $content);
        $resource->save();
        break;
              
}
Потому что migx хранит в json. При этом, в migx у вас видимо всего одно поле для ввода слова, допустим его ключ word, тогда при декодировании вы получите не массив слов, а массив элементов этого migx, т.е. двумерный массив.
Значит вам нужно будет еще пробежаться по нему и получить все слова.
$words = array();
$res = $modx->getObject('modResource', 11);
$temp = json_decode($res->getTVValue('words'), true);
foreach ($temp as $v) {
    if (!in_array($v['word'], $words)) { //$v['word'] - тут нужно указать ключ вашего поля для слова
        array_push($words, $v['word']); //тут тоже соответственно
    }
}
//после цикла вы получите массив введенных слов. Поэтому я и предлагал tvSuperSelect, с ним было бы проще, без лишнего цикла и вводить в него проще.
Т.