Как сделать сортировку по полю в MIGX tv в pdoResources?
Приветствую, подскажите пожалуйста, как делается сортировка ресурсов, по TV полю MIGX?
Есть выборка ресурсов, сейчас отсортирован по 'menuindex' => 'asc', но у каждого ресурса в выборке есть MIGx Tv с именем FIELD_DATE и в нем есть поле date_start тип дата, вот как мне отсортировать ресурсы по этому полю?
Есть выборка ресурсов, сейчас отсортирован по 'menuindex' => 'asc', но у каждого ресурса в выборке есть MIGx Tv с именем FIELD_DATE и в нем есть поле date_start тип дата, вот как мне отсортировать ресурсы по этому полю?
{set $tour = '!pdoResources' | snippet : [
'return' => 'json',
'parents' => $item.id,
'showHidden' => 0,
'showUnpublished' => 0,
'sortby' => ['menuindex' => 'asc'],
] | json_decode : true}
{foreach $tour as $el}
{$el.id | resource: 'pagetitle'}
{set $field_date = json_decode($_modx->resource.field_date, true)}
{foreach $field_date as $idx => $item}
Дата старта: {$item.date_start}
{/foreach}
{/if}
{/foreach}
Получается в массиве $tour еще нет этого поля, вот и не пойму как это делать? :( Комментарии: 9
Если прям сильно постараться, то можно, наверное.
А вообще мигикс хранит данные в json посему, ответ простой: никак.
Только если делать MIGXdb. Тут точно получится сделать по человечески сортировку.
А вообще мигикс хранит данные в json посему, ответ простой: никак.
Только если делать MIGXdb. Тут точно получится сделать по человечески сортировку.
да разницы нет я думаю MIGx просто или db, все равно придется для $field_date массива вывод делать не через fenom, а своим снипетом просто. Думаю хватит ума, передать в сниппет массив $field_date и там поле date получить и сформировать массив отсортировав по дате ил поля date и уже через echo распечатать.
Пока так получилось, осталось отсортировать по дате по полю date1 которое содержит дату
<?php
$array;
foreach($array as $key => $val) {
$res = $modx->getObject('modResource',$val['id']);
$field_date = $res->getTVValue('field_date');
$array_field = json_decode($field_date, true);
foreach($array_field as $key => $val) {
echo $val['date1'].'---
';
}
}
Осталось понять как это сделать
Вообще непонятно чего ты хочешь получить сразу отсортированные данные или получить все данные, а потом отсортировать?
Суть такая, есть список ресурсов контейнеров по месяцам, структура документов такая
-Туры (id 6)
-январь
— тур1
— тур2
-февраль
-март
…
Месяцы вывожу через pdoResources
-Туры (id 6)
-январь
— тур1
— тур2
-февраль
-март
…
Месяцы вывожу через pdoResources
{set $month = 'pdoResources' | snippet : [
'return' => 'json',
'parents' => 6,
'depth' => '0',
'limit' => '12',
'sortby' => ['menuindex' => 'asc'],
'where' => [
'isfolder:=' => 1,
'AND:published:=' => 1,
'AND:hidemenu:=' => 1
]
] | json_decode : true}
///месяцы
{foreach $month as $item}
{$item.pagetitle} //название месяца
///туры
{set $tour = '!pdoResources' | snippet : [
'return' => 'json',
'parents' => $item.id,
'showHidden' => 0,
'showUnpublished' => 0,
'sortby' => ['menuindex' => 'asc'],
] | json_decode : true}
{foreach $tour as $el}
{$el.id | resource: 'title'} ///название тура
{set $date = json_decode($el.id | resource: 'field_date', true)} //ДАТЫ ТУРА
{foreach $date as $idx => $item}
{$item.date1 | date_format : "%e %b %Y"} ////ДАТА ТУРА
{/foreach}
{/foreach}
{/foreach}
Так вот у туров ресурсов, есть TV MIGX FIELD_DATE у которого разные поля есть и нужное мне поле date1, вот по этому полю я хочу отсортировать вывод самих ТУРОВ. Это {foreach $tour as $el} массив $tour. Но пока слабоват как решить эту задачу.
Пока для массива $tour пишу свой снипет,
Array
(
[0] => 2023-02-18 14:21:00
[1] => 2023-02-11 15:06:00
)
<?php
$tour;
foreach($tour as $key => $val) {
$res = $modx->getObject('modResource',$val['id']);
$field_date = $res->getTVValue('field_date');
$array_field = json_decode($field_date, true);
foreach($array_field as $key => $val) {
$date_tour[] = $val['date1'];
}
}
echo '<pre>';
print_r($date_tour);
echo '</pre>';
Получил тады, теперь хочу отсортировать их, но пока не получаетсяArray
(
[0] => 2023-02-18 14:21:00
[1] => 2023-02-11 15:06:00
)
Я бы сделал так. Создал бы для каждого тура отдельное поле date1. написал бы плагин, который из migx вытаскивал бы значение и клал в созданное поле date1. Вызывал бы pdoMenu с сортировкой по полю date1.
Понял идею, спасибо! Да можно и так, пока вроде получилось, своим снипетом tours_sort вот так,
$array;
foreach($array as $key => $val) {
$res = $modx->getObject('modResource',$val['id']);
$field_date = $res->getTVValue('field_date');
$array_field = json_decode($field_date, true);
foreach($array_field as $key => $val) {
$sort_array[] = $val['date1'];
}
}
array_multisort($sort_array, SORT_ASC, $array);
return $array;
И подставляю уже на сайте вместо массива $tours {foreach $tours as $el}{set $tours_sort = $_modx->runSnippet('!tours_sort', ['array' => $tour])}
{foreach $tours_sort as $el}
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.