MODX Revo + Расписание

Доброго дня всем!
Столкнулся с задачей: необходимо выводить расписание занятий — тренингов, которые группируются по дате (например 10 апреля и выводим список имеющихся тренингов), + подцепляются некоторые значения (Имя ведущего, время, описание, стоимость, кнопка «Записаться»), и на главную страницу выводим самый ближайший тренинг на сегодня.

Прошедшие мероприятия или удаляем или скидываем в архив.

Может кто-то уже сталкивался с реализацией чего-то подобного или встречал решения?
Буду очень признателен за любые комментарии.
Николай
17 апреля 2017, 16:11
modx.pro
2 573
0

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

Николай Савин
17 апреля 2017, 20:10
0
Первая часть решается через pdoTools. Подробнее не скажу, зависит от того по каким таблицам все разбросано.
Вторая совсем просто. Скрипт в кроне переодически проверяет даты и прошедшие отключает или переносит
    Николай
    17 апреля 2017, 20:36
    0
    Можете подробнее как реализовать через pdoTools?

    Сгородил MIGX таблицу для удобного заполнения тренингов, по-сути осталось как-то группировать в одну дату события, пока туплю над этим.

    Сейчас реализовано так:

    MIGX: fedorova-e.ru/calendar
    Через pdoTools: fedorova-e.ru/raspisanie (там еще и фильтр сверху)
      Николай Савин
      17 апреля 2017, 21:03
      0
      Через MIGX ничего сортировать и группировать НЕЛЬЗЯ. Потому что записи лежат в одной большой куче.
      ВСЕ данные, по которым вам нужно организовывать сортировку и группировку, должны находиться отдельно. На каждый тип данных отдельное поле. Например TV.
      Для каких то подробных советов надо смотреть детально организацию материала в админке.
        Кирилл
        18 апреля 2017, 06:40
        0
        Через MIGX ничего сортировать и группировать НЕЛЬЗЯ.
        Параметры where и sort в getImageList вполне себе работают, причем можно задавать несколько условий.

        Сгородил MIGX таблицу
        Таблицу через TV ввода migx? Или отдельную БД через конфигурацию migx с составлением схемы таблицы? Если идти по второму варианту, то выборку можно будет делать непосредственно из БД, а тут и фильтруйте, сортируйте, выбирайте ближайшие по дате.
          Николай Савин
          18 апреля 2017, 09:20
          0
          Я сказал про НЕЛЬЗЯ, условно. Можно конечно, но это все велосипедно-костыльные труды. При большом количестве информации производительность крайне низкая из-за того, что все хранится в json строках. Это нужно сначала выбрать ВСЕ данные, декодировать их, собрать в единый массив. Ну а дальше конечно можно уже крутить этим массивом как хочешь.
          Если таких таблиц тысячи, то нужно немалое количество ОЗУ, чтобы все это обработать.
            Николай
            18 апреля 2017, 11:37
            0
            Таблицу через TV ввода migx?
            Да, просто ТВ поле с типом ввода MIGX
              Кирилл
              18 апреля 2017, 11:47
              0
              Если надо выбирать из разных ресурсов, то могу посоветовать написать сниппет, в котором получить все нужные TV migx, потом их json_decode, объединить массивы через array_merge, и потом опять json_encode, и полученный результат передать в getImageList. Ну или после array_merge при помощи php производить нужные манипуляции.
            Николай
            18 апреля 2017, 13:10
            0
            Для каких то подробных советов надо смотреть детально организацию материала в админке.
            В админке данные = отдельные материалы (тренинги, вебинары), в принципе через pdoTools сортировка работает нормально, но столкнулся с такой проблемой — даты не верно выдаются, т.е. если несколько ТВ полей (обычные ТВ, не MIGX) заполнены, то все данные в перемешку выводятся.

            Т.к. один тренинг может идти в разные дни или повторяться несколько раз в день, к примеру.



        Николай
        18 апреля 2017, 14:07
        0
        Вообще вызываю расписание на странице так:

        [[!mFilter2?
                          &element=`pdoResources`
                            &parents=`8`
                            &limit=`0`
                            &hideContainers=`1`
                            &sort=`tv|t_date:asc,tv|t_date2:asc,tv|t_date3:asc,tv|t_date4:asc,tv|t_date5:asc,tv|t_time:asc`
                            &where=`{"t_date:>=":1}`
                            &tpl=`RaspisanieCatTplItem`
                            &includeTVs=`trener,trener2,trener3,trener4,trener5,t_date,t_date2,t_date3,t_date4,t_date5,t_time,t_time2,t_time3,t_time4,t_time5,t_cost,t_cost2,t_cost3,t_cost4,t_cost5,sort`
                            &filters=`
                                 resource|pagetitle
                                ,tv|trener
                                ,parent:parents
                            `
                            &tplFilter.outer.tv|trener=`tpl.mFilter2.filter.select`
                            &tplFilter.row.tv|trener=`tpl.mFilter2.filter.option`
                            &tplFilter.outer.resource|pagetitle=`tpl.mFilter2.filter.select`
                            &tplFilter.row.resource|pagetitle=`tpl.mFilter2.filter.option`
                            &tplFilter.outer.resource|parent=`tpl.mFilter2.filter.select`
                            &tplFilter.row.resource|parent=`tpl.mFilter2.filter.option`
                            &suggestionsRadio=`tv|trener`
                        ]]
        Чанк RaspisanieCatTplItem:

        [[DATE_RU]]
        		[[+tv.trener:!empty=`
        		<div class="row" style="margin: 0; padding-bottom: 20px;">
        		<form action="[[~[[*id]]]]" method="post" class="ajax_form af_example">
        	                <input type="hidden" name="category" value="[[+pagetitle]]">
                                <input type="hidden" name="date" value="[[+tv.t_date:dateAgo]]">
                                <input type="hidden" name="time" value="[[+tv.t_time]]">
                                <input type="hidden" name="trener" value="[[+tv.trener]]">
                                <input type="hidden" name="cost" value="[[+tv.t_cost]]">
        		<div class="col-md-12 rasp_title">[[+tv.t_date:dateAgo]]</div>
                <div style="background: #fff;">
                    <div class="col-md-2 ptop20">[[+tv.t_time]]</div>
                    <div class="col-md-6 ptop20"><a href="[[~[[+id]]]]">[[+pagetitle]]</a>
                    
                    <span class="rasp-teacher">Инструктор: <b>[[+tv.trener]]</b></span>
                    
                    </div>
                    <div class="col-md-2 ptop20">
                    [[+tv.t_cost]] р.
                    </div>
                    <div class="col-md-2 ptop20">
                    <button class="btn-green" data-toggle="modal" target="_self" data-target="#addTrening[[+id]]">Записаться</button>
        			<!-- <button data-toggle="modal" target="_self" data-target="#addTrening[[+id]]" class="rasp-btn-online">Online Тренинг</button>-->
        			</div>
                    </div>			
                </form>
                </div>
        `]]

        Как бы все работает и выполняет свои задачи, но вот как сгруппировать тренинги в расписании по дате, чтобы скажем на 18 апреля выводились все тренинги и вебинары на 18 апреля, сейчас же все происходит отдельными записями.
          Кирилл
          18 апреля 2017, 17:28
          0
          Код не проверял, но думаю смысл понятен будет. Я бы пошел по такому пути.

          [[!+last_date:ne=`[[+tv.t_date]]` &then=`<div class="col-md-12 rasp_title">[[+tv.t_date:dateAgo]]</div>[[+tv.t_date:toPlaceholder=`last_date`]]`]]
            Кирилл
            18 апреля 2017, 18:24
            0
            Немного в синтаксисе ошибся, проект на evo дает о себе знать

            [[!+last_date:ne=`[[+tv.t_date]]`:then=`<div class="col-md-12 rasp_title">[[+tv.t_date:dateAgo]]</div>[[+tv.t_date:toPlaceholder=`last_date`]]`]]
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          11