Comments (комментарии+)
Расширенные комментарии собраны почти исключительно на PmWiki и незначительно адаптируют функционал PmForm.
Что это делает?
Внедренные в Rext расширенные комментарии адаптированы следующим образом:
- доступны всем посетителям сайта, без регистрации;
- русифицированы;
- защищены от спама скрытым полем;
- сверстаны на базе Panels Bootstrap;
- дополнены якорями;
- SEO-оптимизированны;
- автоматически встраиваются в «Содержание» страницы;
- число комментариев подсчитывается автоматически.
Демо
Комментарии подключены к текущей странице.
Техническая информация
Требования
Верстка на базе Skin: thisSite.tmpl, …
Подключение и использование
Шаблоны форм хранятся в ThisSite.CommentsTemplates.
Подключение комментариев производится командой (:include ThisSite/CommentsTemplates#conditions basepage={$FullName}:)
.
По-умолчанию, предполагается подключение комментариев к Группе. Для этого вышеприведенный код следует добавить в GroupFooter. Форма добавления комментария будут располагаться под существующими комментариями.
Также можно подключить комментарии только к конкретной странице. В этом случае разместите вышеприведенный код в любом месте страницы. Обратите внимание, что комментарии при этом всегда будут добавляться в конец страницы, поэтому, скорее всего, потребуется отдельно оформить форму добавления.
Как это работает
Комментарии добавляются в конец страницы. Каждый следующий комментарий переопределяет PTV CommentCount
текущей страницы, инкрементируя его. Подсчет нужен не столько для информации, сколько для корректного оформления первого комментария и включения комментариев в Автоматическое Содержание Страницы (и всех последующих комментариев — в виде его «детей»).
Комментарии хранят информацию о своем номере внутри себя в виде текста. Таким образом, удаление комментария не уменьшит счетчик их числа. При необходимости, после удаления вручную поправить последний комментарий для корректировки.
Комментарии доступны всем посетителям сайта. В отличие от PmForm, при добавлении комментария, имя комментатора сохраняется только в контенте комментария, и не попадает в Историю (RecentChanges, историю страницы). Иначе создавались бы множественные ссылки на пустые профили.
Если же комментарий оставит авторизованный пользователь (т.е. тот, который знает пароль на редактирование сайта и произвел хотя бы одну правку, подписавшись своим именем), то в Историю запишется его имя, вне зависимости от того, что он при этом впишет в поле "Имя".
В случае изменения общей логики доступа к системе (например, открытия редактирования для всех желающих), требуется и перенастройка комментариев.
Todo
- на ThisSite.CommentsTemplates
#conditions
через(:pmform comments:)
вызывают внутри себя#commentform
. Возможно, можно каким-то образом уменьшить количество сущностей.
Служебная информация
- Status
- stable
- Core
- yes
- Version
- 20200604
Технические заметки
Запись в Историю сайта
При добавлении комментария в RecentChanges добавляется информация об этом событии. Это обеспечивается примерно следующим кодом в pmform.php:
$new['text'] = $text; if (isset($_REQUEST['csum'])) { $new['csum'] = $ChangeSummary; if ($ChangeSummary) $new["csum:$Now"] = $ChangeSummary; } UpdatePage($saveto, $page, $new);
В итоге получается, что если csum
передано, то изменение фиксируется в RecentChanges.
Одновременно с этим PmWiki еще и обновляет поле author
. Если пользователь не представился системе, то оно будет пустым.
Зачем регистрировать изменения в Истории? Не только для порядка, но и чтобы наладить автоматическую рассылку уведомлений через PmWiki:Notify
Некоторые комментарии к коду
Для создания формы комментариев в GroupFooter помещается примерно такая конструкция:
(:if exists {$FullName}:) (:div99:) (:if2 equal {$:CommentCount} "":) >>h2<< Комментарии >><< Комментариев пока нет. Ваше мнение будет первым! (:if2end:) (:pmform comments:) [[#commentsend]] (:div99end:) (:ifend:)
где:
- pmform — функция для обработки комментариев, обеспеченная плагином /cookbook/pmform.php
- comments — шаблон обработки формы, прописанный в (farm)config.php примерно вот так:
$PmForm['comments'] = 'saveto={$FullName} form=#commentform fmt=#talkpost';
. Здесь:- saveto — куда сохраняться комментарии (?)
- form и fmt-- шаблоны формы, взятые со страницы CommentsTemplates (путь также определен в конфиге).
- where=above — размещать новые комментарии прямо под формой
[[#commentsend]]
— якоря, к сожалению, нельзя размещать внутри шаблонов форм, поэтому пришлось вынести сюда вместе с заголовком.
При добавлении первого комментария фраза «Комментариев пока нет. Ваше мнение будет первым!» исчезает, а «Комментарии» превращаются в полноценный заголовок <h2>.
Шаблон commentform модифицирован относительно оригинала. Вместо вызова (:input pmform target=comments:)
, аналогичный вывод создан вручную:
(:input form "{$PageUrl}#comments" :) (:input hidden name="n" value="{$FullName}":) (:input hidden name="action" value="pmform":) (:input hidden name="target" value="comments":)
Всё это ради того, чтобы сделать ссылку на якорь #commentsend
после постинга. Видимо, это единственный способ сделать на уровне Wiki. Иначе это можно сделать на уровне PHP вот так:
$InputTags['pmform'][':html'] = "<form action='{\$PageUrl}#comments' \$InputFormArgs><input type='hidden' name='n' value='{\$FullName}' /><input type='hidden' name='action' value='pmform' />";
но как-то это грубо.
Также (:input text author:)
заменен на (:input text commentator:)
по причинам, изложенным выше.
Комментарии (2)
Finar (2021-06-11, 18:00)
Этот комментарий демонстрирует то, как работают комментарии.
taurus (2021-07-02, 19:20)
Комментарий к разделу Comments (комментарии+)