Получение данных из всех MIGX (не только по id документа)
Добрый день!
Назначаю заказу нескольких исполнителей (в MIGX).
Есть ли возможность получить, к примеру, список ВСЕХ заказов определённого исполнителя, не заходя в каждый заказ по по его id документа?
Заранее буду благодарен за ответ.
Назначаю заказу нескольких исполнителей (в MIGX).
Есть ли возможность получить, к примеру, список ВСЕХ заказов определённого исполнителя, не заходя в каждый заказ по по его id документа?
Заранее буду благодарен за ответ.
Комментарии: 15
Используя pdoResources сделать выборку и отфильтровать её по TV с учётом того, что данные там в JSON формате
Можно увидеть хоть один пример с pdoResources, учитывая "с учётом того, что данные там в JSON формате"?
Ведь не просто так был создан снипет getImageList?
Ведь не просто так был создан снипет getImageList?
Фильтровать по json-y это, конечно, хорошая идея…
Ведь не просто так был создан снипет getImageList?Скорее, «не просто так был создан MIGX DB». Советую переделать на него, пока не обросли данными (гайд), и фильтровать по-человечески.
С тобой полностью согласен, но бывает, что костыль на некоторое время бывает уместен
Или в случае с MIGX через джоины и LIKE
{'!pdoResources' | snippet : [
"tvFilters" => "filter2==" ~ ('Петров' | toJSON)
]}
Конечно фильтр должен быть настроен с учётом тех данных, которые в базеИли в случае с MIGX через джоины и LIKE
А если предложить другой «костыль» для уменьшения запросов к заказам?
К примеру, в исполнителе добавить MIGX со списком заказов, в которых исполнитель участвовал или участвовал ранее (т.е. был назначен, а потом удалён — но это НЕ КРИТИЧНО).
Получается, потом можно просматривать не все заказы, а только те, в которых хотя бы раз назначался исполнителем.
Такое вот дублирование информации (про костыль я уже сказал — но это реально снизит нагрузку — НЕ ПРИДЁТСЯ просматривать все заказы).
Естественно, вручную добавлять — это… Я просто не представляю, как АВТОМАТИЧЕСКИ добавить заказ исполнителю (в MIGX), если в заказе он назначается исполнителем (тоже MIGX).
К примеру, в исполнителе добавить MIGX со списком заказов, в которых исполнитель участвовал или участвовал ранее (т.е. был назначен, а потом удалён — но это НЕ КРИТИЧНО).
Получается, потом можно просматривать не все заказы, а только те, в которых хотя бы раз назначался исполнителем.
Такое вот дублирование информации (про костыль я уже сказал — но это реально снизит нагрузку — НЕ ПРИДЁТСЯ просматривать все заказы).
Естественно, вручную добавлять — это… Я просто не представляю, как АВТОМАТИЧЕСКИ добавить заказ исполнителю (в MIGX), если в заказе он назначается исполнителем (тоже MIGX).
Я думаю Максим Кузнецов правильно говорит. Надо сделать по «феншую», иначе вы сами себе создаёте кучу граблей. Например, если исполнитель поменяется? Что вы будете делать? бегать по всем заказам. Вам бы, хотя бы использовать инструмент мультикатегорий Минишопа, если уж вы не хотите создавать сущность Испольнителя или Заказа через MIGX DB.
Есть тикеты — Заказы
Заказу можно задать несколько исполнителей (из тикетов Исполнители) — вручную это делается только в этот момент времени и только в Заказах.
Есть тикеты — Исполнители
Можно ли реализовать автоматическое добавление заказа и ИСПОЛНИТЕЛЮ, чтобы не бегать по Исполнителям и вручную не добавлять им Заказы?
При сохранении Заказа (либо в момент добавления Исполнителя в Заказе) проверяется список Исполнителей и им, соответственно (по id тикета), заносятся id Заказов?
Честное слово, я где-то уже видел подобную реализацию (добавление данных в migx другого тикета при изменении) — но сейчас не могу найти страницу.
Заказу можно задать несколько исполнителей (из тикетов Исполнители) — вручную это делается только в этот момент времени и только в Заказах.
Есть тикеты — Исполнители
Можно ли реализовать автоматическое добавление заказа и ИСПОЛНИТЕЛЮ, чтобы не бегать по Исполнителям и вручную не добавлять им Заказы?
При сохранении Заказа (либо в момент добавления Исполнителя в Заказе) проверяется список Исполнителей и им, соответственно (по id тикета), заносятся id Заказов?
Честное слово, я где-то уже видел подобную реализацию (добавление данных в migx другого тикета при изменении) — но сейчас не могу найти страницу.
В принципе такой подход вполне себе реализуем. В плагине на событии сохранения ресурса.
1. Считывается TV MIGX этого ресурса (формируется массив id Исполнителей)
2. В цикле (по id Исполнителей) вытаскиваются и переписываются с учётом новых данных TV MIGX Исполнителей.
1. Считывается TV MIGX этого ресурса (формируется массив id Исполнителей)
2. В цикле (по id Исполнителей) вытаскиваются и переписываются с учётом новых данных TV MIGX Исполнителей.
Большая ПРОСЬБА показать небольшой пример — я такого никогда ещё не делал (перезаписать migx другого тикета при сохранении документа)
В плагине на событии сохранения ресурса
Ну давайте так:
Как пишутся плагины на сохранение ресурса найдёте здесь
Как вытащить значение TV MIGX ресурса тоже найдёте (я надеюсь)
Как преобразовать JSON в массив и получить нужные данные знаете я надеюсь
Как используя массив данных с помощью foreach пройтись получить объекты ресурсов, а из них вытащить TV MIGX. — преобразовать JSON в массив — этот массив наполнить новыми данными — преобразовать в JSON и переписать TV MIGX тоже можно загуглить.
Я думаю справитесь, а если что по ходу дела поможем.
Как пишутся плагины на сохранение ресурса найдёте здесь
Как вытащить значение TV MIGX ресурса тоже найдёте (я надеюсь)
Как преобразовать JSON в массив и получить нужные данные знаете я надеюсь
Как используя массив данных с помощью foreach пройтись получить объекты ресурсов, а из них вытащить TV MIGX. — преобразовать JSON в массив — этот массив наполнить новыми данными — преобразовать в JSON и переписать TV MIGX тоже можно загуглить.
Я думаю справитесь, а если что по ходу дела поможем.
Спасибо за ссылку.
Я так понял, что в тот момент, как я всё сделаю (как описано), мне придёт понимание, что нужно было всё делать иначе :)
Создается плагин на событие 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 — попробую собрать всё воедино
Я так понял, что в тот момент, как я всё сделаю (как описано), мне придёт понимание, что нужно было всё делать иначе :)
Создается плагин на событие 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 — попробую собрать всё воедино
Сделал первую версию (код ниже)
Первая версия — хотелось бы узнать, правильно ли я делаю?
<?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
Ну что-же хорошо.
Несколько замечаний:
1. Лишняя строка
2. Если ты хочешь выводить сохранённые новые данные в админке посредством MIGX, то надо бы исходную структуру JSON сохранить, а не полностью его переписывать (если я не ошибаюсь).
3. И я бы сделал проверку на получение объектов.
4. И если у Исполнителя есть такой Заказ, то можно просто пропустить итерацию цикла.
Несколько замечаний:
1. Лишняя строка
$id = $resource->get('id');
В плагине id текущего ресурса уже содержится в переменной $id.2. Если ты хочешь выводить сохранённые новые данные в админке посредством MIGX, то надо бы исходную структуру JSON сохранить, а не полностью его переписывать (если я не ошибаюсь).
3. И я бы сделал проверку на получение объектов.
4. И если у Исполнителя есть такой Заказ, то можно просто пропустить итерацию цикла.
Код не работает (не обновляется MIGX Исполнителя) ПЛЮС бесконечное сохранение (говорят, что надо return; поставить...)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.