5 ноября 2013 г.

Сегодня хочу рассказать про то, как из нашего любимого MODX Revolution сделать, пусть и простенький, но вполне рабочий форум.

Для этих целей мы будем использовать пакет Discuss (Github, багтрекер), который можно найти в галерее дополнительных компонентов.

Он уже сейчас умеет регистрировать пользователей с аватарками (ЭТО ОЧЕНЬ ВАЖНО!!!1), есть удобная простая админка, к постам можно прикреплять файлы, можно задавать вопросы и т.д. Проще установить и посмотреть самому. Мне понравилось.

Есть несколько русскоязычных постов, в которых рассматривается процесс установки и использования предыдущих версий данного пакета, но это было раньше. Проект развивается, исправляется и не стоит на месте. Не спорю, конечно есть некоторые ошибки, но решение рабочее. Если не планируется большого форума, то я бы посоветовал. Хотя, для крупного форума все же лучше использовать отдельную специализирванную CMS.

Начать следует с того, что для работы потребуется MODX Revolution версии 2.2 и выше и PHP5 и выше.

Для нормальной работы Discuss нам потребуются пакеты Login и FormIt. Рассказывать о том, как устанавливать их я не буду. В сети куча примеров да и ничего сложного там нет.

Установка самого Discuss предельно проста и осуществляется через стандартный менеджер пакетов MODX Revolution. Просто ищете его среди всех проектов, жмакаете Загрузить, потом Установить. В процессе вам будет задана пара вопросов:

  • Установить демонстрационные данные (Install Demo Data) - поскольку с работой данного компонента мы не знакомы, то мы, пожалуй, галку поставим. Так проще разобраться.
  • Создать Discuss-ресурс (Install Discuss Resource) - тоже ставим галку. Будет создан ресурс, который будет отвечать за весь форум.

Итак, установка прошла успешно. Далее - настройка. Если вы не поставили галку около создания ресурса для Discuss, то самое время создать его. Должно получиться что-то подобное:

  • Заголовок: Forums
  • Шаблон: empty
  • Псевдоним: forums (потом можно будет сменить)
  • Содержимое ресурса: [[!Discuss]]
  • Контейнер (во вкладке Настройки): ставим галку

Хотя Discuss и включает в себя функционал регистрации и авторизации с использованием пакета Login, возможно, вы захотите использовать кастомизированные или уже созданные ранее страницы авторизации, регистрации и редактирования профиля для вашего форума. Никаких определенных требований для этих страниц не существует, все, что вам необходимо, так это создать 3 отдельные страницы под эти нужды, используя документацию Login. Единственное, что нужно сделать - это указать некоторые необходимые для Discuss параметры в вызовы Login, Register и UpdateProfile сниппетов:

Для Login добавьте эти пре- и пост-хуки из пакета Discuss:

&preHooks=`preHook.DiscussLogin`
&postHooks=`postHook.DiscussLogin`

Для Register:

&usergroups=`Forum Members:Member`

Для UpdateProfile:

&postHooks=`postHook.DiscussUpdateProfile`

А после вызова сниппета UpdateProfile необходимо добавить:

[[!DiscussUpdateProfileLoader]]

Для полноценного редактирования пофиля, который используется на нашем форуме, можно добавить несколько дополнительных полей в чанк-шаблон формы редактирования:

<label for="signature">Signature <span class="error">[[!+up.error.signature:stripTags=`p,b,strong,i,a,ul,li`]]</span></label>
<textarea name="signature:allowTags" id="signature">[[!+up.signature]]</textarea>
 
<label for="use_display_name">Use Display Name in Forums <span class="error">[[!+up.error.use_display_name]]</span></label>
<input type="hidden" name="use_display_name" id="use_display_name_hidden" value="0" />
<input type="checkbox" name="use_display_name" id="use_display_name" value="1" [[!+up.use_display_name:FormItIsChecked=`1`]] />
 
<label for="display_name">Display Name <span class="error">[[!+up.error.display_name]]</span></label>
<input type="text" name="display_name" id="display_name" value="[[+up.display_name]]" />
 
<label for="show_online">Show Online Status <span class="error">[[!+up.error.show_online]]</span> </label>
<input type="hidden" name="show_online" id="show_online_hidden" value="0" />
<input type="checkbox" name="show_online" id="show_online" value="1" [[!+up.show_online:FormItIsChecked=`1`]] />
 
<label for="show_email">Show Email in Forums <span class="error">[[!+up.error.show_email]]</span></label>
<input type="hidden" name="show_email" id="show_email_hidden" value="0" />
<input type="checkbox" name="show_email" id="show_email" value="1" [[!+up.show_email:FormItIsChecked=`1`]] />

Для работы Discuss нам потребуется ЧПУ, без него ничего не получится. Поэтому в Настройках системы MODX ключ friendly_urls должен иметь положительное значение. Не лишним будет выбрать автоматическую генерацию псевдонимов (automatic_alias) и вложенность URL (use_alias_path), но это не обязательно. Кому как удобнее и больше нравится.

