Получение списка 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 поле разместить в нужной категории, назначить шаблону, выставить порядок у шаблона и заполнить.


Для вывода, примерный, чанк
{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'
]}
Комментарии ()