[Tickets] Версия 1.4.0-pl

Выложил в репозиторий финальную версию Tickets 1.4.0. По сравнению с 1.3.0 изменений очень много -постараюсь собрать их здесь в одной заметке.

Сначала соберём в кучу предыдущие обновления:

  • Настройки разделов тикетов, которые позволяют гибко конфигурировать потомков: шаблон, uri, показ в меню, обработка тегов и т.п. Отдельная ссылка.
  • Загрузка файлов при создании тикета. Ссылка.
  • Избранные тикеты и комментарии. Ссылка.
  • Управление публикацией тикетов. Ссылка.

А теперь последнее пока улучшение - подписка на новые тикеты.

Подписка на секции

В новой версии можно подписываться на секции тикетов (блоги) и получать письма о публикации нового документа. Работает это по тому же принципу, что и уведомления о комментариях, для чего добавлено 2 новых чанка: - tpl.Tickets.ticket.email.subscription - уведомление о новом тикете на почту

  • tpl.Tickets.sections.wrapper - этот чанк нужно указать в параметре &tplWrapper сниппета getTickets, чтобы вывести чекбокс подписки.

Когда пользователь отмечает чекбокс, в поле properties раздела секий сохраняется массив с подписчиками. При первой публикации нового тикета в этой секции все подписчики получат письмо-уведомление.

Это работает и при публикации из админки, но в админке нельзя указать свой чанк для уведомлений (потому что нигде не вызывается сниппет TicketForm), так что всегда будет использован стандартный tpl.Tickets.ticket.email.subscription.

Улучшение уведомлений

Понятное дело, что для реализации нормальной подписки пришлось внести много исправлений в механизм уведомлений.

Если которотко, то теперь уведомления о новых тикетах и комментариях приходят правильно - только при первой публикации.

Если у вас включена премодерация комментариев, то админ получит уведомление о неопубликованном комменте, а когда он его проверит и опубликует - то уведомления получат все подписчики этой темы. У нас, наконец-то, появилась нормальная премодерация комментариев.

При создании неопубликованного тикета никто не получает уведомлений, даже админы. На мой взгляд, это дело юзера - публиковать или нет, у него сейчас есть все инструменты для этого. Так что, все подписчики блога (и админы) получат уведомление с первой публикацией.

Заодно починил проблемы с возможными двойными уведомлениями, когда админ получал и скрытую копию, и уведомление о комментарии.

Другие улучшения

Изменена автоматическая генерация introtext при создании нового тикета. Теперь у нас есть системная настройка ticket_max_cut, которая указывает максимальное количество символов в тикете, которое можно публиковать без тега cut.

Если символов больше - то будет выдана ошибка, и пользователю придётся проставить этот тег. Если меньше - то весь контент тикета попадёт в introtext.

Добавлена позможность не запоминать оперделенные поля тикета при его создании с фронтенда. Как известно, этим у нас занимается Sisyphus и теперь вы можете указать элементам формы

<input name="field" class="disable-sisyphus" />

и о не будет их запоминать.

Для особого удобства добавил параметр autoPublishGuest сниппету TicketComments. То есть, теперь у него есть 2 параметра для публикации комментариев: - autoPublish - автопубликация комментов от авторизованных пользователей.

  • autoPublishGuest - включает автопубликацию комментов от гостей.

Теперь вам будет очень просто объяснить, зачем пользователю нужно зарегистрироваться на сайте.

Исправлена ошибка в обработке имён превьюшек файлов, при публикации тикета.

Еще исправлены разные ошибки которые были в баг-трекере, типа сломанного параметра innerJoin у getTickets или принудительной обработки intotext сниппетом Jevix, даже если у тикетв указано disable_jevix.

Заключение

Обновляемся, тестируем и пишем отзывы.

Версия довольно неплохо отлажена, но всякое может быть. По мере поступления жалоб буду выпускать заплатки.

