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

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

Был в сети 30 июля 2026, 15:23
Заказы принимаю
Оберните вывод в DIV с классом rows:

<div class="cell-lg-8 cell-xs-10 decot-post-left" id="pdopage">
    <div class="rows">
        [[!pdoPage?
            &parents=`[[*id]]`
            &tpl=`Articl.tpl`
            &showHidden=`1`
            &limit=`4`
            &includeTVs=`date`
            &ajaxMode=`default`
            &tvFilters=`type_content==Статья`
            &sortby=`{ "id":"DESC" }`
        ]]
    </div>
    <div class="blog-item">
        <nav>
            [[!+page.nav]]
        </nav>
    </div>    
</div>
А если так?
$parent = $modx->getObject('modResource', $pid);
$result[] = '<a href="'.$modx->getOption('site_url').$parent->get('uri').'">'.$parent->get('pagetitle').'</a>';

$table = $modx->getOption('table_prefix').'ms2_product_categories';
$sql = "SELECT * FROM {$table} WHERE `product_id` = {$rid}";
$q = $modx->prepare($sql);
$q->execute();
$resources = $q->fetchAll(PDO::FETCH_ASSOC);
foreach ($resources as $row) {
    $resource = $modx->getObject('modResource', $row['category_id']);
    $result[] = '<a href="'.$modx->getOption('site_url').$resource->get('uri').'">'.$resource->get('pagetitle').'</a>';
   	
}
return implode($delimeter, $result);
Babel реализует только связь между ресурсами в разных контекстах на фронте (при переключении языков, к примеру) и в админке. Больше он ничего, по сути, не делает.
Если у Вас одинаковые структуры (наборы страниц) для каждого города, то Babel поможет. Если разные, то смысла в нем нет.

А редирект по IP реализуйтеь плагином на OnHandleRequest, к примеру. Babel тут не при чем.
Если количество товара выводится не только на странице самого товара, а еще, к примеру, в категориях, то лучше после парсинга чистить кеш всего сайта и вместо приведенного Вами кода поставить это:
$modx->cacheManager->refresh();

Если выводится только на странице товара (и если в массиве $contentids у Вас ID обновленных ресурсов), то так:
// очищаем кэш обновленных ресурсов
$ids = array_unique($contentids);
foreach($ids as $id){
    $resource=$modx->getObject('modResource',$id);
    $cacheKey = $resource->getCacheKey();
    $modx->cacheManager->refresh(array('resource' => array('key' => $cacheKey)));
}
Используйте getChunk.
Например:
<?php
$sth = $modx->query("SELECT * FROM reg_users");
$result = $sth->fetchAll(PDO::FETCH_ASSOC);
foreach ($result as $data) {
    $regNums .= $modx->getChunk($tpl, array('regNum' => $data['regNum']);
}
return $modx->getChunk($tplWrapper, array('output' => $regNums));

В вызове указывайте параметры:
[[SnippetName?  
    &tplWrapper=`chunk1` 
    &tpl=`chunk2`
]]

Ну а там уже оформляйте как угодно.
В chunk2, к примеру:
<ul>[[+output]]</ul>

В chunk2:
<li>[[+regNum]]</li>
Пишете сниппет, который выводит id товаров через запятую в нужной последовательности например так:
<?php
$ids1 = $modx->runSnippet('pdoResources', array(
    'parents' => 12, // ID первой категории
    'returnIds' => 1,
    'limit' => 0,
    'templates' => 3 // ID шаблона товара
)));
$ids2 = $modx->runSnippet('pdoResources', array(
    'parents' => 3,-12, // ID каталога и исключение ID первой категории
    'returnIds' => 1,
    'limit' => 0,
    'templates' => 3 // ID шаблона товара
)));
return $ids1.','.$ids2;

И подставляете этот сниппет в вызов mFilter2:
...
&resources=`[[!snippetName]]`
&sortby=`ids`
...
<?php
$tvid = 1; // Замените на ID Вашей TV
$docid = $modx->getOption('docid', $scriptProperties, $modx->resource->get('id'));

if(!$tvo = $modx->getObject('modTemplateVarResource', array('tmplvarid' => $tvid,'contentid' =>$docid))) return;
if(!$tv = $modx->getObject('modTemplateVar', $tvid)) return; 

$tvv = str_replace("\n", '', $tv->get('elements'));

$vals = explode('||', $tvv);
$cities = array();
foreach($vals as $val){
	$v = explode('==', $val);
	$cities[ $v[1] ] = $v[0];
}    

$tvr = $tvo->get('value');
$arr = explode('||', $tvr);
$out = array();

foreach($arr as $d){
	$out[] = $modx->getChunk($tpl, array(
            'name' => $cities[$d],
            'id' => $d
        ));
}
return implode(', ', $out);

Вызов:
[[Snippet?  &tpl=`chunk_name`]]
или
[[Snippet?  &docid=`[[+id]]` &tpl=`chunk_name`]]

В чанке chunk_name доступны плейсхолдеры [[+name]] и [[+id]].