[Tickets] Ajax комментарии
В продолжении темы про книгу отзывов.
Как и обещал, выкладываю описание решения. Только я решил разбить его на отдельные пункты, потому что каждая из описанных возможностей может быть использована независимо от других.
Первым пунктом была указана возможность ajax подгрузки комментариев. Она самая простая. С нее и начнем.
Итак, чтобы сделать ajax комментарии нужно всего 3 маленьких шага и не больше 10 минут.
1. Немного подправим сниппет TicketComment. Советую сделать следующее: скопировать его (чтобы сохранить все параметры) и назвать, например, TicketCommentAjax. Заменить исходный код на этот.
2. В чанк tpl.Tickets.comment.wrapper вставляем плейсхолдер [[+more_comments]], который отвечает за отображение кнопки «Еще комментарии», и быстрый плейсхолдер с конце чанка.
3. Теперь нужно заставить добавленную кнопку выводит эти самые «еще комментарии». Тут есть 2 варианта.
Вариант 1. Нужно подправить файл assets/components/tickets/js/web/default.js. Работаем по тому же алгоритму, что и в первом шаге: делаем копию этого файла (например, ajaxcomments.js) и добавляем в него после строчки //Forms listeners (строчка №17) следующие строки:
Теперь идем в настройки системы, выбираем раздел Tickets и изменяем параметр Скрипты фронтенда на [[+jsUrl]]web/ajaxcomments.js
Вариант 2. Попроще. Чтобы не лезть в системные настройки, можно, например, в чанке tpl.Tickets.comment.wrapper, который мы редактируем на втором шаге, добавить следующий код:
Вот собственно и все. Теперь вставляем наш сниппет куда нужно, указывая параметр limit, который и отвечает за ajax. Пример:
Маленькая ремарка. Параметр limit ограничивает только комментарии первого уровня. Чтобы ограничить глубину ветки, нужно указывать стандартный параметр depth.
Все должно работать.
П.С Еще раз хочу выразить восхищение разработками Василия — мощные, гибкие, легко расширяемые, а главное очень понятные. Вспоминаю потраченные в пустую 3 дня, когда пытался разобраться с modxTalks, как страшный сон. Не в обиду Валентину и Ивану, но факт есть факт. Я свой выбор сделал, хотя поначалу и боялся, что Tickets мне не подойдет. Но как видите, 10 минут и вуаля.
П.П.С. Из описаний остались смайлики (уже готово) и возможность удаления/восстановления комментариев из фронт-энда. На первое нужно также не более 10 минут. А вот со вторым все сложнее. Описание и сложность будет зависеть, примет ли Василий мои предложения по доработке Tickets и pdoTools. Если да, то это будет работать из коробки (или почти), если нет — то придется создавать свои классы.
П.П.С. Замечания и пожелания приветствуются. Как говориться, совершенству нет предела. :)
Update. 14.11.2014 Обновлен сниппет TicketCommentAjax. Тем, кто уже успел его скачать, нужно обновиться.
Как и обещал, выкладываю описание решения. Только я решил разбить его на отдельные пункты, потому что каждая из описанных возможностей может быть использована независимо от других.
Первым пунктом была указана возможность ajax подгрузки комментариев. Она самая простая. С нее и начнем.
Итак, чтобы сделать ajax комментарии нужно всего 3 маленьких шага и не больше 10 минут.
1. Немного подправим сниппет TicketComment. Советую сделать следующее: скопировать его (чтобы сохранить все параметры) и назвать, например, TicketCommentAjax. Заменить исходный код на этот.
2. В чанк tpl.Tickets.comment.wrapper вставляем плейсхолдер [[+more_comments]], который отвечает за отображение кнопки «Еще комментарии», и быстрый плейсхолдер с конце чанка.
<div class="comments">
[[+modx.user.id:isloggedin:is=`1`:then=`
<span class="comments-subscribe pull-right">
<label for="comments-subscribe" class="checkbox">
<input type="checkbox" name="" id="comments-subscribe" value="1" [[+subscribed]] /> [[%ticket_comment_notify]]
</label>
</span>
`:else=``]]
<h2 class="title">Отзывы (<span id="comment-total">[[+total]]</span>)</h2>
<div id="comments-wrapper">
<ol class="comment-list" id="comments">[[+comments]]</ol>
</div>
[[+more_comments]]
<div id="comments-tpanel">
<div id="tpanel-refresh"></div>
<div id="tpanel-new"></div>
</div>
</div>
<!--tickets_subscribed checked-->
<!--tickets_more_comments <div id="more-comments" style="text-align:center;"><button href="#" class="btn btn-primary">Еще комментарии</button></div>-->3. Теперь нужно заставить добавленную кнопку выводит эти самые «еще комментарии». Тут есть 2 варианта.
Вариант 1. Нужно подправить файл assets/components/tickets/js/web/default.js. Работаем по тому же алгоритму, что и в первом шаге: делаем копию этого файла (например, ajaxcomments.js) и добавляем в него после строчки //Forms listeners (строчка №17) следующие строки:
$(document).on('click touchend', '#more-comments button', function(e) {
e.preventDefault();
var more_button = $(this);
$.post(document.location.href, function(data) {
if (data.error) {
// Сделать кнопку недоступной
more_button.attr("disabled","disabled");
// Удалить кнопку
//more_button.remove();
} else {
$("#comments").append(data.comments);
}
},"json");
return false;
});Теперь идем в настройки системы, выбираем раздел Tickets и изменяем параметр Скрипты фронтенда на [[+jsUrl]]web/ajaxcomments.js
Вариант 2. Попроще. Чтобы не лезть в системные настройки, можно, например, в чанке tpl.Tickets.comment.wrapper, который мы редактируем на втором шаге, добавить следующий код:
<script type="text/javascript">
$(document).on('click touchend', '#more-comments button', function(e) {
e.preventDefault();
var more_button = $(this);
$.post(document.location.href, function(data) {
if (data.error) {
// Сделать кнопку недоступной
more_button.attr("disabled","disabled");
// Удалить кнопку
//more_button.remove();
} else {
$("#comments").append(data.comments);
}
},"json");
return false;
});
</script>Или можно в шаблоне загрузить данный скрипт, выставив условие[[*id:is=`id страницы с комментариями`:then=`скрипт...`]].Вот собственно и все. Теперь вставляем наш сниппет куда нужно, указывая параметр limit, который и отвечает за ajax. Пример:
[[!TicketCommentsAjax? &limit=`20`]]Маленькая ремарка. Параметр limit ограничивает только комментарии первого уровня. Чтобы ограничить глубину ветки, нужно указывать стандартный параметр depth.
Все должно работать.
П.С Еще раз хочу выразить восхищение разработками Василия — мощные, гибкие, легко расширяемые, а главное очень понятные. Вспоминаю потраченные в пустую 3 дня, когда пытался разобраться с modxTalks, как страшный сон. Не в обиду Валентину и Ивану, но факт есть факт. Я свой выбор сделал, хотя поначалу и боялся, что Tickets мне не подойдет. Но как видите, 10 минут и вуаля.
П.П.С. Из описаний остались смайлики (уже готово) и возможность удаления/восстановления комментариев из фронт-энда. На первое нужно также не более 10 минут. А вот со вторым все сложнее. Описание и сложность будет зависеть, примет ли Василий мои предложения по доработке Tickets и pdoTools. Если да, то это будет работать из коробки (или почти), если нет — то придется создавать свои классы.
П.П.С. Замечания и пожелания приветствуются. Как говориться, совершенству нет предела. :)
Update. 14.11.2014 Обновлен сниппет TicketCommentAjax. Тем, кто уже успел его скачать, нужно обновиться.
Комментарии: 62
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Можно разрешить пользователям удалять свои комментарии. В общем, ограничивает только полет фантазии. :)
вот такой вызов
и такой wrapper
которая присоединяет условие
не верна
Выборка этих айди не привязана к Thread — а идет просто с сортировкой по дате, а должна привязываться к данному ресурсу, но даже если явно указать thread тоже не учитывается
У меня все работает.
Если не поможет, добавь в сниппет TicketCommentAjax после строчки
(это строка 109) следующий код
и посмотри ответ от сервера. Проверь SQL запрос.
На тестовом сайте стоял depth=2. Ограничил до 10.
Там сниппет другой — в нем сразу все прописано: и смайлики, и ajax и удаление/восстановление. Поэтому в процессе выделения только одного решения возможно где-то что-то упустил.
А сниппет TicketCommentAjax надо обновить — некорректно работала функция getChildIds. На тестовом сайте ее нет, там она работает через расширяемый класс pdoFetch.
Вот попробуй.
П.С. Спасибо за тестирование. Надеюсь, теперь будет работать для всех условий.
Не совсем понял. А как должно быть?
Так и задумывалось: указываешь, сколько уровней комментариев выводить, столько и выводит, остальные отрезает. Отрезает именно уровни, а не комментарии на уровне. Т.е. если на 2-ом уровне 20 комментариев, то они все выводятся, limit действует только на 1-й уровень.
PS. Даже наша ветка комментариев тому пример =) тут стоит deaph=10
Ок. Чтобы сделать как здесь, нужно всего лишь в строчке сниппета убрать из массива последний параметр depth.
Обрати внимание, что depth=10, а этот последний уровень является 11-ым. Т.е. судя по всему 1-й уровень не считается. Но это скорее вопрос к Василию.
Done.
Лежит тут
У меня считает правильно. Где это можно увидеть?Понял про что ты говоришь. Это скрипт считает и переписывает значение из сниппета. Я закомментировал и забыл про него. :) Буду подумать.
Временно, можешь изменить id у span в чанке tpl.Tickets.comment.wrapper
Обзови id по другому или удали его.
Задача у меня такая: сделать страницу отзывов, где их могли бы оставлять незарегистрированные пользователи. В общем, такую, как Вы описываете в статьях.
Сначала я мучился с дополнением Quip. Вроде бы его установил, появлялась форма для отправки комментария, но сам комментарий после отправки не появлялся на странице, как я ни бился. В итоге мне подсказали попробовать Tickets.
Замечу, что сайт я уже почти собрал (поиск по сайту, форма обратной связи, блог и пр.), т.е. getResources, Wayfinder, Breadcrumbs и некоторые другие дополнения установлены. Всё работает, остались только отзывы.
Установил пакеты Tickets, Jevix и PdoTools. У сниппета TicketCommentsAjax создал новый набор параметров (newTicket), где разрешил незарегистрированным пользователям оставлять сообщения без модерации. На страницу отзывов поместил вызов: [[!TicketCommentsAjax@newTicket? &limit=`20`]].
В итоге набираю комментарий, отправляю, но он не появляется. То же самое происходит без использования Ajax.
В чём может быть проблема?
[2014-11-10 12:14:49] (ERROR @ /index.php) Encountered empty IN condition with key id
[2014-11-10 12:14:49] (ERROR @ /index.php) [pdoTools] Error 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') AND `TicketComment`.`published` = 1 ) GROUP BY TicketComment.id ORDER BY Tick' at line 1
Хотя судя по тому, что у тебя и с Quip такая же проблема, то возможно чего-то с sql server не так.
Как Вы думаете, если я сменю Денвер на OpenServer, ошибки могут исчезнуть? Где-то читал, что MODX Revo лучше чувствует себя на OS.
у меня такая же проблема, даже не увидел как лог перешел за мегабайты =) ошибка возникает когда у ресурса нет комментариев и только когда параметр limit есть
потому что вот такой where запрос когда Комментов нету
IN пустой
Статья в Википедии — ru.wikipedia.org/wiki/Vagrant
Статья на Хабре — habrahabr.ru/post/140714/
P.S. Есть еще виртуальный образ UbuntuServer для VirtualBox c инструкциями, собранный Василием. Где-то здесь должен быть соответствующий пост.
Банально. Но без помощи одного хорошего человека я б сегодня не додумался до этого. ;)
и на кнопку отправить сниппет никак не реагирует. В консоли ошибок нет, в логе MODX — тоже. Если вызываю обычный сниппет TicketComments, то новый коммент нормально сохраняется. Мой вариант вызова сниппета:
ПОдскажите, пожалуйста, в какую сторону копать? Вот сама страничка со сниппетом: клик
Ясно, что с tickets как-то связано… путь к какой-то папке неправильный?
Я попробовал ещё на паре поддоменов с MODX организовать вывод отзывов — в одном та же самая ерунда получмлась, а вот на втором всё заработало с пол-оборота. Странно… хостинг один, учетка одна — просто папки разные!
Настройки сниппета TicketComment
и
Смотрим там же
ajax, повторюсь, работает из коробки) Если нужно ограничить количество комментов и выводить через кнопку типа «Показать еще», идем в репозиторий и качаем AjaxSnippet
Чуть не забыл, что для решения можно использовать и pdoPage Этот вариант даже проще будет_
Вот вызов сниппета:
Если же выводить просто постраничной пагинацией, даже аяксом (режим &ajaxMode=`default`), то всё нормально работает — форма, соответственно, на каждую страницу один раз выводится.
Поэтому я пошел по другому пути, вот вызов:
То есть, при вызове TicketComments, выводится только форма (в чанке tpl.Tickets.comment.wrapper убрал плейсхолдер [[+comments]]), а сами комменты вывожу сниппетом getComments через pdoPage, тогда всё работает корректно! Возможно, что есть более простой вариант, но мне пока что не удалось его найти.