TicketComments: сохранение комментария
Здравствуйте! В ходе работы с дополнением Tickets возникла следующая проблема.
Есть страница — Конкурсы. Она представляет из себя простой документ. Наполняется она следующим образом:
155 — айди конкурсного раздела с тикетами. Задумка такова, что каждый конкурс представляет из себя тикет в этом разделе. Здесь проблем нет. competitionConditions — композитный tv-параметр, созданный с использованием MigX — с его помощью я вывожу список правил для каждого конкурса.
Что вполне успешно и происходит на одной из вкладок моего шаблона tmpl.Tickets.competitions.row:
Вопрос: можно ли при вызове TicketsComment указвать конкретный тикет, к которому «привяжутся» комментарии?
Я попытался решить это указанием &parents=`[[+id]]` (как в вызове geiImageList &docid=`[[+id]]`). Пробовал задать &thread=`[[+id]]` — и это тоже не помогло.
Буду благодарен за советы или объяснения.
Есть страница — Конкурсы. Она представляет из себя простой документ. Наполняется она следующим образом:
[[!pdoPage?
&element=`getTickets`
&tpl=`tmpl.Tickets.competitions.row`
&parents=`155`
&includeTVs=`competitionConditions`
&includeContent=`1`
&sortby=`{"publishedon":"DESC"}`
&limit=`1`
]]
На странице должен демонстрироваться последний из добавленных конкурсов.155 — айди конкурсного раздела с тикетами. Задумка такова, что каждый конкурс представляет из себя тикет в этом разделе. Здесь проблем нет. competitionConditions — композитный tv-параметр, созданный с использованием MigX — с его помощью я вывожу список правил для каждого конкурса.
Что вполне успешно и происходит на одной из вкладок моего шаблона tmpl.Tickets.competitions.row:
<!-- begin tab 1 -->
<div class="competitions_rules tab" id="tab_1">
<ul>
[[!getImageList?
&tvname=`competitionConditions`
&tpl=`tmpl.MIGX.cConditions`
&limit=`all`
&docid=`[[+id]]`
]]
</ul>
</div>
<!-- tab 1 eof -->
На второй вкладке должны публиковаться «конкурсные работы». Я решил их реализовать через премодерируемые комментарии, вызывая сниппет TicketComments в оболочке pdoPage:<!-- begin tab 2 -->
<div class="competitions_works tab hide" id="tab_2">
<ul>
<li>
[[!pdoPage?
&includeTVs=``
&element=`TicketComments`
&parents=`[[+id]]`
&tplComments=`tmpl.Tickets.competition.entries`
&tplCommentForm=`tmpl.Tickets.competition.form`
&tplPageFirst=`@INLINE <li class="first"><a href="[[+href]]"></a></li>`
&tplPageFirstEmpty=`@INLINE <li class="first inactive"><a href="javascript:void(0);"></a></li>`
&tplPageLast=`@INLINE <li class="last"><a href="[[+href]]"></a></li>`
&tplPageLastEmpty=`@INLINE <li class="last inactive"><a href="javascript:void(0);"></a></li>`
&tplPagePrev=`@INLINE <li class="control"></li>`
&tplPageNext=`@INLINE <li class="control" style="display: none"><a href="[[+href]]" id="pageNext"></li>`
&tplPagePrevEmpty=`@INLINE <li class="control"></li>`
&tplPageNextEmpty=`@INLINE <li class="control"></li>`
&limit=`3`
&sortby=`{"publishedon":"DESC"}`
&formBefore=`0`
&autoPublish=`0`
&allowGuest=`0`
&allowGuestEdit=`0`
&fastMode=`0`
]]
</li>
</ul>
<!-- begin page navigation -->
<div class="page_navigation">
<ul>
[[!+page.nav]]
</ul>
</div>
<!-- page navigation eof -->
</div>
<!-- tab 2 eof -->
И здесь возникает проблема. При попытке добавить комментарий/«конкурсную работу», они добавляются на страницу, с которой вызван сниппет TicketsComment. При этом, в документе закладки «Комментарии» не появляется (потому, что документ не является контейнером с тикетами?). Комментарий можно отследить лишь через Приложения --> Тикеты. Вопрос: можно ли при вызове TicketsComment указвать конкретный тикет, к которому «привяжутся» комментарии?
Я попытался решить это указанием &parents=`[[+id]]` (как в вызове geiImageList &docid=`[[+id]]`). Пробовал задать &thread=`[[+id]]` — и это тоже не помогло.
Буду благодарен за советы или объяснения.
Комментарии: 11
Не очень охота читать так много кода и текста, но прочитав «проблему» в конце пара замечаний:
1. Комментарии добавляются не к странице, а к thread, который может быть, например, page-155, или mycustomthread, в общем какой угодно. Поэтому на одной странице вы можете вывести разные комментарии, из разных thread…
2.… но в тоже время вроде нельзя делать несколько вызовов TicketsComment, т.к. вроде возникает проблема в javascript =)
короче смотрите что такое thread, и как это устроено в БД.
1. Комментарии добавляются не к странице, а к thread, который может быть, например, page-155, или mycustomthread, в общем какой угодно. Поэтому на одной странице вы можете вывести разные комментарии, из разных thread…
2.… но в тоже время вроде нельзя делать несколько вызовов TicketsComment, т.к. вроде возникает проблема в javascript =)
короче смотрите что такое thread, и как это устроено в БД.
Большое спасибо за совет. Попробую повозиться со значениями &thread и погляжу, что получится.
Проблема с выводом комментариев из треда разрешилась: я реорганизовал структуру и теперь вызываю TicketComments с детальной страницы тикета, а не со сторонней страницы. В таком случае, комментарии привязываются к нужному тикету. Да это и логичнее.
Продолжая тему: возникла необходимость в изменении стандартной формы комментария. Я хочу добавить туда два поля: «Название работы» и «Ссылка на работу». Причастившись к мудрости Василия — параграф «Расширение комментариев» — я попытался повторить описанное выше.
1)В форме комментирования добавил поле ввода:
Пожалуйста, посоветуйте, как правильно поступить? Где разместить код плагина?
P.s.: Единожды поняв принцип, будет намного легче расширять функционал по аналогии.
1)В форме комментирования добавил поле ввода:
<input name="competitiveName" id="competitiveName" placeholder="">
2)В тексте TicketComments прописал:/*PLUGIN*/
if ($modx->event->name == 'OnBeforeCommentSave') {
$properties = array(
'competitiveName' => $modx->stripTags($_POST['competitiveName'])
);
$modx->event->params['TicketComment']->set('properties', $properties);
};
/*PLUGIN EOF*/
3)В чанке вывода комментариев определил:<div class="work_field">Название работы:<span>[[+properties.competitiveName]]</span></div>
Результат нулевой. Подозреваю, что разместил код плагина совсем не в том месте, где нужно — я поглядел код сниппета, и нигде не обнаружил конструкции ($_POST['*variableName*']), что только утвердило меня в подозрении — я туплю.Пожалуйста, посоветуйте, как правильно поступить? Где разместить код плагина?
P.s.: Единожды поняв принцип, будет намного легче расширять функционал по аналогии.
Вот недавно обсуждалось.
Большое Вам спасибо! Попробую разобраться.
Как не давать сохранять комментарий, если в тексте есть матерки? -) Такая авто-модерация коммента. И выдавать всплывающую ошибку «будьте более лаконичны в своем комментарии».
По сути я пробовал возвращать false в плагине на событие «OnBeforeCommentSave» но коммент все равно сохраняется в БД.
Подскажите, как правильно фильтровать такие комменты?
По сути я пробовал возвращать false в плагине на событие «OnBeforeCommentSave» но коммент все равно сохраняется в БД.
Подскажите, как правильно фильтровать такие комменты?
«Как правильно» я подсказать не могу.
Почему бы не попробовать фильтровать содержимое комментария на фронтэнде, вовсе до отправки на сервер?
Либо перезаписывать содержимое комментария уже после записи («OnBeforeCommentPublish», «OnCommentSave»), основываясь на результате, возвращённым Вашим мат-фильтром.
Почему бы не попробовать фильтровать содержимое комментария на фронтэнде, вовсе до отправки на сервер?
Либо перезаписывать содержимое комментария уже после записи («OnBeforeCommentPublish», «OnCommentSave»), основываясь на результате, возвращённым Вашим мат-фильтром.
Да вот странно, я возвращаю ошибку по событию OnBeforeCommentSave:
github.com/modxcms/revolution/blob/5f59848ab1f1805ba09f03fae35bee5b7166f37b/core/model/modx/modprocessor.class.php#L649
но почему-то коммент все равно сохраняется.
github.com/modxcms/revolution/blob/5f59848ab1f1805ba09f03fae35bee5b7166f37b/core/model/modx/modprocessor.class.php#L649
но почему-то коммент все равно сохраняется.
Если плагин возвращает false, то MODX считает это ошибкой работы плагина и пишет в лог. А так, никаких значений они не возвращают.
Если хочешь сгенерировать ошибку, то нужно сделать так:
Если хочешь сгенерировать ошибку, то нужно сделать так:
$modx->event->output('Ошибка!');
Ну и погляди в энциклопедии значение слова "лаконичный" — оно не про матерки.
Да все верно! лаконичность не про то… Большое спасибо за наводку в плагине!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.