Как через MIGX вывести только уникальные значения?

Добрый день!
Есть TV MIGX, в котором есть несколько текстовых полей, одно из полей называется [[+country]]

на сайте необходимо вывести список уникальных значение из этого поля, сейчас вывожу так:
[[!getImageList?
	&tvname=`partners`
	&tpl=`@CODE:<a href="#" class="filter" data-filter="[[+country]]">[[+country]]</a>`
	&docid=`2`
]]
Соответственно, если в нескольких TV значение повторяется, то на сайте оно выводится столько раз, сколько есть TV с этим значением.

Подскажите, как вывести только уникальные значения без повторений?
Victor
10 июля 2017, 12:30
modx.pro
1
3 054
0

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

Роман Ильин
10 июля 2017, 16:13
0
Наилучшая техника для выбора уникальных строк – использование вспомогательного объекта. Название свойства в объекте, с одной стороны – строка, а с другой – всегда уникально. Повторная запись в свойство с тем же именем перезапишет его. А потом уже выводите все свойства конечного вспомогательного объекта.
    Павел Романов
    10 июля 2017, 16:27
    +2
    Тут getImageList не нужен.
    Сниппет getCountries:

    <?php
    if(!$tvname) return;
    if(!$parent) $parent = $modx->resource->get('id');
    
    $countries = array();
    
    foreach ($modx->getIterator('modResource', array('parent' => $parent)) as $resource) {
    	$tv = $resource->getTVValue($tvname);
    	$arr = json_decode($tv, true);
        	$countries[] = $arr[0]['country'];
    }
    
    $countries = array_unique($countries);
    natsort($countries);
    
    foreach($countries as $country){
        $out .= $modx->getChunk($tpl, array('country'=>$country));
    }
    
    return $out;

    Вызываете:
    [[getCountries? 
    &parent=`15`  
    &tvname=`имя_TV`
    &tpl=`country-tpl`
    ]]

    &parent — родитель ресурсов с этой MIGX-TV (по умолчанию подставляется текущий).
    &tvname — имя MIGX-TV
    &tpl — чанк-шаблон ссылки. Единственный плейсхолдер — [[+country]]:

    <a href="#" class="filter" data-filter="[[+country]]">[[+country]]</a>
      Victor
      10 июля 2017, 22:24
      0
      Спасибо за ответ, сделал все как Вы написали, но почему-то вообще ничего не происходит…
        Павел Романов
        11 июля 2017, 09:29
        0
        Если просто вывести значение этого MIGX-TV на странице какого-нибудь ресурса с ним, то что отображается?
        [[*имя_tv]]
          Victor
          11 июля 2017, 17:09
          0
          Выводит содержимое TV в json, насколько я понимаю

          [{«MIGX_id»:«2»,«image»:...................................}]
          Проблем с выводом похоже нет
            Павел Романов
            11 июля 2017, 17:19
            0
            Так что-нибудь выводит?
            <?php
            if(!$tvname) return;
            if(!$parent) $parent = $modx->resource->get('id');
            
            $countries = array();
            
            foreach ($modx->getIterator('modResource', array('parent' => $parent)) as $resource) {
            	$tv = $resource->getTVValue($tvname);
            	echo $tv;
            	$arr = json_decode($tv, true);
                	$countries[] = $arr[0]['country'];
            }
            
            $countries = array_unique($countries);
            natsort($countries);
            
            foreach($countries as $country){
                $out .= $modx->getChunk($tpl, array('country'=>$country));
            }
            
            return $out;
              Андрей
              11 июля 2017, 20:00
              0
              У него у него в migx может там несколько записей с country для каждого ресурса, надо все собрать наверное, а не только из первого ключа.

              там массив такого вида наверняка
              [
              	[
              		'MIGX_id' => 1,
              		'country' => ...
              	],
              	[
              		'MIGX_id' => 2,
              		'country' => ...
              	]
              ]
              И так для каждого ресурса
                Павел Романов
                11 июля 2017, 20:02
                0
                Угу. Потому и попросил показать, что выводит поле ))
                  Victor
                  12 июля 2017, 15:23
                  0
                  С новым кодом ничего не выводит,
                  да, все верно tv выводятся так:

                  [{"MIGX_id":"2","image":"test.png","name":"test","description":"Тестовый текст","country":"Россия","park":"Тест1"},
                  {"MIGX_id":"1","image":"test.png","name":"test","description":"Тестовый текст","country":"Германия","park":"Тест2"},
                  {"MIGX_id":"4","image":"test.png","name":"test","description":"Тестовый текст","country":"Германия","park":"Тест1"}]
                    Павел Романов
                    12 июля 2017, 16:11
                    +1
                    Так у Вас это один ресурс, в котором MIGX-поле partners которое надо обработать?
                    Тогда все проще:
                    <?php
                    if(!$tv) return;
                    $countries = array();
                    $arr = json_decode($tv, true);
                    foreach($arr as $partner){
                    	$countries[] = $partner['country'];
                    }
                    $countries = array_unique($countries);
                    natsort($countries);
                    foreach($countries as $country){
                        $out .= $modx->getChunk($tpl, array('country'=>$country));
                    }
                    return $out;

                    И вызываете:
                    [[getCountries? 
                    &tv=`[[*partners]]`
                    &tpl=`country-tpl`
                    ]]


                    Если же структура такая:
                    Раздел (15)
                    	Ресурс(16)
                    	Ресурс(17)
                    	Ресурс(18)
                    	...

                    … и эти TV partners у ресурсов 16, 17 и 18, то сниппет такой:
                    <?php
                    if(!$tvname) return;
                    if(!$parent) $parent = $modx->resource->get('id');
                    
                    $countries = array();
                    
                    foreach ($modx->getIterator('modResource', array('parent' => $parent)) as $resource) {
                    	$tv = $resource->getTVValue($tvname);
                    	$arr = json_decode($tv, true);
                    	foreach($arr as $partner){
                        		$countries[] = $partner['country'];
                    	}
                    }
                    
                    $countries = array_unique($countries);
                    natsort($countries);
                    
                    foreach($countries as $country){
                        $out .= $modx->getChunk($tpl, array('country'=>$country));
                    }
                    
                    return $out;

                    И тогда вызываете:
                    [[getCountries? 
                    &parent=`15`  
                    &tvname=`partners`
                    &tpl=`country-tpl`
                    ]]
                      Victor
                      12 июля 2017, 16:44
                      0
                      Какой же вы хороший человек) Огромнейшее спасибо за помощь!
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      11