Создание тикета без регистрации [Tickets]
Как известно для создания тикетов пользователь должен авторизоваться на сайте, но не всегда это бывает необходимо. Порывшись на форуме понял что из коробки этого не сделать.
Если кому интересно мое решение прошу подкат.
Данное решение будет актуально если у нас отсутсвует авторизация пользователей на сайте в принципе, в противном случае, думаю, не подойдет.
Суть заключается в том, чтобы создать пользователя и в скрытом режиме авторизовывать его на сайте.
Создаем в админке группу «Создание отзыва» и даем права на наш контекст (web) TicketUserPolicy и Context. Создаем пользователя ticketUser и добавляем его в группу.
Для авторизации есть простой способ. Создаем сниппет loginTicketUser:
Решение не самое красивое но работающее. Если в чем-то не прав сильно не ругайте =)
[UPD]
В качестве альтернативного способа для авторизации можно использовать сниппет без процессора, он оказался быстрее и проще для восприятия.
Если кому интересно мое решение прошу подкат.
Данное решение будет актуально если у нас отсутсвует авторизация пользователей на сайте в принципе, в противном случае, думаю, не подойдет.
Суть заключается в том, чтобы создать пользователя и в скрытом режиме авторизовывать его на сайте.
Создаем в админке группу «Создание отзыва» и даем права на наш контекст (web) TicketUserPolicy и Context. Создаем пользователя ticketUser и добавляем его в группу.
Для авторизации есть простой способ. Создаем сниппет loginTicketUser:
<?php
$ctx = $modx->context->get('key');
$username = 'ticketUser';
$password = '********';
$data = array(
'username' => $username
,'password' => $password
,'rememberme' => 0
,'login_context' => $ctx
);
$response = $modx->runProcessor('/security/login', $data);
if ($response->isError()) {
$modx->log(modX::LOG_LEVEL_ERROR, 'login error. Username: '.$username.', Message: '.$response->getMessage());
}Теперь нам необходимо отредактировать сниппет TicketForm. В 7 строчке сниппет проверяет авторизован ли пользователь на сайте и если нет, то выдает сообщение. Я закомментировал вывод сообщения вместо этого вызываем наш сниппет:if (!$Tickets->authenticated) {
//return $modx->lexicon('ticket_err_no_auth');
$modx->runSnippet('loginTicketUser');
}Вот собственно и все. По сути переходя на страницу с созданием тикета мы авторизуем пользователя в нужном нам контексте с соответствующими правами. Для того, чтобы после создания тикета нас не перекидывало на страницу редактирования, можем добавить чанк tplFormUpdate где будем выводить сообщение об успешном добавлении тикета.Решение не самое красивое но работающее. Если в чем-то не прав сильно не ругайте =)
[UPD]
В качестве альтернативного способа для авторизации можно использовать сниппет без процессора, он оказался быстрее и проще для восприятия.
<?php
$ctx = $modx->context->get('key');
$uid = 4; // ID пользователя
if ($user = $modx->getObject('modUser', $uid)) {
$modx->user = $user;
$modx->user->addSessionContext($ctx);
} Комментарии: 17
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Отсюда вытекает проблема. Данное решение не работает в других контекстах. Например, [ru] и [en].
Что касается универсальности можно указать тот контекст где тебе нужно, да и если честно задачи сделать универсальным не стояло. Я просто оч много видел коментов на эту тему и раз уж до чего-то додумался решил поделиться.
Не в админке, а в текущем контексте.
Если уж ты предложил это как готовое решение, то нужно докрутить до универсальности. Например, так, с учетом предложения Виталия вызывать сниппет перед сниппетом TicketForm:
Что касается контекста, спасибо Сергею за наводку поправил.
Тем не менее авторизация только при втором заходе на страницу — не решает проблемы.
Способ без процессора можно использовать но править TicketForm так или иначе придется =(
Добавлю Ваш способ как альтернативный сниппет авторизации, мне больше понравилось =)