Названия tv-параметров для Comparison без словарей

После установки дополнения Comparison для miniShop2 оказалось, что он требует внести в словари названия для каждого tv-параметра (это упомянуто в документации). Но для сайта с уже существующими 300+ tv-параметрами это долго, и контент-менеджеру не объяснишь, что теперь, помимо создания параметра надо ещё куда-то что-то писать… В итоге, на странице сравнения вызов сниппета выглядит так:
[[!CompareList?
	&fields=`{"default":["price",[[!getComparisonParams]] ]}`
	&tplParam=`@INLINE
		<td class="comparison-param">
			{{!getTVcaption? &key=`[[+field]]` ¶m=`[[+param]]`}}
		</td>`
]]
 
getComparisonParams — это сниппет, которые получает все tv-параметры для ресурсов, указанных в cmp_ids, исключая заранее определённые ненужные tv типа картинок или прикреплённых документов и инструкций. Кстати, id можно как-то получить не через GET?

getTVcaption — сниппет, который решает описанную в начале задачу.

$q = $modx->newQuery('modTemplateVar');
$q->where(array('name' => $key));
$q->select(array('modTemplateVar.*'));
$q->prepare();
$q->stmt->execute();
$result = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
if ( !empty($result[0]['caption']) ) { $paramName = $result[0]['caption']; }
else { $paramName = $param; }
return $paramName;
Юрий Эффа
24 марта 2016, 21:24
modx.pro
7
1 551
+2

Комментарии: 1

Юрий Эффа
25 марта 2016, 15:09
0
Возможно, что кому пригодится и код сниппета getComparisonParams — он выводит в кавычках через запятую ключи всех непустых tv-параметров у ресурсов, id которых заданны в get-переменной cmp_ids.
<?php
$output = '';
$tvs = array();
$excludeTVs = array(2,15,16); // исключаем картинки и документы

$comparisonIDs = explode(',', $_GET['cmp_ids']);
foreach($comparisonIDs as $child) {
    $tv_query = $modx->newQuery('modTemplateVarResource');
    $tv_query->leftJoin('modTemplateVar','modTemplateVar',array("modTemplateVar.id = tmplvarid"));
    $tv_query->where(array('contentid'=>$child));
    $tv_query->select($modx->getSelectColumns('modTemplateVarResource','modTemplateVarResource','',array('id','tmplvarid','contentid','value')));
    $tv_query->select($modx->getSelectColumns('modTemplateVar','modTemplateVar','',array('name')));
    $tvars = $modx->getCollection('modTemplateVarResource',$tv_query);
    foreach ($tvars as $tvar) {
        $tvar = $tvar->toArray();
        if( !in_array($tvar['tmplvarid'], $excludeTVs) ) { $tvs[] = $tvar['tmplvarid']; }
    }
}
$tvs = array_unique($tvs);
$i = 0;
    foreach( $tvs as $tv ) {
        if( $i != 0 ) { $output .= ","; }
        $tvObj = $modx->getObject('modTemplateVar', $tv );
        $fields = $tvObj->toArray();
        if (preg_match('/^@/',$fields['elements'])) { $fields['elements'] = $tvObj->processBindings($fields['elements']); }
        $output .= '"'.$fields['name'].'"';
        $i++;
    }
//echo '<pre>'.print_r($tvs, true).'</pre>';
return $output;
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    1