[UserEvents] - события пользователя.
Компонент реализует функционал создания пользователями событий на ресурсы.
Особенности:
— создание событий как на фронте, так и в админке сайта
— интеграция с miniShop2 (заказы, оплата)
Демо сайт userevents.vgrish.ru
Логин и пароль для входа в админку test
вкладка компонента
Основная панель управления находятся в отдельном разделе сайта, доступном через меню.
Содержит вкладки:
— события
— статусы
Сниппет ue.order
Выводит форму оформления заказа/ бронирование события.
Сниппет ue.get.order
Вывод оформленного заказа/ забронированного события.
Важно!
— оплата бронирования реализована через методы оплаты miniShop
— все сниппеты UserEvents работают при помощи pdoTools и рассчитывают на использование Fenom в чанках.
— компонент требует предварительной установки pdoTools и miniShop
— при создании события без заказа оповещения на смену статусов придется писать самостоятельно. Пример есть в документации.
PS. Кратко пока вся информация, подробнее в документации. Спасибо за внимание.
Особенности:
— создание событий как на фронте, так и в админке сайта
— интеграция с miniShop2 (заказы, оплата)
Демо сайт userevents.vgrish.ru
Логин и пароль для входа в админку test
вкладка компонента
Основная панель управления находятся в отдельном разделе сайта, доступном через меню.
Содержит вкладки:
— события
— статусы
Сниппет ue.order
Выводит форму оформления заказа/ бронирование события.
Сниппет ue.get.order
Вывод оформленного заказа/ забронированного события.
Важно!
— оплата бронирования реализована через методы оплаты miniShop
— все сниппеты UserEvents работают при помощи pdoTools и рассчитывают на использование Fenom в чанках.
— компонент требует предварительной установки pdoTools и miniShop
— при создании события без заказа оповещения на смену статусов придется писать самостоятельно. Пример есть в документации.
PS. Кратко пока вся информация, подробнее в документации. Спасибо за внимание.
Поблагодарить автора
Отправить деньги
Комментарии: 45
Вещь!
Спасибо!)
Для консалтинга самое то. Теперь осталось дождаться доков с подробностями)
Спасибо!
Володь, какова цена будет?
1500
А как места создаются, не нашел ни на скринах не в доках?
Если надо будет много мест типа выбора мест в зале 20*20?
Если надо будет много мест типа выбора мест в зале 20*20?
Сергей а нет никаких мест. Для создания события необходим ресурс и пользователь (почта).
В качестве так называемого места может выступать любой ресурс.
на событие UserEventsOnBeforeGetOrderCost пишите плагин docs.modx.pro/components/userevents/development/events
там согласно вашей логике будет расчет стоимости. У вас может быть твердая стоимость, может быть какая либо тарифная сетка и тд.
Можно конечно было прикрутить это в админку, но сохранить при этом гибкость расчета я не придумал как.
Так что все в ваших руках…
Если надо будет много мест типа выбора мест в зале 20*20?
можно создать 20*20 ресурсов и разместить их в форму заказа, пример userevents.vgrish.ru/events/zapis-3.html
В качестве так называемого места может выступать любой ресурс.
на событие UserEventsOnBeforeGetOrderCost пишите плагин docs.modx.pro/components/userevents/development/events
там согласно вашей логике будет расчет стоимости. У вас может быть твердая стоимость, может быть какая либо тарифная сетка и тд.
Можно конечно было прикрутить это в админку, но сохранить при этом гибкость расчета я не придумал как.
Так что все в ваших руках…
Если надо будет много мест типа выбора мест в зале 20*20?
можно создать 20*20 ресурсов и разместить их в форму заказа, пример userevents.vgrish.ru/events/zapis-3.html
Потестил компонент на modhost.pro — как всегда, Володя, молодец, отличная штука получилась!
Что бы хотелось добавить:
Было бы неплохо добавить в системные настройки указание группы пользователей для выбора юзера при создании события, допустим есть группа тренеров и только из неё можно выбирать, сейчас выбор среди всех юзеров системы.
И круто было бы иметь возможность создавать такие таблицы-расписания в нескольких экземплярах, под разные группы событий, например, есть группа — тренинги, у неё своя таблица событий, своя группа пользователей (тренеров, которых можно выбирать в списке создания события) и своя группа, куда регистрируются заказчики.
И есть группа, например, марафоны — тоже со своей группой ведущих и группой регистрирующихся.
Что бы хотелось добавить:
Было бы неплохо добавить в системные настройки указание группы пользователей для выбора юзера при создании события, допустим есть группа тренеров и только из неё можно выбирать, сейчас выбор среди всех юзеров системы.
И круто было бы иметь возможность создавать такие таблицы-расписания в нескольких экземплярах, под разные группы событий, например, есть группа — тренинги, у неё своя таблица событий, своя группа пользователей (тренеров, которых можно выбирать в списке создания события) и своя группа, куда регистрируются заказчики.
И есть группа, например, марафоны — тоже со своей группой ведущих и группой регистрирующихся.
молодец, отличная штука получилась!Спасибо!
Было бы неплохо добавить в системные настройки указание группы пользователей для выбора юзера при создании события, допустим есть группа тренеров и только из неё можно выбирать, сейчас выбор среди всех юзеров системы.пока не вижу в этом смысла, только при каком то дальнейшем развитии компонента в ту сторону что вы описали ниже.
И круто было бы иметь возможность создавать такие таблицы-расписания в нескольких экземплярах, под разные группы событий, например, есть группа — тренинги, у неё своя таблица событий, своя группа пользователей (тренеров, которых можно выбирать в списке создания события) и своя группа, куда регистрируются заказчики.Излишне усложнять компонент пока не планирую…
И есть группа, например, марафоны — тоже со своей группой ведущих и группой регистрирующихся.
Добрый день! Возник вопрос по формированию данных для вывода времени, т.е. данный кусок (взят из примера на демо сайте)
Собственно не могу разобраться как в «workTimes» вернуть данные из сниппета, который обрабатывает поля со временем, т.е. отдельный сниппет делает выборку с базы по определенному условию и, по логике, должен вернуть массив с данными — массив возвращаю, но вывод интервалов записи не осуществляется. Вопрос в том, в каком виде должен возвращатся результат работы скрипта. Спасибо заранее! За пример буду очень благодарен!
{'!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» вернуть данные из сниппета, который обрабатывает поля со временем, т.е. отдельный сниппет делает выборку с базы по определенному условию и, по логике, должен вернуть массив с данными — массив возвращаю, но вывод интервалов записи не осуществляется. Вопрос в том, в каком виде должен возвращатся результат работы скрипта. Спасибо заранее! За пример буду очень благодарен!
'workTimes' =>`[[!snippetName]]`
Вопрос в том, в каком виде должен возвращатся результат работы скриптасниппет snippetName должен отдавать результат в виде json строки.
За пример буду очень благодарен!
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',
]);
Большое СПАСИБО!
пожалуйста!
Можно ли как-то указать при заказе, что вечернее время дороже на 30% чем дневное?
пример плагина для расчета стоимости 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;
Замечательно! на самом деле углубился в документацию, и там тоже есть ответ на этот вопрос. Спасибо за развернутый ответ!
Ещё остался момент – как-то показывать время, с учётом часового пояса пользователя сайта? Сейчас я как понимаю, идёт привязка к часовому поясу сервера сайта.
Ещё остался момент – как-то показывать время, с учётом часового пояса пользователя сайта? Сейчас я как понимаю, идёт привязка к часовому поясу сервера сайта.
как-то показывать время, с учётом часового пояса пользователя сайта?попробуйте использовать для этого настройку server_offset_time
Я правильно понимаю, что у каждого посетителя сайта может быть свой часовой пояс, его нужно как-то узнать через браузер (просто взяв системное время javascript'ом) и сравнить с серверным системным временем. Затем, путём не хитрых вычислений, выдать доступное время с учётом этих поправок. Я правильно мыслю?
Нет. Данная настройка лишь поможет скорректировать ваше реальное время с временем на сервере.
Подскажите пожалуйста по вашей 4-ой записи, с интервалами, как правильно учесть количество часов для вывода суммы заказа. То есть например я ставлю стоимость в ресурсе: например, 1000, но если пользователь выбрал 2 часа должно уже получиться 2000 и т.д.
Доброе утро.
Расчет стоимости идет на событие UserEventsOnBeforeGetOrderCost
Пример плагина есть в комплекте UserEventsExample, вам нужно только изменить его под свою логику.
Добавьте после строчки
Если возникли трудности — пишите в ТП.
Спасибо!
Расчет стоимости идет на событие UserEventsOnBeforeGetOrderCost
Пример плагина есть в комплекте UserEventsExample, вам нужно только изменить его под свою логику.
Добавьте после строчки
$data = $orderHandler->get();
$modx->log(1, print_r($data, 1));
и увидите в логе все доступные переменные. Вам нужно взять кол-во часов и перемножить на стоимость часа.Если возникли трудности — пишите в ТП.
Спасибо!
Володя добрый вечер, спасибо за плагин.
У меня пару вопросов:
1. сейчас можно сделать бронь на время только один раз а как сделать что бы одно время могло забронировать 5 человек, а лучше что бы это указывал менеджер при создании эвента.
2. Можно ли вывести на страницу календарь с информацией о брони при наведении на дату? (информация для тренеров и администраторов)
У меня пару вопросов:
1. сейчас можно сделать бронь на время только один раз а как сделать что бы одно время могло забронировать 5 человек, а лучше что бы это указывал менеджер при создании эвента.
2. Можно ли вывести на страницу календарь с информацией о брони при наведении на дату? (информация для тренеров и администраторов)
* по второму вопросу: сделать вывод календаря на фронтенде как в бекенде
Добрый день.
1- можно переопределить getReservedEventsCriteria, в нем прописать свою логику
пример
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;
}
2 — добавил пример с выводом информации о событиях userevents.vgrish.ru/events/zapis-5.html
Добрый день! Help!!!))
1) В примере http://userevents.vgrish.ru/events/zapis-1.html, если на какой то промежуток времени уже есть запись, то она блокируется.
У меня почему то можно повторно записываться на это же время. Куда копать, где можно установить, что на каждый промежуток времени, одна запись?
2) Где прописывается стоимость записи. У меня по умолчанию стоимость выводится равной id ресурса, почему то((. Мне надо задать, что это бесплатно. Куда копать?
1) В примере http://userevents.vgrish.ru/events/zapis-1.html, если на какой то промежуток времени уже есть запись, то она блокируется.
У меня почему то можно повторно записываться на это же время. Куда копать, где можно установить, что на каждый промежуток времени, одна запись?
2) Где прописывается стоимость записи. У меня по умолчанию стоимость выводится равной id ресурса, почему то((. Мне надо задать, что это бесплатно. Куда копать?
1 — статус события может блокировать записать на это время, либо нет. joxi.ru/xAeXEzWTpwzvb2
для этого статусу нужно активировать чекбокс резерв
2 — Стоимость события рассчитывается на событие UserEventsOnBeforeGetOrderCost, пример расчета указан в плагине UserEventsExample
Ненужно дублировать сообщения с ТП тут. Спасибо!
для этого статусу нужно активировать чекбокс резерв
2 — Стоимость события рассчитывается на событие UserEventsOnBeforeGetOrderCost, пример расчета указан в плагине UserEventsExample
Ненужно дублировать сообщения с ТП тут. Спасибо!
Прошу прощения, забыл просто что дополнение платное и есть поддержка. Написал вначале сюда.
Спасибо, вопрос решил.
Спасибо, вопрос решил.
Не возможно протестировать и просмотреть модуль на сервере modhost.pro. При попытки установить, выдает следующее скрин. Полагаю проблема с правами.
Можно организовать запись на курсы, если они длятся несколько дней и запись возможно в ограниченном количестве и записать только в те, что предстоит?
Например обучающий курс для дневной группы длить с 1-4 числ для вечерней с 6-10 число — это как один ресурс с одним видом курсов. Будет еще и друге курсы, так-же дневные, вечерние и в выходной день, длятся несколько дней и записаться можно только в первый день начала.
Можно организовать запись на курсы, если они длятся несколько дней и запись возможно в ограниченном количестве и записать только в те, что предстоит?
Например обучающий курс для дневной группы длить с 1-4 числ для вечерней с 6-10 число — это как один ресурс с одним видом курсов. Будет еще и друге курсы, так-же дневные, вечерние и в выходной день, длятся несколько дней и записаться можно только в первый день начала.
Со второго раза установилось корректно.
Добрый вечер. Подскажите, мне нужно сделать для каждого тренера вот такой календарик с возможностью брони в определенный день определенное время (допустим выбрать 5 января с 11:00 до 12:00) без расчёта стоимости, а просто бронь, что бы другой человек уже не могу забронировать это время. Подойдёт ли это решение под мою задачу? Если нет, может есть какие то другие решения? Буду очень благодарен
Доброе утро. пример userevents.vgrish.ru/events/zapis-4.html
вместо выбора студии — выбор тренера.
вместо выбора студии — выбор тренера.
Доброе утро! У каждого тренера есть своя страница, там будут различаться время проведения тренировок. То есть, нужно на странице каждого тренера размещать такой календарик с разными значениями времени. Пример который вы показали хорош, но немного не то что нужно.
можете посмотреть на демке другие примеры, так же можно установить пакет на хостинге и попробовать пакет настроив его как вам нужно.
Здравствуйте. А можно использовать ваше решение без указания времени? Например, для бронирования номера на сутки?
Доброе утро. Указать время в скрытом поле, пользователь будет выбирать только дату.
Да, но ведь время обязательный параметр, судя по демо.
Подскажите где формируется цена для ресурса и как ее задать?
Подскажите, есть ли возможность задать выбор свободного времени в промежутках не только часы, но и дни?
Подскажите, как можно вывести список всех броней определенного пользователя или определенного ресурса, как я понял выводится только 1 запись которой соответствует id в запросе ?userevents=id
Пожалуйста подскажите логику: как правильно учесть количество часов для вывода суммы заказа. То есть например я ставлю стоимость в ресурсе: например, 1000 get(«price») * 1; получает 1000, но если пользователь выбрал 4 часа должно уже получиться 4000 и т.д.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.