После настройки дружественных URL нам необходимо добавить несколько rewrite-правил в конфигурацию нашего сервера, чтобы всё заработало. Чуть ниже приведены примеры конфигураций для nginx и Apache.

nginx:

rewrite ^/forums/thread/([0-9]+)/(.*)$ /index.php?q=forums/&action=thread&thread=$1 last;
rewrite ^/forums/u/(.+)$ /index.php?q=forums/&action=user&user=$1 last;
rewrite ^/forums/board/([0-9]+)/(.*)$ /index.php?q=forums/&action=board&board=$1 last;
rewrite ^/forums/category/([0-9]+)/(.*)$ /index.php?q=forums/&category=$1 last;
rewrite ^/forums/(.+)$ /index.php?q=forums/&action=$1 last;
rewrite ^/forums/(.+)/$ /index.php?q=forums/&action=$1 last;

В документации к Discuss для nginx приводится две конфигурации. Та, что подлиннее отказалась работать корректно. Возможно, что конфликтовали правила, которые уже были у меня до этого (если интересно - можете почитать о конфиге nginx для MODX Revo). Конфиг выше вполне выполняет свои функции, поэтому я остановился на нем.

Apache:

# If imported from SMF, you can include the following lines to make sure existing urls don't break.
RewriteRule ^forums/index.php/topic,(.*).msg(.*).html$ forums/?action=thread&thread=$1&i=1
RewriteRule ^forums/index.php/topic,(.*).(.*).html$ forums/?action=thread&thread=$1&i=1&start=$2
RewriteRule ^forums/\?topic=(.+).(.+)$ forums/?action=thread&thread=$1&i=1
RewriteRule ^forums/index.php/board,(.*).(.*).html$ forums/?action=board&board=$1&i=1&start=$2
RewriteRule ^forums/\?board=(.+).(.+)$ forums/?action=board&board=$1&i=1
 
 
# Discuss rewrite rules
RewriteRule ^forums/thread/([0-9]+)/(.*)$ forums/?action=thread&thread=$1 [L,QSA]
RewriteRule ^forums/u/(.+)$ forums/?action=user&user=$1 [L,QSA]
RewriteRule ^forums/board/([0-9]+)/(.*)$ forums/?action=board&board=$1 [L,QSA]
RewriteRule ^forums/category/([0-9]+)/(.*)$ forums/?category=$1 [L,QSA]
RewriteRule ^forums/(.+)$ forums/?action=$1 [L,QSA]
RewriteRule ^forums/(.+)/$ forums/?action=$1 [L,QSA]

Данные правила необходимо вставлять до основных правил, которые обеспечивают работу MODX. Это необходимо соблюдать как для nginx, так и для Apache.

Кстати, следует упомянуть то, что по умолчанию в качестве псевдонима к странице форума используется "forums". Мне оно не очень нравилось и я его поменял. Для этого достаточно сменить псевдоним у ресурса, который отвечает за форум (тот, который должен был создаться автоматически после установки нашего форума), а также заменить все вхождения "forums" на нужное вам в конфигах, которые приводились выше.

Теперь, когда сервер, ресурсы и дружественные URL настроены, самое время взяться за конфигурацию самого Discuss. В админке переходим в Система -> Настройки системы, в фильтре в выпадающем селекте находим пространство имен discuss. Нам необходимо настроить следующие ключи:

  • discuss.forums_resource_id - указываем id ресурса, который создался при установке Discuss;
  • discuss.login_resource_id - указываем id ресурса, который отвечает за вызов сниппета Login;
  • discuss.register_resource_id - указываем id ресурса, который отвечает за вызов сниппета Register;
  • discuss.update_profile_resource_id - указываем id ресурса, который отвечает за вызов сниппета UpdateProfile;
  • discuss.sso_mode - ставим галочку для того, чтобы использовались наши собственные авторизацию, регистрацию и редактирование профиля вместо встроенных в Discuss.

Помимо перечисленных настроек вы можете найти и другие. Некоторые могут оказаться полезными в той или иной ситуации. Например, мне пригодилось discuss.debug_templates, когда необходимо было понять какой из множества чанков используется в том или ином месте в шаблоне страницы. discuss.theme позволяет выставить нужную тему (кстати, в Discuss можно использовать свои темы)

После всех манипуляций мы должны иметь готовый к употреблению форум на MODX Revolution, правда на английском языке. Но возможна русификация. Но это - тема отдельной статьи, ровно как и создание собственных шаблонов для Discuss. Как-нибудь расскажу.

По мотивам документации Discuss.

Если на ваш взгляд в данном посте присутствуют ошибки, неточности или у вас просто хорошее настроение - пишите комментарии. До встречи =)

Автор: Артур Минимулин ⚫ 5 ноября 2013 г.Тэги: Конфигурация, MODx, Revolution, php, Компоненты MODx