[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.

Заключение

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

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

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

Следующая заметка
Новости iOS приложения mxManager
Предыдущая заметка
[Tickets] Версия 1.4.0-rc7 Публикация тикетов


Комментарии ()

  1. Наумов Алексей 14 апреля 2014, 11:27 # 0
    Василий, обрати внимание, у тебя где то системная настройка написана как tickets.ticket_max_cut, а где то ticket.ticket_max_cut, из-за этого она не работает.

    github.com/bezumkin/Tickets/search?q=ticket_max_cut&type=Code
    1. Василий Наумкин 14 апреля 2014, 11:32 # 0
      Спасибо, поправил.
    2. Надежда Вишневская 17 апреля 2014, 15:00 # 0
      Василий, огромное спасибо вам за это дополнение! В Tickets теперь есть все, о чем раньше простые вебмастера могли только мечтать. Единственная задачка, которую я никак не могу решить: голосование, а теперь и добавление в избранное. У меня не отображаются кнопки (стрелки вверх/вниз и звездочка). Вообще, такое ощущение, что у элементов нет стилей, хотя default.css и editor.css подключены. Буду благодарна, если подскажете, как решить эту проблему.
      1. Василий Наумкин 17 апреля 2014, 15:16 # 0
        Думаю, нужно просто обновить чанки — там же поменялась верстка и стрелочки добавились.
        1. Надежда Вишневская 17 апреля 2014, 15:22 # 0
          Я только поставила это дополнение. Действительно, почему-то нет стилей .glyphicon-arrow-down и .glyphicon-arrow-up. Прописала в основном css, голосование заработало. Думаю, с избранным тоже все получится.
          1. Василий Наумкин 17 апреля 2014, 15:23 # +1
            Так нужно подключить шрифты glyphicon и Bootstrap 3
      2. Abu 21 апреля 2014, 00:09 # 0
        Ухх, пропустил фичу новой версии — генерацию introtext и все грешил на свой плагин.
        В общем все круто, но хорошо бы добавить strip_tags.
        1. Roman Smile 28 апреля 2014, 22:10 # 0
          При создании обычного документа в админке можно явно передавать шаблон в ссылке (&template=11) и он установится в форме по умолчанию. При создании тикета эта фича не работает.
          1. Roman Smile 28 апреля 2014, 22:24 # 0
            И через плагин OnDocFormRender не получается выдать шаблон новому тикету как обычным документам:
            $modx->controller->setProperty('template', 11);
            1. Василий Наумкин 28 апреля 2014, 22:49 # 0
              Зато работает фича с выставлением шаблона в настройках секции.
              1. Roman Smile 28 апреля 2014, 23:04 # 0
                1. Да, я видел выставление настроек в секции. Я там не нашел, кстати, как скинуть обратно в «нет шаблона», если выставил однажды шаблон. Можно только поставить пустой шаблон, но тогда новые тикеты будут наследовать пустой шаблон, а не дефолтный для всех, как если бы было выставлено «нет шаблона».
                2. Но все-таки есть ли возможность вернуть приоритет выставления шаблона новому тикету, если оно задается в ссылке или плагине OnDocFormRender? Я сейчас работаю над дополнением, которое позволяло бы задавать шаблоны новым документам на основании шаблонов родителей, проверял возможность интеграции с Тикетс и вот обнаружил такой затык.
                1. Roman Smile 30 апреля 2014, 12:14 # 0
                  Так что вы решили, это баг или фича?) В смысле, планируется к доработке или так было и задумано?
                  1. Василий Наумкин 30 апреля 2014, 12:57 # 0
                    Я решил, что мне некогда.

                    Исходный код открыт — ты можешь прислать pull-request.
              2. Александр Донский 04 мая 2014, 22:57 # 0
                Василий, а изменения дефолтной верстки и переименование всех классов не приведет к неработоспособности Tickets? Или есть такие классы, которые нельзя переименовывать/удалять?
                Почему спрашиваю — у нас верстка по методологии.
                1. Василий Наумкин 05 мая 2014, 04:28 # 0
                  Тогда нужно будет по методологии переписать и javascript.
                2. Галич Сергей 07 мая 2014, 18:04 # 0
                  только у меня если в админке как только-только создашь тикет, на него не генерируется ссылка? (если нажимать например просмотреть)
                  1. Галич Сергей 08 мая 2014, 11:37 # 0
                    и получается что «заморозить uri» генирируется само по себе при создании
                    и «не показывать в меню», от системной настройки tickets.ticket_hidemenu_force не зависит.
                    1. Галич Сергей 08 мая 2014, 11:49 # 0
                      а не uri убирается если удалить в настройках секции
                      1. Василий Наумкин 08 мая 2014, 17:02 # 0
                        Может, попробуешь почитать про изменения в новой версии? Например вот здесь есть про hidemenu и формирование uri.
                      2. Галич Сергей 08 мая 2014, 12:37 # 0
                        решил проблему так:
                        файл
                        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);

                        хз на что влияет но теперь адекватно сохраняется в админке.
                        1. Василий Наумкин 08 мая 2014, 17:02 # 0
                          Влияет на формирование uri при создании документа с фронтенда.
                      3. yani 07 мая 2014, 20:39 # 0
                        а у меня почему то адрес uri дочерних тикетов создается не с alias родителя, а с translit родителя. То есть например не contacts, a kontakti
                        1. Василий Наумкин 08 мая 2014, 01:53 # 0
                          Проверяй uri родителя.
                          1. yani 08 мая 2014, 10:20 # 0

                            Pagetitle родителя — «Заявки». Меняла секцию на test и тогда (alias и uri оставляла старые), и uri нового тикета был test/...html
                            генерация uri у Вас где то переписана или используется стандартная?
                            1. Василий Наумкин 08 мая 2014, 17:00 # 0
                              У меня без изысков берётся uri родителя, и к нему добавляется uri тикета.
                              $uri = rtrim($section->getAliasPath(),'/') .'/'. str_replace($pls['pl'], $pls['vl'], $template);
                              Исходник.
                              1. yani 13 мая 2014, 23:26 # 0
                                хм, сейчас заметила что и на другом сайте, после обновления тикетов генерируется не так uri
                                как перенесу на сервер, можно дам Вам доступ чтобы лично посмотрели?
                                1. Василий Наумкин 14 мая 2014, 08:14 # 0
                                  Я лично смотрю на своих сайтах — всё работает хорошо.
                                  1. yani 14 мая 2014, 14:08 # 0
                                    напомните Ваш email
                                    bezumkin@yandex.ru?
                        2. yani 12 мая 2014, 17:02 # 0
                          Василий, добрый вечер.
                          Хотела подключить плагин валидации для формы тикетов, но она не отрабатывает, форма отправляется.
                          на обычных формах все ок, а тут видимо что то не дает делать проверку. вот и интересно, что?
                          1. Василий Наумкин 12 мая 2014, 17:46 # 0
                            Плагин валидации учитывает, что форма с тикетом отправляется через ajax?
                            1. yani 12 мая 2014, 18:01 # 0
                              Вообще этот плагин по идее не дает отправить форму, если там есть ошибки. + если у инпутов есть 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);
                              ошибку конечно прописал, но при этом тикет создал. и валидация сработала
                              1. Василий Наумкин 12 мая 2014, 18:33 # 0
                                А ты в курсе, что сниппету TicketForm можно указать &requiredFields — и он вернёт ошибку, если они не заполнены?
                                1. yani 12 мая 2014, 19:39 # 0
                                  Конечно, но например мне надо чтобы поле состояло только из цифр, или имело определенную длину (знаю можно это сделать атрибутами инпута)
                                  а как быть с селектом? первый селект у меня «Выберите… » и value=""
                                  и валидатор хавает…
                                  или он настраивается как в FormIt типа email:required:email:monlength=`5` как то так.
                                  1. Василий Наумкин 12 мая 2014, 20:39 # 0
                                    В MODX этого легко решается плагином на создание ресурса:
                                    <?php
                                    if ($modx->event->name == 'OnBeforeDocFormSave') {
                                    	if ($resource instanceof Ticket) {
                                    		// Проверяем что угодно
                                    		// И выдаем ошибку
                                    		$modx->event->output('У вас ошибка!');
                                    	}
                                    }
                                    Если нужно, можно еще проверять $mode = 'new' — только для новых тикетов.
                                    1. yani 12 мая 2014, 20:54 # 0
                                      Спасибо, вот этого секретика не знала!
                          2. Владимир Ребров 23 мая 2014, 10:27 # 0
                            Здравствуйте.

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

                            Спасибо.
                            1. Алексей 01 июня 2014, 12:18 # 0
                              При следующем вызове
                              [[!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
                              1. Василий Наумкин 02 июня 2014, 08:23 # 0
                                Это INLINE чанк, значит плейсхолдеры внутри него обрабатываются до попадания в сниппет.

                                Если на странице уже выставлен total, то выходит:
                                &tplComments=`@INLINE <h1>Отзывы (<span id="comment-total">6</span>)</h1>`]]
                              2. Степан Прищепенко 04 июня 2014, 15:38 # 0
                                Подскажите пожалуйста как сделать сортировку по кол-ву комментариев, а также просмотров. Чувствую, что через join надо, а как, понять не могу.
                                1. Василий Наумкин 04 июня 2014, 20:51 # 0
                                  Не советую этого делать — при нескольких тысячах комментов такие джоины начинаю сильно тормозить. Раньше такой функционал был в getTickets, потом пришлось убрать. Если есть желание — посмотри в истории github.

                                  По хорошему, нужно завести отдельную таблицу, куда писать общие цифры и по ней сортировать — но это никому особо не нужно.
                                  1. Степан Прищепенко 05 июня 2014, 10:01 # 0
                                    Спасибо! Гитхаб глянул все понятно стало, попробую пока также сделать, посмотрю по скорости.
                                    1. Степан Прищепенко 05 июня 2014, 16:24 # 0
                                      В общем получилось вот так, это для сортировки по кол-ву просмотров:
                                      [[!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"}}`
                                      ]]
                                      1. Василий Наумкин 05 июня 2014, 16:40 # 0
                                        Молоток!

                                        Так можно делать почти со всеми pdoTools-сниппетами =)
                                  2. Степан Прищепенко 11 июня 2014, 18:42 # 0
                                    Нашел проблемку, при вызове из сниппета 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]);
                                    }
                                    
                                    Нужно подлечить.
                                    1. Владимир 17 июня 2014, 21:16 # 0
                                      Василий, когда добавляется новый коментарий, идет переадресация на адрес вида (адрес/адрес/адрес)#comment-3

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

                                      спасибо
                                        1. Владимир 18 июня 2014, 10:13 # 0
                                          спасибо
                                      1. Серегй 03 июля 2014, 06:45 # 0
                                        Василий, подскажите в чем проблема.
                                        Не приходит письмо на премодерацию комментариев.

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

                                        1. Василий Наумкин 03 июля 2014, 06:48 # 0
                                          Не знаю, видимо глюк, пиши github.com/bezumkin/Tickets/issues/new
                                        2. Михаил 06 августа 2014, 06:09 # 0
                                          Здравствуйте! Василий, подскажите пожалуйста по моей проблеме. После обновления на MODx 2.3.1, тикетс ругается что чего то не найдено.



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

                                          Подскажите пожалуйста файл в котором надо поправить путь?
                                          1. Михаил 06 августа 2014, 11:55 # 0
                                            .
                                          2. Максим Кузнецов 13 августа 2014, 18:45 # 0
                                            Я знаю, что баг совершенно детский, но я сломал голову, пока пытался понять, почему у меня упорно не работает этот компонент.

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

                                            %)
                                            1. Василий Наумкин 13 августа 2014, 21:02 # 0
                                              Круто.

                                              Для подключения скриптов и стилей используются методы MODX, так что в таких условиях не будут работать все подобные компоненты, а не только Tickets.
                                            2. Роман 25 августа 2014, 16:45 # 0
                                              Была установлена версия 1.2.3, всё работало прекрасно.
                                              Обновился до 1.4.2, работает, но при авторизации пользователя перестают отображаться предыдущие комментарии. А если заходит неавторизованный гость, то все комментарии видны. Куда копать?
                                              Чанки при обновлении не переписывал, мало того, используются чанки не по-умолчанию, а свои, т.е. при обновлении не должны были перезаписаться.
                                              1. Роман 27 августа 2014, 12:47 # 0
                                                P.S. Только что посмотрел в логах, при входе на страницу зарегистрированного пользователя выскакивает вот такая ошибка:

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

                                                что бы это значило?
                                                1. Роман 30 августа 2014, 16:06 # 0
                                                  P.P.S. Меняю чанк TicketComments на старую версию, всё начинает работать. Смею предположить, что что-то не так именно в этом чанке.
                                                2. Максим Кузнецов 18 сентября 2014, 07:34 # 0
                                                  Здравствуйте. Подскажите, пожалуйста, с чем может быть связана проблема:

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

                                                  [[!TicketComments? &depth=`3` &thread=`newsId-[[*id]]`]]
                                                  Права пользователям были добавлены, визивиг отключен. Форма корректно обрабатывает ошибки (пустые поля и тд) и дает отправлять комментарий с аккаунта администратора, но при попытке отправления комментария любой другой группой консоль выдает следующее:

                                                  data: [{error:{id:name, msg:Это поле обязательно.}, field:name, message:Это поле обязательно.]}
                                                  message: ""
                                                  success: false
                                                  — при том, что текстовая область не пустая и jgrowl ошибку не выдает.

                                                  Подскажите, пожалуйста, в чем может быть причина?
                                                  1. Василий Наумкин 18 сентября 2014, 08:35 # 0
                                                    Говорит, имени нет у пользователя.
                                                    1. Максим Кузнецов 18 сентября 2014, 08:43 # 0
                                                      Подскажите, пожалуйста — можно ли при помощи базовых опций сниппета выставить имя пользователя как username?
                                                      1. Василий Наумкин 19 сентября 2014, 08:23 # 0
                                                        Я точно не помню, так что тут 2 варианта:
                                                        1. Сделать hidden input, куда вставить username пользователя, чтобы он отправлялся с комментарием. Не уверен, что сработает.

                                                        2. Написать простенький плагин на загрузку страницы, чтобы при пустом fullname у юзера, туда копировался username и сохранялся. Это сработает 100%.
                                                        1. Максим Кузнецов 19 сентября 2014, 15:34 # 0
                                                          Спасибо большое за помощь. В итоге решил сделать так:

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

                                                          $comment['name'] = $this->modx->user->username;

                                                          $data['name'] = $this->modx->user->username;
                                                  2. Сергей Шлоков 31 октября 2014, 22:19 # 0
                                                    Василий, подскажи, пожалуйста, в настройках Tickets я выставил уровень уведомления администратора 0. Но мне все равно приходят письма. Why?
                                                    1. Василий Наумкин 01 ноября 2014, 07:05 # 0
                                                      Не знаю, наверное где-то в коде ошибка.
                                                    2. igor 22 ноября 2014, 10:28 # 0
                                                      привет Василий!
                                                      А подскажи как мне вывести последние комментарии с кусочком текста комментария
                                                      <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-->
                                                      а так обрезка не работает
                                                      как обрезать?
                                                      Добавление новых комментариев отключено.