Получение данных из всех MIGX (не только по id документа)

Добрый день!
Назначаю заказу нескольких исполнителей (в MIGX).

Есть ли возможность получить, к примеру, список ВСЕХ заказов определённого исполнителя, не заходя в каждый заказ по по его id документа?

Заранее буду благодарен за ответ.
Игорь
21 января 2020, 18:16
modx.pro
1 063
0

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

Юрий
23 января 2020, 18:44
0
Используя pdoResources сделать выборку и отфильтровать её по TV с учётом того, что данные там в JSON формате
    Игорь
    24 января 2020, 15:36
    0
    Можно увидеть хоть один пример с pdoResources, учитывая "с учётом того, что данные там в JSON формате"?
    Ведь не просто так был создан снипет getImageList?
      Максим Кузнецов
      24 января 2020, 17:08
      +1
      Фильтровать по json-y это, конечно, хорошая идея…

      Ведь не просто так был создан снипет getImageList?
      Скорее, «не просто так был создан MIGX DB». Советую переделать на него, пока не обросли данными (гайд), и фильтровать по-человечески.
        Юрий
        25 января 2020, 13:53
        0
        С тобой полностью согласен, но бывает, что костыль на некоторое время бывает уместен
        {'!pdoResources' | snippet : [
          "tvFilters" => "filter2==" ~ ('Петров' | toJSON)
        ]}
        Конечно фильтр должен быть настроен с учётом тех данных, которые в базе
        Или в случае с MIGX через джоины и LIKE
          Игорь
          25 января 2020, 15:04
          0
          А если предложить другой «костыль» для уменьшения запросов к заказам?

          К примеру, в исполнителе добавить MIGX со списком заказов, в которых исполнитель участвовал или участвовал ранее (т.е. был назначен, а потом удалён — но это НЕ КРИТИЧНО).

          Получается, потом можно просматривать не все заказы, а только те, в которых хотя бы раз назначался исполнителем.

          Такое вот дублирование информации (про костыль я уже сказал — но это реально снизит нагрузку — НЕ ПРИДЁТСЯ просматривать все заказы).
          Естественно, вручную добавлять — это… Я просто не представляю, как АВТОМАТИЧЕСКИ добавить заказ исполнителю (в MIGX), если в заказе он назначается исполнителем (тоже MIGX).
            Юрий
            25 января 2020, 15:21
            0
            Я думаю Максим Кузнецов правильно говорит. Надо сделать по «феншую», иначе вы сами себе создаёте кучу граблей. Например, если исполнитель поменяется? Что вы будете делать? бегать по всем заказам. Вам бы, хотя бы использовать инструмент мультикатегорий Минишопа, если уж вы не хотите создавать сущность Испольнителя или Заказа через MIGX DB.
              Игорь
              25 января 2020, 19:54
              0
              Есть тикеты — Заказы
              Заказу можно задать несколько исполнителей (из тикетов Исполнители) — вручную это делается только в этот момент времени и только в Заказах.

              Есть тикеты — Исполнители
              Можно ли реализовать автоматическое добавление заказа и ИСПОЛНИТЕЛЮ, чтобы не бегать по Исполнителям и вручную не добавлять им Заказы?

              При сохранении Заказа (либо в момент добавления Исполнителя в Заказе) проверяется список Исполнителей и им, соответственно (по id тикета), заносятся id Заказов?

              Честное слово, я где-то уже видел подобную реализацию (добавление данных в migx другого тикета при изменении) — но сейчас не могу найти страницу.
                Юрий
                25 января 2020, 20:23
                0
                В принципе такой подход вполне себе реализуем. В плагине на событии сохранения ресурса.
                1. Считывается TV MIGX этого ресурса (формируется массив id Исполнителей)
                2. В цикле (по id Исполнителей) вытаскиваются и переписываются с учётом новых данных TV MIGX Исполнителей.
                  Игорь
                  25 января 2020, 20:29
                  0
                  Большая ПРОСЬБА показать небольшой пример — я такого никогда ещё не делал (перезаписать migx другого тикета при сохранении документа)

                  В плагине на событии сохранения ресурса
                    Юрий
                    25 января 2020, 20:56
                    +1
                    Ну давайте так:
                    Как пишутся плагины на сохранение ресурса найдёте здесь
                    Как вытащить значение TV MIGX ресурса тоже найдёте (я надеюсь)
                    Как преобразовать JSON в массив и получить нужные данные знаете я надеюсь
                    Как используя массив данных с помощью foreach пройтись получить объекты ресурсов, а из них вытащить TV MIGX. — преобразовать JSON в массив — этот массив наполнить новыми данными — преобразовать в JSON и переписать TV MIGX тоже можно загуглить.
                    Я думаю справитесь, а если что по ходу дела поможем.
                      Игорь
                      26 января 2020, 11:36
                      0
                      Спасибо за ссылку.
                      Я так понял, что в тот момент, как я всё сделаю (как описано), мне придёт понимание, что нужно было всё делать иначе :)

                      Создается плагин на событие OnDocFormSave (не делал ранее)
                      1) При сохранении документа проверяется ID родителя — если это не Заказ-ничего не делать.
                      2) Находится ресурс по ID документа, далее — поле MIGX Исполнитель. (не делал ранее)
                      Последовательно просматривается список Исполнителей (ID Исполнителя):
                      2.1) Находится ресурс по ID Исполнителя
                      2.2) Находится поле MIGX Заказы
                      2.3) Проверяется, есть ли уже запись об этом заказе (ID документа заказа совпадает с ID поля MIGX Исполнителя)
                      2.3.1) Если записи нет (т.е. в ЗАКАЗЕ был назначен новый Исполнитель) — в поле MIGX Исполнителя добавляется ID заказа. В дальнейшем, если вдруг в ЗАКАЗЕ будет убран Исполнитель — НИЧЕГО делать у Исполнителя НЕ НАДО — (подумаешь, лишний проход при проверке...)
                      2.3.2) Сохраняется MIGX Исполнителя
                      3) Всё

                      Т.е. всё просто…
                      Большая просьба накидать ссылок по пунктам и подпунктам 1 и 2 — попробую собрать всё воедино
                      Игорь
                      26 января 2020, 21:07
                      0
                      Сделал первую версию (код ниже)