Новая версия уже установлена на http://modx.pro, можно тестировать подписку на блоги.

Комментарии (64)
Наумов Алексей
14.04.2014 07:27

Василий, обрати внимание , у тебя где то системная настройка написана как tickets.ticket_max_cut , а где то ticket.ticket_max_cut, из-за этого она не работает.

https://github.com/bezumkin/Tickets/search?q=ticket\_max\_cut&type=Code

bezumkinВасилий Наумкин
14.04.2014 07:32

Спасибо, поправил.

Надежда ВишневскаяНадежда Вишневская
17.04.2014 11:00

Василий, огромное спасибо вам за это дополнение! В Tickets теперь есть все, о чем раньше простые вебмастера могли только мечтать. Единственная задачка, которую я никак не могу решить : голосование, а теперь и добавление в избранное. У меня не отображаются кнопки (стрелки вверх/вниз и звездочка). Вообще, такое ощущение, что у элементов нет стилей, хотя default.css и editor.css подключены. Буду благодарна, если подскажете, как решить эту проблему.

bezumkinВасилий Наумкин
17.04.2014 11:16

Думаю, нужно просто обновить чанки - там же поменялась верстка и стрелочки добавились.

Надежда ВишневскаяНадежда Вишневская
17.04.2014 11:22

Я только поставила это дополнение. Действительно, почему-то нет стилей .glyphicon-arrow-down и .glyphicon-arrow-up. Прописала в основном css, голосование заработало. Думаю, с избранным тоже все получится.

bezumkinВасилий Наумкин
17.04.2014 11:23

Так нужно подключить шрифты glyphicon и Bootstrap 3

RasulAbu
20.04.2014 20:09

Ухх, пропустил фичу новой версии - генерацию introtext и все грешил на свой плагин. В общем все круто, но хорошо бы добавить strip_tags.

Roman Smile
28.04.2014 18:10

При создании обычного документа в админке можно явно передавать шаблон в ссылке (&template=11) и он установится в форме по умолчанию. При создании тикета эта фича не работает.

Roman Smile
28.04.2014 18:24

И через плагин OnDocFormRender не получается выдать шаблон новому тикету как обычным документам:

$modx->controller->setProperty('template', 11);
bezumkinВасилий Наумкин
28.04.2014 18:49

Зато работает фича с выставлением шаблона в настройках секции.

Roman Smile
28.04.2014 19:04

1. Да, я видел выставление настроек в секции. Я там не нашел, кстати, как скинуть обратно в "нет шаблона", если выставил однажды шаблон. Можно только поставить пустой шаблон, но тогда новые тикеты будут наследовать пустой шаблон, а не дефолтный для всех, как если бы было выставлено "нет шаблона". 2. Но все-таки есть ли возможность вернуть приоритет выставления шаблона новому тикету, если оно задается в ссылке или плагине OnDocFormRender? Я сейчас работаю над дополнением, которое позволяло бы задавать шаблоны новым документам на основании шаблонов родителей, проверял возможность интеграции с Тикетс и вот обнаружил такой затык.

Roman Smile
30.04.2014 08:14

Так что вы решили, это баг или фича?) В смысле, планируется к доработке или так было и задумано?

bezumkinВасилий Наумкин
30.04.2014 08:57

Я решил, что мне некогда.

Исходный код открыт - ты можешь прислать pull-request.

Александр Донский
04.05.2014 18:57

Василий, а изменения дефолтной верстки и переименование всех классов не приведет к неработоспособности Tickets? Или есть такие классы, которые нельзя переименовывать/удалять? Почему спрашиваю — у нас верстка по методологии.

bezumkinВасилий Наумкин
05.05.2014 00:28

Тогда нужно будет по методологии переписать и javascript.

gasergeГалич Сергей
07.05.2014 14:04

только у меня если в админке как только-только создашь тикет, на него не генерируется ссылка? (если нажимать например просмотреть)

