Как сделать сортировку по полю в MIGX tv в pdoResources?

Приветствую, подскажите пожалуйста, как делается сортировка ресурсов, по TV полю MIGX?

Есть выборка ресурсов, сейчас отсортирован по '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 еще нет этого поля, вот и не пойму как это делать? :(
Роман
20 января 2023, 16:34
modx.pro
218
+1

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

Алексей Смирнов
21 января 2023, 09:45
0
Если прям сильно постараться, то можно, наверное.
А вообще мигикс хранит данные в json посему, ответ простой: никак.
Только если делать MIGXdb. Тут точно получится сделать по человечески сортировку.
    Роман
    21 января 2023, 12:10
    0
    да разницы нет я думаю MIGx просто или db, все равно придется для $field_date массива вывод делать не через fenom, а своим снипетом просто. Думаю хватит ума, передать в сниппет массив $field_date и там поле date получить и сформировать массив отсортировав по дате ил поля date и уже через echo распечатать.
    Роман
    21 января 2023, 14:55
    0
    Пока так получилось, осталось отсортировать по дате по полю 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'].'---
    ';
      }
    }
      Роман
      22 января 2023, 10:36
      0
      Осталось понять как это сделать
      Артур Шевченко
      22 января 2023, 12:04
      0
      Вообще непонятно чего ты хочешь получить сразу отсортированные данные или получить все данные, а потом отсортировать?
        Роман
        22 января 2023, 12:45
        0
        Суть такая, есть список ресурсов контейнеров по месяцам, структура документов такая

        -Туры (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. Но пока слабоват как решить эту задачу.
          Роман
          22 января 2023, 13:14
          0
          Пока для массива $tour пишу свой снипет,

          <?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
          )
            Артур Шевченко
            22 января 2023, 13:54
            0
            Я бы сделал так. Создал бы для каждого тура отдельное поле date1. написал бы плагин, который из migx вытаскивал бы значение и клал в созданное поле date1. Вызывал бы pdoMenu с сортировкой по полю date1.
              Роман
              22 января 2023, 14:32
              0
              Понял идею, спасибо! Да можно и так, пока вроде получилось, своим снипетом 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}
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          9