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)

Этот комментарий демонстрирует то, как работают комментарии.

Комментарий к разделу Comments (комментарии+)