наименование TV берется из description
UPD: после долгих раздумий добавил в фильтр id категории
<?php
/**
* {'pars_part_tv' | snippet : [
'templates' => $_modx->resource.template,
'ids' => $_modx->resource.id,
'inTv' => 'weight,lenght,-1sId',
'category' => '14,15',
]}
* @param templates - id шаблона (обязательно)
* @param ids - id ресурса (обязательно)
* @param inTv - TV параметры через запятую, если нужно исключить какой-то параметр то пишем со знаком "-"
* @param category - id каталога TVшек для дополнительной фильтрации
* @param outerClass - класс обвертки по умолчанию ms2_product__tvs
*
*/
if (empty($templates) || empty($ids)) {
return;
}
$inTv = ($inTv != '') ? array_map('trim', explode(',', $inTv)) : false;
$exTv = []; // tv исключения
$exTv_temp = []; // tv исключения временный
if ($inTv) {
foreach ($inTv as $ikey => $IT) {
if ($IT['0'] == '-') {
$exTv[] = substr($IT,1);
$exTv_temp[] = $IT;
}
}
if (count($exTv)) {
$inTv = array_diff($inTv, $exTv_temp);
}
}
$res = $modx->getObject('modResource', ['id' => $ids]);
if ($res == null) {
return;
}
if (empty($outerClass)) {
$outerClass = 'ms2_product__tvs';
}
if ($inTv || $exTv) {
$tvq = $modx->newQuery('modTemplateVar');
$tvq->where(['id:<>' => 0]);
if ($inTv) {
$tvq->where(['AND:name:IN' => $inTv]);
}
if ($exTv) {
$tvq->where(['AND:name:NOT IN' => $exTv]);
}
if ( !empty($category) ) {
$tvq->where(['AND:category:IN' => array_map('trim', explode(',', $category) )]);
}
$tvs = $modx->getIterator('modTemplateVar', $tvq);
} else {
$tvq = $modx->newQuery('modTemplateVarTemplate');
$tvq->leftJoin('modTemplateVar', 'tvs', 'tvs.id = modTemplateVarTemplate.tmplvarid');
$tvq->where(['templateid' => $templates]);
if (!empty($category)) {
$tvq->where(['tvs.category:IN' => array_map('trim', explode(',', $category))]);
}
$tvq->select($modx->getSelectColumns('modTemplateVar', 'tvs'));
$tvs = $modx->getIterator('modTemplateVarTemplate', $tvq);
$tvq->prepare();
}
if ($tvs == null) {
return;
}
$html = '<div class="'.$outerClass.'">';
foreach ($tvs as $tkey => $T) {
if ($res->getTVValue($T->get('name')) != '') {
if ($inTv) {
if (in_array($T->get('name'), $inTv)) {
$html .= '<div class="'.$outerClass.'_inner">
<div class="'.$outerClass.'_title">'.$T->get('description').'</div>
<div class="'.$outerClass.'_body">'.$res->getTVValue($T->get('name')).'</div>
</div>';
}
} else {
$html .= '<div class="'.$outerClass.'_inner">
<div class="'.$outerClass.'_title">'.$T->get('description').'</div>
<div class="'.$outerClass.'_body">'.$res->getTVValue($T->get('name')).'</div>
</div>';
}
}
}
$html .= '</div>';
return $html;
Источник: modx.pro/solutions/23150
Объектная
0 комментариев