gasergeГалич Сергей
08.05.2014 07:37

и получается что "заморозить uri" генирируется само по себе при создании и "не показывать в меню", от системной настройки tickets.ticket_hidemenu_force не зависит.

gasergeГалич Сергей
08.05.2014 07:49

а не uri убирается если удалить в настройках секции

bezumkinВасилий Наумкин
08.05.2014 13:02

Может, попробуешь почитать про изменения в новой версии? Например вот здесь есть про hidemenu и формирование uri.

gasergeГалич Сергей
08.05.2014 08:37

решил проблему так: файл core / components / tickets / processors / mgr / ticket / create.class.php

строка 188: $results = $this->modx->cacheManager->generateContext($this->object->context_key, array('cache_context_settings' => false));

заменил на $results = $this->modx->cacheManager->generateContext($this->object->context_key);

хз на что влияет но теперь адекватно сохраняется в админке.

bezumkinВасилий Наумкин
08.05.2014 13:02

Влияет на формирование uri при создании документа с фронтенда.

giv4ikyani
07.05.2014 16:39

а у меня почему то адрес uri дочерних тикетов создается не с alias родителя, а с translit родителя. То есть например не contacts , a kontakti

bezumkinВасилий Наумкин
07.05.2014 21:53

Проверяй uri родителя.

giv4ikyani
08.05.2014 06:20

Pagetitle родителя - "Заявки". Меняла секцию на test и тогда (alias и uri оставляла старые) , и uri нового тикета был test/...html генерация uri у Вас где то переписана или используется стандартная?

bezumkinВасилий Наумкин
08.05.2014 13:00

У меня без изысков берётся uri родителя, и к нему добавляется uri тикета.

$uri = rtrim($section->getAliasPath(),'/') .'/'. str_replace($pls['pl'], $pls['vl'], $template);

Исходник.

giv4ikyani
13.05.2014 19:26

хм, сейчас заметила что и на другом сайте, после обновления тикетов генерируется не так uri как перенесу на сервер, можно дам Вам доступ чтобы лично посмотрели?

bezumkinВасилий Наумкин
14.05.2014 04:14

Я лично смотрю на своих сайтах - всё работает хорошо.

giv4ikyani
14.05.2014 10:08

напомните Ваш email bezumkin@yandex.ru ?

giv4ikyani
12.05.2014 13:02

Василий, добрый вечер. Хотела подключить плагин валидации для формы тикетов, но она не отрабатывает, форма отправляется. на обычных формах все ок, а тут видимо что то не дает делать проверку. вот и интересно, что?

bezumkinВасилий Наумкин
12.05.2014 13:46

Плагин валидации учитывает, что форма с тикетом отправляется через ajax?

giv4ikyani
12.05.2014 14:01

Вообще этот плагин по идее не дает отправить форму, если там есть ошибки. + если у инпутов есть required , то браузер (современный) не должен дать отправить форму.. хотя , у вас обработка получается срабатывает раньше моей Tickets.ticket.save(this.form, this);

Если закомментировать кусок

$(document).on('click touchend', '#ticketForm .preview, #ticketForm .save, #ticketForm .draft, #ticketForm .publish', function(e) {
            if ($(this).hasClass('preview')) {
                Tickets.ticket.preview(this.form, this);
            }
            else {
                Tickets.ticket.save(this.form, this);
            }
            e.preventDefault();
            return false;
        });

то все работает, пойду покопаюсь в коде дальше )

PS забавно, закомментила этот кусок у Вас и прописала у себя Tickets.ticket.save(this.form, this); ошибку конечно прописал, но при этом тикет создал. и валидация сработала

bezumkinВасилий Наумкин
12.05.2014 14:33

А ты в курсе, что сниппету TicketForm можно указать &requiredFields - и он вернёт ошибку, если они не заполнены?

giv4ikyani
12.05.2014 15:39

