Как через MIGX вывести только уникальные значения?
Добрый день!
Есть TV MIGX, в котором есть несколько текстовых полей, одно из полей называется [[+country]]
на сайте необходимо вывести список уникальных значение из этого поля, сейчас вывожу так:
Подскажите, как вывести только уникальные значения без повторений?
Есть TV MIGX, в котором есть несколько текстовых полей, одно из полей называется [[+country]]
на сайте необходимо вывести список уникальных значение из этого поля, сейчас вывожу так:
[[!getImageList?
&tvname=`partners`
&tpl=`@CODE:<a href="#" class="filter" data-filter="[[+country]]">[[+country]]</a>`
&docid=`2`
]]
Соответственно, если в нескольких TV значение повторяется, то на сайте оно выводится столько раз, сколько есть TV с этим значением.Подскажите, как вывести только уникальные значения без повторений?
Комментарии: 11
Наилучшая техника для выбора уникальных строк – использование вспомогательного объекта. Название свойства в объекте, с одной стороны – строка, а с другой – всегда уникально. Повторная запись в свойство с тем же именем перезапишет его. А потом уже выводите все свойства конечного вспомогательного объекта.
Тут getImageList не нужен.
Сниппет getCountries:
Вызываете:
&parent — родитель ресурсов с этой MIGX-TV (по умолчанию подставляется текущий).
&tvname — имя MIGX-TV
&tpl — чанк-шаблон ссылки. Единственный плейсхолдер — [[+country]]:
Сниппет 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>
Спасибо за ответ, сделал все как Вы написали, но почему-то вообще ничего не происходит…
Если просто вывести значение этого MIGX-TV на странице какого-нибудь ресурса с ним, то что отображается?
[[*имя_tv]]
Выводит содержимое TV в json, насколько я понимаю
[{«MIGX_id»:«2»,«image»:...................................}]
Проблем с выводом похоже нет
[{«MIGX_id»:«2»,«image»:...................................}]
Проблем с выводом похоже нет
Так что-нибудь выводит?
<?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;
У него у него в migx может там несколько записей с country для каждого ресурса, надо все собрать наверное, а не только из первого ключа.
там массив такого вида наверняка
там массив такого вида наверняка
[
[
'MIGX_id' => 1,
'country' => ...
],
[
'MIGX_id' => 2,
'country' => ...
]
]
И так для каждого ресурса
Угу. Потому и попросил показать, что выводит поле ))
С новым кодом ничего не выводит,
да, все верно tv выводятся так:
да, все верно 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"}]
Так у Вас это один ресурс, в котором MIGX-поле partners которое надо обработать?
Тогда все проще:
И вызываете:
Если же структура такая:
… и эти TV partners у ресурсов 16, 17 и 18, то сниппет такой:
И тогда вызываете:
Тогда все проще:
<?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`
]]
Какой же вы хороший человек) Огромнейшее спасибо за помощь!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.