все просто

Получение списка TV полей у ресурса.

Неудобство использование TV полей состоит в том, что добавив одно поле ввиде характеристики у ресурса, необходимо его прописать в шаблоне. Или наоборот, отключив дополнительное поле у ресурса, необходимо удалить его в шаблоне.

Сниппет pdoTV позволит автоматически выводить дополнительные TV поля в шаблоне.

<?php
$id =$tpl = $modx->getOption('id', $scriptProperties,  $modx->resource->id); //id ресурса
$catid =$tpl = $modx->getOption('catid', $scriptProperties,  '17'); //id категории 
$tpl = $modx->getOption('tpl', $scriptProperties, ''); // шаблон - fields

$sql = "SELECT tv.name, tv.caption, tv.description, val.value, rnk.rank
        FROM {$modx->getTableName('modResource')} con 
        inner join {$modx->getTableName('modTemplateVarResource')} val on con.id = val.contentid
        inner join {$modx->getTableName('modTemplateVar')} tv on tv.id = val.tmplvarid
        inner join {$modx->getTableName('modTemplateVarTemplate')} rnk on tv.id = rnk.tmplvarid and con.template = rnk.templateid
        WHERE con.id = ($id) 
        AND tv.category = ($catid)
        ORDER by rnk.rank ASC";
$q = $modx->prepare($sql);
$q->execute();
$customtvs = $q->fetchAll(PDO::FETCH_ASSOC);

/** @var pdoTools $pdoTools */
$pdoTools = $modx->getService('pdoTools');

//$modx->log(1, print_r($tpl,1));
$output = $pdoTools->getChunk($tpl, ['fields'=>$customtvs]);

return $out

Теперь достаточно создать TV поле разместить в нужной категории, назначить шаблону, выставить порядок у шаблона и заполнить.

tv_field_2tv_field

Для вывода, примерный, чанк

{if $fields|len >0}
    {foreach $fields as $field}
        <div class="param-item text-center">
            <div class="param-img">
                <img src="assets/images/svg/{$field.name}.svg" alt="{$field.name}">
            </div>
            <p class="c-blackblue dark">{$field.caption}</p>
            {if $field.name == 'age'}
                <p class="medium lh-3">
                    {set $age = 'age'|chunk|split:'||'}
                    {foreach $age as $val} 
                		{set $val_arr = $val|split:'=='}
                		{if ($val_arr[1]|strip) == ($field.value|strip)}
                		{$val_arr[0]}
                		{/if}
                	{/foreach}
                </p>
            {elseif $field.name == 'aim'}
                {set $aim = $field.value|split:'||'}
                {if $aim | len >0}
                {foreach $aim as $val}
                <p class="medium lh-3">{$val|resource:'pagetitle'}</p>
                {/foreach}
                {/if}
            {else}
                <p class="medium lh-3">{$field.value}</p>
            {/if}
        </div>
    {/foreach}
{/if}

Сам вызов

                   {'pdoTV'|snippet:[
                            'id'=>$_modx->resource.id,
                            'catid'=>17,
                            'tpl'=> '@FILE chunks/tpl/TVfield.tpl'
                        ]}

Комментарии ()