Конечно, но например мне надо чтобы поле состояло только из цифр, или имело определенную длину (знаю можно это сделать атрибутами инпута) а как быть с селектом? первый селект у меня "Выберите ... " и value="" и валидатор хавает... или он настраивается как в FormIt типа email:required:email:monlength=5 как то так.

bezumkinВасилий Наумкин
12.05.2014 16:39

В MODX этого легко решается плагином на создание ресурса:

<?php
if ($modx->event->name == 'OnBeforeDocFormSave') {
    if ($resource instanceof Ticket) {
        // Проверяем что угодно
        // И выдаем ошибку
        $modx->event->output('У вас ошибка!');
    }
}

Если нужно, можно еще проверять $mode = 'new' - только для новых тикетов.

giv4ikyani
12.05.2014 16:54

Спасибо, вот этого секретика не знала!

Владимир Ребров
23.05.2014 06:27

Здравствуйте.

Почему то не отправляются уведомления о новых комментариях админам. С настройками почты все ок, т.к. с сайта приходят сообщения через FormIt. Почта настроена через SMTP Гугла. Настройки Tickets вот такие http://prntscr.com/3lqv4s

Спасибо.

Алексей
01.06.2014 08:18

При следующем вызове

[[!TicketComments?
&allowGuest=`1`
&enableCaptcha=`0`
&tplComments=`@INLINE <h1>Отзывы (<span id="comment-total">[[+total]]</span>)</h1>`]]

В плэйсхолдер

[[+total]]

ставиться число 6, вне зависимости от кол-ва комментариев. (при запуске через обычный чанк - все ок) Версия tickets 1.4.0pl Версия pdotools 1.9.2pl2 Помнится подобный баг с [[+total]] был в msearch2 при очередном обновлении pdotools

bezumkinВасилий Наумкин
02.06.2014 04:23

Это INLINE чанк, значит плейсхолдеры внутри него обрабатываются до попадания в сниппет.

Если на странице уже выставлен total, то выходит:

&tplComments=`@INLINE <h1>Отзывы (<span id="comment-total">6</span>)</h1>`]]
SetestСтепан Прищепенко
04.06.2014 11:38

Подскажите пожалуйста как сделать сортировку по кол-ву комментариев, а также просмотров. Чувствую, что через join надо, а как, понять не могу.

bezumkinВасилий Наумкин
04.06.2014 16:51

Не советую этого делать - при нескольких тысячах комментов такие джоины начинаю сильно тормозить. Раньше такой функционал был в getTickets, потом пришлось убрать. Если есть желание - посмотри в истории github.

По хорошему, нужно завести отдельную таблицу, куда писать общие цифры и по ней сортировать - но это никому особо не нужно.

SetestСтепан Прищепенко
05.06.2014 06:01

Спасибо! Гитхаб глянул все понятно стало, попробую пока также сделать, посмотрю по скорости.

SetestСтепан Прищепенко
05.06.2014 12:24

В общем получилось вот так, это для сортировки по кол-ву просмотров:


[[!pdoPage?
    &element=`getTickets`
    &limit=`20`
    &sortby=`views`
    &select=`{"View":"COUNT(DISTINCT View.uid) as views"}`
    &leftJoin=`{"View":{"class":"TicketView","alias":"View","on":"Ticket.id=View.parent"}}`
]]
bezumkinВасилий Наумкин
05.06.2014 12:40

Молоток!

Так можно делать почти со всеми pdoTools-сниппетами =)

SetestСтепан Прищепенко
11.06.2014 14:42

Нашел проблемку, при вызове из сниппета pdoPage с запросом where с типом string, происходят разные запросы. Дело в том что метод addWhere в pdoFetch отличается от того способа что используется в тикетах:

// Add custom parameters
foreach (array('where','select','leftJoin') as $v) {
    if (!empty($scriptProperties[$v])) {
        $tmp = $modx->fromJSON($scriptProperties[$v]);
        if (is_array($tmp)) {
            $$v = array_merge($$v, $tmp);
        }
    }
    unset($scriptProperties[$v]);
}

Нужно подлечить.

Владимир
17.06.2014 17:16

Василий, когда добавляется новый коментарий, идет переадресация на адрес вида (адрес/адрес/адрес)#comment-3

как проще сделать чтобы переадресация шла просто на адрес тикета? (т.е на (адрес/адрес/адрес) БЕЗ - #comment-3)

спасибо

bezumkinВасилий Наумкин
18.06.2014 00:40
Владимир
18.06.2014 06:13

спасибо

Серегй
03.07.2014 02:45

Василий, подскажите в чем проблема. Не приходит письмо на премодерацию комментариев.

&autoPublishGuest=1 - так письма приходят. &autoPublishGuest=0 - а так нет.

bezumkinВасилий Наумкин
03.07.2014 02:48

Не знаю, видимо глюк, пиши https://github.com/bezumkin/Tickets/issues/new

Miho7Михаил
06.08.2014 02:09

Здравствуйте! Василий, подскажите пожалуйста по моей проблеме. После обновления на MODx 2.3.1, тикетс ругается что чего то не найдено.

Об этом уже писали, что "В js админском необходимо заменить путь getlist на element/template/getlist", но я так и не нашёл где именно заменить этот путь и решит ли это всю проблему.

Подскажите пожалуйста файл в котором надо поправить путь?

Miho7Михаил
06.08.2014 07:55

.

Максим Кузнецов
13.08.2014 14:45

Я знаю, что баг совершенно детский, но я сломал голову, пока пытался понять, почему у меня упорно не работает этот компонент.

Причина: хтмл-разтметке были указаны теги HEAD и BODY заглавными буквами. Итог: модуль не находил, куда подключать скрипты и не работал..

%)

bezumkinВасилий Наумкин
13.08.2014 17:02

Круто.

Для подключения скриптов и стилей используются методы MODX, так что в таких условиях не будут работать все подобные компоненты, а не только Tickets.

RayEagleРоман
25.08.2014 12:45

Была установлена версия 1.2.3, всё работало прекрасно. Обновился до 1.4.2, работает, но при авторизации пользователя перестают отображаться предыдущие комментарии. А если заходит неавторизованный гость, то все комментарии видны. Куда копать? Чанки при обновлении не переписывал, мало того, используются чанки не по-умолчанию, а свои, т.е. при обновлении не должны были перезаписаться.

RayEagleРоман
27.08.2014 08:47

P.S. Только что посмотрел в логах, при входе на страницу зарегистрированного пользователя выскакивает вот такая ошибка:

[2014-08-27 12:39:41] (ERROR @ /index.php) [pdoTools] Error 23000: Column 'parent' in field list is ambiguous

что бы это значило?

RayEagleРоман
30.08.2014 12:06

P.P.S. Меняю чанк TicketComments на старую версию, всё начинает работать. Смею предположить, что что-то не так именно в этом чанке.

Максим Кузнецов
18.09.2014 03:34

Здравствуйте. Подскажите, пожалуйста, с чем может быть связана проблема:

вызов сниппета:

[[!TicketComments? &depth=`3` &thread=`newsId-[[*id]]`]]

Права пользователям были добавлены, визивиг отключен. Форма корректно обрабатывает ошибки (пустые поля и тд) и дает отправлять комментарий с аккаунта администратора, но при попытке отправления комментария любой другой группой консоль выдает следующее:

data: [{error:{id:name, msg:Это поле обязательно.}, field:name, message:Это поле обязательно.]}
message: ""
success: false

— при том, что текстовая область не пустая и jgrowl ошибку не выдает.

Подскажите, пожалуйста, в чем может быть причина?

bezumkinВасилий Наумкин
18.09.2014 04:35

