[UserEvents] - события пользователя.

Компонент реализует функционал создания пользователями событий на ресурсы.

Особенности:
— создание событий как на фронте, так и в админке сайта
— интеграция с miniShop2 (заказы, оплата)

Демо сайт userevents.vgrish.ru
Логин и пароль для входа в админку test

вкладка компонента
Основная панель управления находятся в отдельном разделе сайта, доступном через меню.
Содержит вкладки:
— события
— статусы
Сниппет ue.order
Выводит форму оформления заказа/ бронирование события.


Сниппет ue.get.order
Вывод оформленного заказа/ забронированного события.


Важно!
— оплата бронирования реализована через методы оплаты miniShop
— все сниппеты UserEvents работают при помощи pdoTools и рассчитывают на использование Fenom в чанках.
— компонент требует предварительной установки pdoTools и miniShop
— при создании события без заказа оповещения на смену статусов придется писать самостоятельно. Пример есть в документации.

PS. Кратко пока вся информация, подробнее в документации. Спасибо за внимание.
Володя
18 октября 2017, 07:59
modx.pro
9
3 879
+22
Поблагодарить автора Отправить деньги

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

Владимир
18 октября 2017, 11:16
+2
Вещь!
Алексей Федоров
18 октября 2017, 11:39
0
Для консалтинга самое то. Теперь осталось дождаться доков с подробностями)
Sergey Leleko
18 октября 2017, 16:28
0
Володь, какова цена будет?
Leonid Krylov
19 октября 2017, 16:50
0
    Сергей Кепкин
    19 октября 2017, 16:57
    0
    А как места создаются, не нашел ни на скринах не в доках?
    Если надо будет много мест типа выбора мест в зале 20*20?
      Володя
      19 октября 2017, 17:32
      +2
      Сергей а нет никаких мест. Для создания события необходим ресурс и пользователь (почта).
      В качестве так называемого места может выступать любой ресурс.
      на событие UserEventsOnBeforeGetOrderCost пишите плагин docs.modx.pro/components/userevents/development/events
      там согласно вашей логике будет расчет стоимости. У вас может быть твердая стоимость, может быть какая либо тарифная сетка и тд.
      Можно конечно было прикрутить это в админку, но сохранить при этом гибкость расчета я не придумал как.
      Так что все в ваших руках…
      Если надо будет много мест типа выбора мест в зале 20*20?
      можно создать 20*20 ресурсов и разместить их в форму заказа, пример userevents.vgrish.ru/events/zapis-3.html
      Семён Кудрявцев
      21 октября 2017, 08:48
      0
      Потестил компонент на modhost.pro — как всегда, Володя, молодец, отличная штука получилась!
      Что бы хотелось добавить:
      Было бы неплохо добавить в системные настройки указание группы пользователей для выбора юзера при создании события, допустим есть группа тренеров и только из неё можно выбирать, сейчас выбор среди всех юзеров системы.
      И круто было бы иметь возможность создавать такие таблицы-расписания в нескольких экземплярах, под разные группы событий, например, есть группа — тренинги, у неё своя таблица событий, своя группа пользователей (тренеров, которых можно выбирать в списке создания события) и своя группа, куда регистрируются заказчики.
      И есть группа, например, марафоны — тоже со своей группой ведущих и группой регистрирующихся.
        Володя
        21 октября 2017, 19:08
        +1
        молодец, отличная штука получилась!
        Спасибо!
        Было бы неплохо добавить в системные настройки указание группы пользователей для выбора юзера при создании события, допустим есть группа тренеров и только из неё можно выбирать, сейчас выбор среди всех юзеров системы.
        пока не вижу в этом смысла, только при каком то дальнейшем развитии компонента в ту сторону что вы описали ниже.
        И круто было бы иметь возможность создавать такие таблицы-расписания в нескольких экземплярах, под разные группы событий, например, есть группа — тренинги, у неё своя таблица событий, своя группа пользователей (тренеров, которых можно выбирать в списке создания события) и своя группа, куда регистрируются заказчики.
        И есть группа, например, марафоны — тоже со своей группой ведущих и группой регистрирующихся.
        Излишне усложнять компонент пока не планирую…
        Вовка
        02 января 2018, 15:46
        0
        Добрый день! Возник вопрос по формированию данных для вывода времени, т.е. данный кусок (взят из примера на демо сайте)
        {'!ue.order'|snippet:[
        .....,
        'workTimes' => [
            '8-9',
            ['time' => '9:00-10:00', 'title' => 'c 9ти до 10'],
            '10:00-11:00',
            '11:00-12:00',
            '12:00-13:00',
            ['time' => '13:00-14:00', 'title' => 'Обеденный перерыв', 'disabled' => true, 'cls' => 'breaktime'],
            '14:00-15:00',
            '15:00-16:00',
            '16:00-17:00',
            '17:00-18:00',
            '18:00-19:00',
            '19:00-20:00',
            '20:00-21:00',
            '21:00-22:00',
            '22:00-23:00',
            '23:00-24:00',
        ],
        ....,
        ]}
        в данный кусок вставляю 'workTimes' =>`[[!snippetName]]`
        Собственно не могу разобраться как в «workTimes» вернуть данные из сниппета, который обрабатывает поля со временем, т.е. отдельный сниппет делает выборку с базы по определенному условию и, по логике, должен вернуть массив с данными — массив возвращаю, но вывод интервалов записи не осуществляется. Вопрос в том, в каком виде должен возвращатся результат работы скрипта. Спасибо заранее! За пример буду очень благодарен!
          Володя
          02 января 2018, 15:53
          0
          'workTimes' =>`[[!snippetName]]`
          Вопрос в том, в каком виде должен возвращатся результат работы скрипта
          сниппет snippetName должен отдавать результат в виде json строки.
            Володя
            02 января 2018, 15:54
            +1
            За пример буду очень благодарен!
            return json_encode([
                '8-9',
                ['time' => '9:00-10:00', 'title' => 'c 9ти до 10'],
                '10:00-11:00',
                '11:00-12:00',
                '12:00-13:00',
                ['time' => '13:00-14:00', 'title' => 'Обеденный перерыв', 'disabled' => true, 'cls' => 'breaktime'],
                '14:00-15:00',
                '15:00-16:00',
                '16:00-17:00',
                '17:00-18:00',
                '18:00-19:00',
                '19:00-20:00',
                '20:00-21:00',
                '21:00-22:00',
                '22:00-23:00',
                '23:00-24:00',
            ]);
              Вовка
              02 января 2018, 16:31
              0
              Большое СПАСИБО!
                Володя
                02 января 2018, 18:09
                0
                пожалуйста!
            Алексей
            19 февраля 2018, 13:24
            0
            Можно ли как-то указать при заказе, что вечернее время дороже на 30% чем дневное?
              Володя
              19 февраля 2018, 13:44
              1
              +1
              пример плагина для расчета стоимости userevents.vgrish.ru/manager/?a=element/plugin/update&id=7
              Добавить проверку на время
              case "UserEventsOnBeforeGetOrderCost":
                      /** @var UserEventsOrderInterface $orderHandler */
                      $orderHandler = $modx->getOption("order", $scriptProperties);
                      if (!$orderHandler OR !($orderHandler instanceof UserEventsOrderInterface)) {
                          return;
                      }
                      $values = $modx->Event->returnedValues;
                      $data = $orderHandler->get();
                   
                      $rid = $modx->getOption("resource", $data);
              
                      $cost = 0;
                      // расчет стоимости согласно своей логике
                      if ($resource = $modx->getObject("modResource", $rid)) {
                          $cost = $resource->get("id") * 100;
                      }
                      
                      $add_cost = 0;
              
              	// проверка на вечернее время
                      $time = isset($data['time']) ? $data['time'] : '';
                      if ($time) {
                          $time = array_map('floatval', explode(',', $time));
                          if ($time[0] >= 19) {
                              $add_cost += $cost / 100 * 30;
                          }
                      }
                      
                      $cost += $add_cost;
              
                      $values["cost"] = $cost;
              
                      $modx->event->returnedValues = $values;
                      break;
                Алексей
                19 февраля 2018, 13:53
                0
                Замечательно! на самом деле углубился в документацию, и там тоже есть ответ на этот вопрос. Спасибо за развернутый ответ!
                Ещё остался момент – как-то показывать время, с учётом часового пояса пользователя сайта? Сейчас я как понимаю, идёт привязка к часовому поясу сервера сайта.
                  Володя
                  19 февраля 2018, 14:00
                  0
                  как-то показывать время, с учётом часового пояса пользователя сайта?
                  попробуйте использовать для этого настройку server_offset_time
                    Алексей
                    19 февраля 2018, 14:17
                    0
                    Я правильно понимаю, что у каждого посетителя сайта может быть свой часовой пояс, его нужно как-то узнать через браузер (просто взяв системное время javascript'ом) и сравнить с серверным системным временем. Затем, путём не хитрых вычислений, выдать доступное время с учётом этих поправок. Я правильно мыслю?
                      Володя
                      19 февраля 2018, 14:52
                      0
                      Нет. Данная настройка лишь поможет скорректировать ваше реальное время с временем на сервере.
              Гущин Сергей
              Гущин Сергей
              15 апреля 2018, 20:14
              0
              Подскажите пожалуйста по вашей 4-ой записи, с интервалами, как правильно учесть количество часов для вывода суммы заказа. То есть например я ставлю стоимость в ресурсе: например, 1000, но если пользователь выбрал 2 часа должно уже получиться 2000 и т.д.
                Володя
                16 апреля 2018, 08:37
                0
                Доброе утро.
                Расчет стоимости идет на событие UserEventsOnBeforeGetOrderCost
                Пример плагина есть в комплекте UserEventsExample, вам нужно только изменить его под свою логику.
                Добавьте после строчки

                $data = $orderHandler->get();
                
                $modx->log(1, print_r($data, 1));
                и увидите в логе все доступные переменные. Вам нужно взять кол-во часов и перемножить на стоимость часа.

                Если возникли трудности — пишите в ТП.
                Спасибо!
                Alex Zhuravlev
                10 июля 2018, 21:11
                0
                Володя добрый вечер, спасибо за плагин.
                У меня пару вопросов:
                1. сейчас можно сделать бронь на время только один раз а как сделать что бы одно время могло забронировать 5 человек, а лучше что бы это указывал менеджер при создании эвента.
                2. Можно ли вывести на страницу календарь с информацией о брони при наведении на дату? (информация для тренеров и администраторов)
                  Alex Zhuravlev
                  10 июля 2018, 21:26
                  0
                  * по второму вопросу: сделать вывод календаря на фронтенде как в бекенде
                    Володя
                    11 июля 2018, 11:28
                    1
                    0
                    Добрый день.
                    1- можно переопределить getReservedEventsCriteria, в нем прописать свою логику
                    пример
                    <?php
                    /** @var modX $modx */
                    /** @var array $scriptProperties */
                    /** @var UserEvents $UserEvents */
                    switch ($modx->event->name) {
                        case 'OnMODXInit':
                            $corePath = $modx->getOption("userevents_core_path", null,
                                $modx->getOption("core_path", null, MODX_CORE_PATH) . "components/userevents/");
                            $UserEvents = $modx->getService("userevents", "UserEvents", $corePath . "model/userevents/",
                                array("core_path" => $corePath));
                            if (!$UserEvents) {
                                return "Could not load userevents class!";
                            }
                            $UserEvents->addExtension('event', 'getReservedEventsCriteria', function ($data = array()) use (&$modx, &$UserEvents) {
                                $filter = isset($data["filter"]) ? $data["filter"] : array();
                                $reserve = isset($data["reserve"]) ? $data["reserve"] : true;
                                $id = isset($data["id"]) ? (int)$data["id"] : null;
                                $resource = isset($data["resource"]) ? (int)$data["resource"] : null;
                                $start = isset($data["start"]) ? $data["start"] : null;
                                $end = isset($data["end"]) ? $data["end"] : null;
                                if (!is_null($id)) {
                                    $filter["Event.id:!="] = $id;
                                }
                                if (!is_null($resource)) {
                                    $filter["Event.resource"] = $resource;
                                }
                                if (!is_null($reserve)) {
                                    $filter["Status.reserve"] = $reserve;
                                }
                                $c = $modx->newQuery("UserEvent");
                                $c->setClassAlias("Event");
                                $c->leftJoin("UserEventStatus", "Status");
                                $c->where($filter);
                                $c->andCondition("(IF(startdate > '$start', startdate, '$start')) < (IF(enddate < '$end', enddate, '$end')) ",
                                    null);
                                $c->sortby("IF(startdate > '$start', startdate, '$start')", "ASC");
                                
                                // добавить логику
                                return $c;
                            });
                            break;
                    }
                      Володя
                      11 июля 2018, 11:29
                      0
                      2 — добавил пример с выводом информации о событиях userevents.vgrish.ru/events/zapis-5.html
                      Андрей Шевяков
                      23 января 2019, 10:59
                      0
                      Добрый день! Help!!!))

                      1) В примере http://userevents.vgrish.ru/events/zapis-1.html, если на какой то промежуток времени уже есть запись, то она блокируется.

                      У меня почему то можно повторно записываться на это же время. Куда копать, где можно установить, что на каждый промежуток времени, одна запись?

                      2) Где прописывается стоимость записи. У меня по умолчанию стоимость выводится равной id ресурса, почему то((. Мне надо задать, что это бесплатно. Куда копать?
                        Володя
                        23 января 2019, 11:06
                        +1
                        1 — статус события может блокировать записать на это время, либо нет. joxi.ru/xAeXEzWTpwzvb2
                        для этого статусу нужно активировать чекбокс резерв

                        2 — Стоимость события рассчитывается на событие UserEventsOnBeforeGetOrderCost, пример расчета указан в плагине UserEventsExample

                        Ненужно дублировать сообщения с ТП тут. Спасибо!
                          Андрей Шевяков
                          23 января 2019, 11:12
                          0
                          Прошу прощения, забыл просто что дополнение платное и есть поддержка. Написал вначале сюда.
                          Спасибо, вопрос решил.
                        Сергей
                        03 октября 2019, 15:05
                        0
                        Не возможно протестировать и просмотреть модуль на сервере modhost.pro. При попытки установить, выдает следующее скрин. Полагаю проблема с правами.
                        Можно организовать запись на курсы, если они длятся несколько дней и запись возможно в ограниченном количестве и записать только в те, что предстоит?
                        Например обучающий курс для дневной группы длить с 1-4 числ для вечерней с 6-10 число — это как один ресурс с одним видом курсов. Будет еще и друге курсы, так-же дневные, вечерние и в выходной день, длятся несколько дней и записаться можно только в первый день начала.
                          Сергей
                          03 октября 2019, 15:19
                          0
                          Со второго раза установилось корректно.
                            Евгений
                            13 октября 2019, 19:24
                            0
                            Добрый вечер. Подскажите, мне нужно сделать для каждого тренера вот такой календарик с возможностью брони в определенный день определенное время (допустим выбрать 5 января с 11:00 до 12:00) без расчёта стоимости, а просто бронь, что бы другой человек уже не могу забронировать это время. Подойдёт ли это решение под мою задачу? Если нет, может есть какие то другие решения? Буду очень благодарен
                              Володя
                              14 октября 2019, 07:27
                              0
                              Доброе утро. пример userevents.vgrish.ru/events/zapis-4.html
                              вместо выбора студии — выбор тренера.
                                Евгений
                                14 октября 2019, 07:31
                                0
                                Доброе утро! У каждого тренера есть своя страница, там будут различаться время проведения тренировок. То есть, нужно на странице каждого тренера размещать такой календарик с разными значениями времени. Пример который вы показали хорош, но немного не то что нужно.
                                  Володя
                                  14 октября 2019, 09:08
                                  0
                                  можете посмотреть на демке другие примеры, так же можно установить пакет на хостинге и попробовать пакет настроив его как вам нужно.
                              Андрей
                              08 декабря 2019, 11:27
                              0
                              Здравствуйте. А можно использовать ваше решение без указания времени? Например, для бронирования номера на сутки?
                                Володя
                                08 декабря 2019, 12:29
                                0
                                Доброе утро. Указать время в скрытом поле, пользователь будет выбирать только дату.
                                  Андрей
                                  08 декабря 2019, 12:34
                                  0
                                  Да, но ведь время обязательный параметр, судя по демо.
                                Андрей
                                08 декабря 2019, 19:14
                                0
                                Подскажите где формируется цена для ресурса и как ее задать?
                                  AMekka
                                  10 апреля 2020, 06:59
                                  0
                                  Подскажите, есть ли возможность задать выбор свободного времени в промежутках не только часы, но и дни?
                                    Dima
                                    13 марта 2021, 22:54
                                    1
                                    0
                                    Подскажите, как можно вывести список всех броней определенного пользователя или определенного ресурса, как я понял выводится только 1 запись которой соответствует id в запросе ?userevents=id
                                      Nikolas
                                      29 января 2023, 20:02
                                      0
                                      Пожалуйста подскажите логику: как правильно учесть количество часов для вывода суммы заказа. То есть например я ставлю стоимость в ресурсе: например, 1000 get(«price») * 1; получает 1000, но если пользователь выбрал 4 часа должно уже получиться 4000 и т.д.
                                        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                        45