Выводим возможные значения tv

Опубликовано: 14 Мая 2017

Взято отсюда.

Сниппет выводит возможные значения TV-параметра, который имеет формат

name1==value1||name2==value1... или value1||value1…

(обычно это типы тип "селект","чекбоксы" или "радио").
В параметр &param можно прописать ключ параметра из $_GET - массива, по которому (если он не пустой), сниппет будет искать совпадения в списке элементов. Если они найдены, то в чанке элемента плейсхолдер "+active" вернет текст, который задан в параметре &active. По-умолчанию это просто "active".
Так же, если задан параметр &parent, сниппет подсчитает количество ресурсов, которые имеют текущее значение TV. Параметр &strict=`1` указывает на поиск по строгому соответствию. По умолчанию &strict=`0` и поиск выполняется на соответствие фрагменту строки значения тв-параметра. Если указан параметр &hideEmpty=`1`, значения, по которым поиск не нашел ресурсов, буду скрыты.

<!--Основные параметры (выводим просто список)→

[ [!listTVelements?
  &tv=`category`
  &tpl=`tpl.optionList`
]]

<!--Выводим список с выбором активных элементов →

[ [!listTVelements?
  &tv=`category`
  &tpl=`tpl.optionList`
  &param=`category`
  &active=`selected`
]]

<!--Все параметры→

[ [!listTVelements?
  &tv=`category`
  &tpl=`tpl.optionList`
  &param=`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;

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


Оставить комментарий




Разрешённые теги: <b><i><br>Добавить новый комментарий: