Выводим возможные значения tv
Взято отсюда.
Сниппет выводит возможные значения TV-параметра, который имеет формат
name1==value1||name2==value1... или value1||value1…
(обычно это типы тип "селект","чекбоксы" или "радио").
В параметр ¶m можно прописать ключ параметра из $_GET - массива, по которому (если он не пустой), сниппет будет искать совпадения в списке элементов. Если они найдены, то в чанке элемента плейсхолдер "+active" вернет текст, который задан в параметре &active. По-умолчанию это просто "active".
Так же, если задан параметр &parent, сниппет подсчитает количество ресурсов, которые имеют текущее значение TV. Параметр &strict=`1` указывает на поиск по строгому соответствию. По умолчанию &strict=`0` и поиск выполняется на соответствие фрагменту строки значения тв-параметра. Если указан параметр &hideEmpty=`1`, значения, по которым поиск не нашел ресурсов, буду скрыты.
<!--Основные параметры (выводим просто список)→
[ [!listTVelements? &tv=`category` &tpl=`tpl.optionList` ]]
<!--Выводим список с выбором активных элементов →
[ [!listTVelements? &tv=`category` &tpl=`tpl.optionList` ¶m=`category` &active=`selected` ]]
<!--Все параметры→
[ [!listTVelements? &tv=`category` &tpl=`tpl.optionList` ¶m=`category` &active=`selected` &parent=`32` &hideEmpty=`1` &strict=`0` ]] $output = ''; $tv = $modx->getOption('tv', $scriptProperties, 'list'); $tpl = $modx->getOption('tpl', $scriptProperties, ''); $hideEmpty = $modx->getOption('hideEmpty', $scriptProperties, false); $parent = $modx->getOption('parent', $scriptProperties, false); $strict = $modx->getOption('strict', $scriptProperties, false); $param = $modx->getOption('param', $scriptProperties, 'false'); $active = $modx->getOption('active', $scriptProperties, 'active'); $filter = isset($_GET[$param]) ? $_GET[$param] : false; $query = $modx->newQuery('modTemplateVar',array('name'=>$tv)); $query->select('elements,id'); if ($query->prepare() && $query->stmt->execute()) { $row = $query->stmt->fetch(PDO::FETCH_ASSOC); } $elmts = explode('||',$row['elements']); $tvid = $row['id']; $elements = array(); foreach($elmts as $idx => $elmt){ $elmt = explode('==',trim($elmt)); $name = $value = $elmt[0]; if(count($elmt) == 2){ $value = $elmt[1]; } $modx->setPlaceholder("name", $name); $modx->setPlaceholder("value", $value); $modx->setPlaceholder("idx", $idx+1); $count = 1; if($parent){ $ids = $modx->getChildIds($parent,2); $where = array('contentid:IN' => $ids, 'tmplvarid' => $tvid, 'value:LIKE' => '%'.$value.'%'); if($strict){ $where = array('tmplvarid' => $tvid, 'value' => $value); } $query = $modx->newQuery('modTemplateVarResource', $where); $query->select(array('count'=>'count(id)')); if ($query->prepare() && $query->stmt->execute()) { $count = $query->stmt->fetch(PDO::FETCH_ASSOC); } $count = intval($count['count']); $modx->setPlaceholder("count", $count); } $status = ''; if($filter){ if(is_array($filter)){ $status = in_array($value, $filter) ? $active : ''; }else{ $status = $value == $filter ? $active : ''; } } $modx->setPlaceholder("active", $status); if($hideEmpty){ if($count > 0){ $output .= $modx->getChunk($tpl); } }else{ $output .= $modx->getChunk($tpl); } } return $output;
Пример tpl с доступными плейсхолдерами:
<option value="[ [+value]]" [ [+active]]>[ [+name]] ([ [+count]])</option>
Модификатор для вывода имени значения
Если мы имеем формат значений ТВ name1==value1||name2==value1..., вызывая ТВ, мы можем вместо value показать name:
[ [*category:tvname=`categoty`]] $output = $input; $value = $input; if (isset($options)){ $tvname = $options; $query = $modx->newQuery('modTemplateVar',array('name'=>$tvname)); $query->select('elements'); $query->prepare(); if ($query->prepare() && $query->stmt->execute()) { $row = $query->stmt->fetch(PDO::FETCH_ASSOC); } $elements = explode('||',$row['elements']); foreach($elements as $key => $el){ $el = explode('==',$el); if(count($el)>1){ if($el[1] == $value){ $output = $el[0]; } } } } return $output;