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

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

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

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

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


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


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

PS. Кратко пока вся информация, подробнее в документации. Спасибо за внимание.
Володя
18 октября 2017, 07:59
9
693
+22

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

Владимир
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
Sem
Sem
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
    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