Чередование чанков с помощью pdoTools

06 Июня 2021 20:14 (Редактировано: 06 Июня 2021 20:40)

Допустим, у нас есть вот такой дизайн, где блоки чередуются по 3 вряд и по 2 вряд через каждую строку:

Если использовать связку pdoTools + бутстрап то реализация самая очевидная: col-lg-4 для 3 в ряд и col-lg-6 для 2 в ряд. Но задать такое правило для pdoTools достаточно проблематично. К сожалению, такие варианты как nth-child от CSS, idx от pdoTools, tplFirst, tplLast, tplOdd, tpl_N, а также tplCondition вместе с tplOperator и conditionalTpls не помогли реализовать такое правило, поэтому единственный выход был написать такой сниппет:

<?php

$tplThree = $modx->getOption('tpl_three', $scriptProperties, 'articles_card_3_tpl');
$tplTwo = $modx->getOption('tpl_two', $scriptProperties, 'articles_card_2_tpl');

$out = '';

$result = $modx->runSnippet('pdoResources',[
    'parents' => $modx->resource->id,
    'limit' => 12,
    'depth' => 0,
    'sortby' => 'publishedon',
    'sortdir' => 'ASC',
    'includeTVs' => 1,
    'includeTVList' => 'image,chars',
    'depth' => 0,
    'return' => 'json'
]);

if(!empty($result)) {
    $pdo = $modx->getService('pdoTools');
    $queue = 3;
    $counter = 1;
    $idx = 1;
    
    foreach(json_decode($result, true) as $item) {
        $item['idx'] = str_pad($idx, 2, '0', STR_PAD_LEFT);
        switch($queue) {
            case 3:
                if($counter == 3) {
                    $queue = 2;
                    $counter = 1;
                }else{
                    $counter++;
                }
                $out .= $pdo->parseChunk($tplThree, $item);
                break;
            case 2:
                if($counter == 2) {
                    $queue = 3;
                    $counter = 1;
                }else{
                    $counter++;
                }
                $out .= $pdo->parseChunk($tplTwo, $item);
                break;
        }
        $idx++;
    }
}

return $out;