Как вызвать сниппет getTvDisplayName в pdoResources?

Есть сниппет getTvDisplayName, который выводит значения tv с типом списка, т.е. «Option1==100||Option2==200» выведет Option1 и Option2 соответственно. Отдельно он работает нормально [[*sometv:getTvDisplayName]], но мне нужно его вывести в шаблоне вывода сниппета pdoResources: [[+tv.sometv:getTvDisplayName]] выводит 100 и 200. Как правильно его вызывать? Заранее спасибо.

[[pdoResources?
    &parents=`[[*id]]`
    &tpl=`modelsList`
    &includeTVs=`sometv`
]]
Чанк modelsList:
<a href=[[~[[+id]]]]>
   Параметр: [[+tv.sometv:getTvDisplayName]]
</a>
Jack OXO
27 июля 2019, 17:53
modx.pro
118
0

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

Баха Волков
27 июля 2019, 19:16
0
А как насчёт кода сниппета, а то у всех мана кончилась)
    Jack OXO
    27 июля 2019, 19:51
    0
    А он поможет?
    <?php
    // @name getTvDisplayName
    // @author Nick Crossland - www.rckt.co.uk
    // @version 1.1-pl
    // @description Output filter to get TV display name
    
    /* 
    An output filter to retrieve the display value of a TV, given the stored value.
    For example, if you have a TV which is a checkbox or listbox, you may have specified separate 
    labels and values such as:
       For the money==1||For the show==2||To get ready==3||Go cat go==4
    
    If you then output the value of the TV in a template using 
       [[*elvis]]
    it will output something like:
       3
    
    If you use this snippet as an output filter, it will instead retrieve the labels associated with
    the values that you have specified in your TV setup. So put in your template
      [[*elvis:getTvDisplayName]]
    it will output
      To get ready 
    
    Sometimes the filter will have trouble because the TV name isn't put in the code exactly as it is set
    up in the manager - for example in a getResources template chunk, by default TV names are prefixed with 
      tv.
    To work round this, you can supply the prefix to ignore as the parameter, e.g.
      [[+elvis:getTvDisplayName=`tv.`]]
    
    If a TV type allows more than one value to be selected (e.g. checkboxes, list (multi)) you should set an output option for the TV of "delimiter" which will separate the values with a delimiter of your choice, for example a comma.
    
    This snippet will replace every value, based on the delimiter. You should ensure your delimiter isn't going to occur in your TV display options - e.g. if your TV display options contain commas, don't choose comma as your delimiter. You might want to choose an unusual character such as §.
    
    You may want to further format the display of your TV values using other output filters such as :replace, e.g.
      [[+elvis:getTvDisplayName=`tv.`:replace=`,==
    `]]
    to display each item on a new line.
    
    */
    
    
    // Code below...
    
    
    // The $name may have a prefix, for example where this is part of a getResources template
    // We can specify a prefix to remove via an option
    if (isset($options) && strpos($name, $options) == 0) {
     $name = substr($name, strlen($options) );
    } 
     
      
    // Get the template variable which has called this  
    $resourceQuery = new xPDOCriteria($modx, "SELECT * FROM {$modx->getTableName('modTemplateVar')} WHERE name = '$name'");
    $tv = $modx->getObject('modTemplateVar', $resourceQuery);
     
    // If we can't find this TV, do nothing and return the original value 
    if (count($tv) == 0) {
      return $input;
    } 
     
    $elements = $tv->get('elements');
    $output_properties = $tv->get('output_properties');
      
    // Get all the possible values  
    $options = explode('||', $elements);
    $lookup = array();
      
    foreach ($options as $o) {
      list($name, $value) = explode('==', $o);
      $lookup[$value] = $name;
    }
      
    // Is there a delimiter? If so, do this for every item  
    if (isset( $output_properties['delimiter'] )) {
      $delimiter = $output_properties['delimiter'];
      $values = explode($delimiter, $input);
    } else {
      $delimiter = '';
      $values = array($input);
    } 
    
    // Put the values back together using the same delimiter 
    $return_values = array();  
    foreach ($values as $v) {
     $return_values[] = $lookup[$v];
    } 
    
    return implode($delimiter, $return_values);
      Баха Волков
      28 июля 2019, 10:22
      +2
      А он поможет?
      Конечно поможет, а еще помогает чтение) Автор пишет:

      Sometimes the filter will have trouble because the TV name isn't put in the code exactly as it is set
      up in the manager — for example in a getResources template chunk, by default TV names are prefixed with
      tv.
      To work round this, you can supply the prefix to ignore as the parameter, e.g.
      [[+elvis:getTvDisplayName=`tv.`]]
        Jack OXO
        28 июля 2019, 16:50
        0
        Да я читал, пробовал, не выводит вообще ничего в таком случае, вот и думаю, что не так делаю. В плане [[+sometv:getTvDisplayName=`tv.`]] ничего не выводит, а [[+sometv]] выводит значение после ==, ну как обычно.
          Баха Волков
          28 июля 2019, 17:00
          +1
          Вызов:

          [[pdoResources?
              &parents=`0`
              &includeTVs=`sometv`
              &tpl=`modelsList`
          ]]

          Чанк:

          <a href="[[~[[+id]]]]">
             Параметр: [[+tv.sometv:getTvDisplayName=`tv.`]]
          </a>

          Параметры TV:



          Результат:

            Jack OXO
            28 июля 2019, 17:12
            0
            Спасибо большое, все работает. Не поставил в начало "+tv.", в описании в примере тоже нет его.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
6