Игорь
26 января 2020, 17:39
0
Первая версия — хотелось бы узнать, правильно ли я делаю?

<?php
if ($modx->event->name=="OnDocFormSave") // Плагин срабатывает при сохранении ресурса
{    
    $id = $resource->get('id'); // Получаю id ресурса
    $parent = $resource->get('parent'); // Получаем id родителя

    if($parent!=2) //id раздела с тикетами Заказов =2, остальные не трогаю
    {
        return;
    }


    $migx = $modx->resource->getTVValue('vibce');
    $items = $modx->fromJSON($migx);

    foreach($items as $item) {

    $reskuda = $modx->getObject('modResource', $item['celovecus']);  // celovecus - id исполнителя
    $migxkuda=$reskuda->getTVValue('vibzak');
    $itemskuda = $modx->fromJSON($migxkuda);

        $naideno=0;
        $output = array();    
        foreach($itemskuda as $itemkuda) {
        $output[] = $itemkuda['zakazus'];

            if($itemkuda['zakazus']==$id)  // есть ли у исполнителя такой заказ
                {
                $naideno=1;
                }
        }
    
    if($naideno==0)     //  такого заказа нет
        {
            $itemkuda['zakazus'] = $id;
            $output[] = $itemkuda;
            $reskuda->setTVValue('vibzak', $modx->toJSON($output));
        }    

    }

}
Пример брал отсюда https://modx.pro/help/6558
    Юрий
    27 января 2020, 13:34
    0
    Ну что-же хорошо.
    Несколько замечаний:
    1. Лишняя строка
    $id = $resource->get('id');
    В плагине id текущего ресурса уже содержится в переменной $id.
    2. Если ты хочешь выводить сохранённые новые данные в админке посредством MIGX, то надо бы исходную структуру JSON сохранить, а не полностью его переписывать (если я не ошибаюсь).
    3. И я бы сделал проверку на получение объектов.
    4. И если у Исполнителя есть такой Заказ, то можно просто пропустить итерацию цикла.
      Игорь
      27 января 2020, 13:40
      0
      Код не работает (не обновляется MIGX Исполнителя) ПЛЮС бесконечное сохранение (говорят, что надо return; поставить...)
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    15