Говорит, имени нет у пользователя.

Максим Кузнецов
18.09.2014 04:43

Подскажите, пожалуйста - можно ли при помощи базовых опций сниппета выставить имя пользователя как username?

bezumkinВасилий Наумкин
19.09.2014 04:23

Я точно не помню, так что тут 2 варианта: 1. Сделать hidden input, куда вставить username пользователя, чтобы он отправлялся с комментарием. Не уверен, что сработает.

2. Написать простенький плагин на загрузку страницы, чтобы при пустом fullname у юзера, туда копировался username и сохранялся. Это сработает 100%.

Максим Кузнецов
19.09.2014 11:34

Спасибо большое за помощь. В итоге решил сделать так:

core/components/tickets/model/tickets/tickets.class.php строка 393 и 428 заменил на:

$comment['name'] = $this->modx->user->username;
$data['name'] = $this->modx->user->username;
sergantСергей Шлоков
31.10.2014 19:19

Василий, подскажи, пожалуйста, в настройках Tickets я выставил уровень уведомления администратора 0. Но мне все равно приходят письма. Why?

bezumkinВасилий Наумкин
01.11.2014 04:05

Не знаю, наверное где-то в коде ошибка.

igor
22.11.2014 07:28

привет Василий! А подскажи как мне вывести последние комментарии с кусочком текста комментария

<div class="tickets-latest-row[[+guest]]">
    <span class="user"><i class="fa fa-user fa-lg"></i> [[+fullname]]</span> <span class="date">[[+date_ago]]</span>
    
    <span class="ticket">
        По товару: <a href="[[~[[+ticket.id]]]]#comment-[[+id]]">[[+ticket.pagetitle]]</a>
    </span>
    <nobr><i class="fa fa-comment"></i> <span class="comments">[[+comments]]</span></nobr>
          [[+text]]
</div>
<!--tickets_guest  ticket-comment-guest-->

так выводит весь текст комментария

<div class="tickets-latest-row[[+guest]]">
    <span class="user"><i class="fa fa-user fa-lg"></i> [[+fullname]]</span> <span class="date">[[+date_ago]]</span>
    
    <span class="ticket">
        По товару: <a href="[[~[[+ticket.id]]]]#comment-[[+id]]">[[+ticket.pagetitle]]</a>
    </span>
    <nobr><i class="fa fa-comment"></i> <span class="comments">[[+comments]]</span></nobr>
          [[+text:ellipsis=`50`]]
</div>
<!--tickets_guest  ticket-comment-guest-->

а так обрезка не работает как обрезать?

ЕвгенийК
09.04.2022 03:35
Это хорошо, что такая возможность есть и может быть использована. А то тенденция, мания, что-то в по...
begoodco1
07.04.2022 05:49
Зарегистрировался чтобы выразить благодарность за доступное и подробное описание процесса. Была возм...
bezumkin
Василий Наумкин
18.03.2022 12:35
Авторизация есть из коробки, для входа в базовую админку. Можно установить через composer и собрать ...
bezumkin
Василий Наумкин
10.03.2022 12:08
Ну, я имел в виду, что по закону можно =) А в реальности с валютой очевидные проблемы.
Сергей Лелеко
04.03.2022 06:12
О как! не знал! спасибо
bezumkin
Василий Наумкин
01.03.2022 15:32
Я делал одного бота на botman/botman, но из-за своей универсальности конкретно с Телеграм на нём раб...
bezumkin
Василий Наумкин
25.02.2022 09:22
P.S. Кажется цитаты у тебя никак не стилизуются в комментариях... Спасибо, поправил!
Electrica
Михаил
08.02.2022 11:19
Работает!
Алексей
09.01.2019 10:55
Насыщенный год ) От души поздравляю с ДР! Счастья, успехов и семейного благополучия! Жаль лимит заме...
septa rose
28.05.2018 22:16
hmmm, keren abis