Настройка удобного форума на Drupal, используя Advanced Forum и др.

Актуальность статьи: 2016 год.

Всегда поражался, насколько все форумы, сделанные на друпале, похожи и одинаково неудобны.
В одном проекте мне нужно было сделать удобный форум на Drupal 7. За основу я взял хороший удобный интерфейс не-друпаловского vBulletin движка форума (например, http://taobao-forum.com), и здесь я расскажу, как сделать такое же, только на Друпале. (почему - потому что можно использовть еще миллион дополнительных удобных других модулей друпала, которого у vBulletin или phpbb нет и в помине).

Я подразумеваю что у вас уже установлен Drupal с нужными вам модулями (если нет, то все мои модули я описал здесь), а здесь я опишу только саму настройку форума.

Установка

Ставим модули:
Advanced Forum https://www.drupal.org/project/advanced_forum
Quote https://www.drupal.org/project/quote
BBCode https://www.drupal.org/project/bbcode

Можем просто использовать команду:
drush en -y advanced_forum quote bbcode

Тема оформления

Есть два понятия - тема оформления Друпала и скин оформления для Advanced forum.
С темой оформления Друпала и так все понятно - вы используете любую какая вам больше нравится, например я для своего форума я использую Sceletontheme + собственная подтема, которая переопределяет некоторые css стили (ссылка на скачивание моей подтемы).
Если вам нужно применять тему оформления для форума, которая будет отличаться от темы оформления всего сайта, то следуйте этому совету.

А вот для того, чтобы создать свою собственную удобную тему оформления Advanced forum нужно создать новый модуль. Если вам лень заморачиваться, то просто скачайте мой скин отсюда, скопируйте в папку с модулями (sites/all/modules), включите этот модуль в друпале (например drush en -y advanced_forum_102rota_style и затем зайдите на /admin/config/content/advanced-forum и вместо Silver Bells выставите тему оформления "102rota".
Не обязательно: Вы можете выполнить команду drush sql-query "UPDATE system SET weight = 50 WHERE name = 'advanced_forum_102rota_style'" чтобы кнопка "Подписаться" у тем форума отображалась красивой кнопкой.

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

Создание своей темы оформления Advanced forum

Вы можете использовать мою тему оформления Advanced forum как основу для своих дальнейших работ либо создать с нуля свою собственную. Для создание своей чистой темы:
Копируем папку Blue Dragon из модуля Advanced Forum туда же, переименовывая её в название вашего сайта, например taobao.
Изменяете blue_dragon.info файл внутри этой папки, а так же переименовываете все файлы соответственно вашему названию.
В админке находите пункт Конфигурация - Работа с соержимым - Advanced forum (/admin/config/content/advanced-forum), ставите там свою тему и выбираете все типы материалов для которых она должна применяться. Сохраняете.

Основная подсказка по созданию своей темы оформления форума - ориентируйтесь на тему /sites/all/modules/advanced_forum/styles/naked - в ней есть все дефолтные шаблоны для форума, и если какого-то шаблона не указано в вашей теме, они будут браться отсюда.
Для того, чтобы вставить шаблон в вашу тему, достаточно его просто скопировать в вашу папку и переименовать соответственно (вместо naked сделать имя вашей темы). Больше никуда этот шаблон прописывать не надо - advanced forum его сам найдет, лишь очистите кеш.

Все таблицы форума хранятся во вьюсах, но вот самая первая таблица, со списком всех форумов (т.е. /forum) забита кодом в модуле advanced_forum, соответственно её изменять можно только через шаблон advanced-forum.naked.forum-list.tpl.php (название можете поменять для соответствия вашему скину оформления).

Дальнейшая настройка форума

Далее надо настроить цитаты по этой заметке http://nikita-petrov.com/drupal/citirovanie-v-drupale-v-advanced-forum-c...
(вкратце: надо установить модуль http://drupal.org/project/quote + мой модуль jsquote, а так же патч для оформления кнопки цитирования (всё есть в статье) + зайти на /admin/config/content/formats/filtered_html и /admin/config/content/formats/full_html и включить фильтр quote и поставить его после фильтра br и p)

Далее изменяете шаблоны вашего нового скина Advanced forum'a в соответствии с вашими вкусами, добавляете css-файлы оформления.

Для того, чтобы изменить внешний вид списка форумов, у Advanced forum'a есть специальная вьюсина. Её изменяете как обычную вьюсину, темизируете при необходимости.

Темизация ветки сообщений происходит хитро. Все сообщения в ветке - обычные комментарии ноды. Соответсвенно если хотите изменить количество на странице - надо зайти в настройки типа материала "Тема форума" и изменить кол-во комментариев на странице.

Если вам не нравится, что в списке форумов /forum обрезаются заголовки сообщений, то в настройках advanced forum есть пункт, где это можно исправить (выставить вместо 20, например 30 символов): /admin/config/content/advanced-forum

Личные сообщения

Далее устанавливаем модуль личных сообщений http://drupal.org/project/privatemsg (drush dl privatemsg, drush en -y privatemsg pm_email_notify)
В нём ничего настраивать не надо - всё и так будет работать, единственное надо только выставить блок "Уведомление о новом сообщении" (или "New message indication") на странице блоков (/admin/structure/block) куда-нибудь перед контентом, чтобы пользователю он показывался когда у него есть новое сообщение (ну и оформить его через css конечно).
Также надо зайти на страницу настроек прав доступа /admin/people/permissions, в фильтре написать private и расставить права доступа чтобы пользователи могли писать эти сообщения.

После его установки появляется закладка "Уведомление на почту" здесь /admin/config/messaging/privatemsg
там вам нужно просто откорректировать текст письма. Я сделал его таким:

Здравствуйте, [privatemsg_message:recipient],<br/>
<br/>
Это автоматическое уведомление с сайта [site:name]. Вы получили новое личное сообщение.<br/>
Автор: <b>[privatemsg_message:author]</b><br/>
<br/>
<div style="border:solid 1px #CECECE; padding:5px; background-color: #F9FAFC;">[privatemsg_message:body]</div>
<br/>
Для прочтения полного сообщения, вам нужно пройти по ссылке [privatemsg_message:url]<br/>
<br/>
Если вы не хотите получать больше такие сообщения, вы можете изменить свои настройки здесь: [privatemsg_message:recipient:edit-url]<br/>

(у меня настроена отправка html-сообщений (см. ниже), поэтому здесь используется html-разметка)

Права доступа

Для разграничения прав пользователей на разные ветки и для добавления модераторов, устанавливаем модуль http://drupal.org/project/forum_access (drush dl chain_menu_access acl forum_access, drush en -y forum_access)

После этого можно добавлять "Контейнеры" и "Форумы" здесь: /admin/structure/forum, при этом лучше сразу выставлять к ним права доступа (при необходимости - создайте роль "Администратор форума" здесь /admin/people/permissions/roles). Контейнер - это глобальная группа (например, "о людях", "о животных"), "Форум" - это уже конкретная группа объединяющая топики по какому-то признаку, например "Группа ДДТ" форум, в котором уже будут размещаться темы форума относящиеся к творчеству этой группы и так далее. Можно Контейнеры вообще не создавать и сразу сделать просто одноуровниевый список форумов.

Также надо еще настроить добавить право создавать типы материала "Темы форума" зарегистрированным пользователям.

Дополнительно вы можете включить модуль Contact, который идет в поставке с ядром Друпала, для того чтобы под аватаркой пользователя еще показывалась кнопка "Отправить E-mail" для связи по емейл напрямую, минуя форум.

Даты

Настраиваем форматы дат на сайте, если вы еще этого не сделали:
/admin/config/regional/date-time/formats
Добавляем два формата:
d.m.Y - H:i
d.m.Y
Заходим в типы дат /admin/config/regional/date-time, меняем Среднее значение на 1ю нашу введенную, краткую - на вторую

Заходим в переводы (/admin/config/regional/translate/translate);
ищем по строке by [last_comment_name], переводим её как "от [last_comment_name]"
еще приходится искать просто по слову by и переводить две странных строки - только тогда переводится полностью всё.
Еще делаю поиск по слову "Оставить комментарий" и меняю перевод на "Добавить комментарий"
Show active topics in: = Показать активные темы в разделе:
Show new & updated topics in: = Показать активные темы в разделе:
new = новых
@count[2] new = @count[2] новых
1 min = 1 минута
@count min = @count минуты
@count[2] min = @count[2] минут
1 sec = 1 секунда
@count sec = @count секунды
@count[2] sec = @count[2] секунд
Последний вход = Заходил
Последнее сообщение = К последнему сообщению
next › = ›
last » = »
‹ previous = ‹
« first = «
1 vote = 1 голос
@count votes = @count голосов
@count[2] votes = @count[2] голосов
1 hour = 1 час
@count hours = @count часа
@count[2] hours = @count[2] часов
1 day = 1 день
@count days = @count дня
@count[2] days = @count[2] дней
Notify settings = Настройки почтовых уведомлений
No posts in this forum. = В этом форуме нет сообщений.
Вверху = Вверх
Quote: = Цитата: (пробел в конце)
%author wrote: = %author написал(а): (пробел в конце)
New message = Новое сообщение
You have a new message! Click here to read it. = У вас новое личное сообщение! Нажмите здесь, чтобы прочесть.
New messages = Новые сообщения
You have @count new messages! Click here to read them. = У вас @count новых личных сообщения! Нажмите здесь, чтобы прочесть их.

Еще мне хотелось изменить даты на всём форуме, чтобы они отображались как Сегодня, 12:30, или Вчера 23:30 или 12.12.2012 12:30 (т.е. словами - только сегодня и вчера). К сожалению, в друпале красиво этого сделать нельзя, я хакнул ядро, и сюда решение выкладывать не буду, чтобы не пугать народ (подсказка - common.inc function formate_date заменить строчку 2023)

Проверка

Обычно на этом этапе мне хочется посмотреть, что же у нас уже получается. Но сперва зайдем в /admin/structure/types/manage/forum и поставим "Просмотр перед сохранением" отключено, на вертикальной закладке "Настройка комментирования" убираем галку "Включить поле заголовка комментария", "Предпросмотр комментария" отключено; "Ветвящийся список" я кстати тоже галку убираю, но это на любителя. Комментариев на страницу я ставлю 30. Затем зайдем на node/add/forum и создадим наконец-то первую тему в нашем форуме. Можно сделать по-жругому: зайти на /forum, зайти в определенный форум из списка (мы их создавали на прошлом шаге) и там нажать "New topik" кнопку в правом верхнем углу таблицы. В рузальтате создастся уже не совсем уж страшная вещь, но все же нам ее еще дорабатывать и дорабатывать. В первую очередь - форму комментариев.

Форма комментариев

На всякий случай убираем подсказки по формату ввода - в template.php вашей темы вставляем

function вашатема_filter_tips() {
  return '';
}
function вашатема_filter_tips_more_info() {
  return '';
}

А еще лучше - вообще скрываем от всех пользователей форматы ввода:

fieldset.filter-wrapper.form-wrapper {
  display:none;
}

так же нам нужна нормальная высота формы комментариев, а не та монструозная жуть. Это делается строчкой

.cke_contents {
height: 200px !important;
}
.node-form.node-forum-form .cke_contents {
height: 500px !important;
}

Туда же добавляем строчку для того чтобы спрятать глупую надпись "Ваше имя: name", а так же сделать адекватные отступы:

.comment-form .form-type-item,
.comment-form .form-type-textarea label{
  display: none;
}
 
#content h2.comment-form {
  margin-bottom: 0.2em;
  margin-top: 1em;
  font-size: 2em;
}
 
a.ckeditor_links,
#main a.ckeditor_links {
  font-size: 10px;
  text-decoration: none;
}
 
form.comment-form .form-actions {
  margin-top: 0;
}

Так же я рекомендую вам настроить кнопки в вашем ckeditor так, чтобы они все помещались в одну строчку и не захламляли экран. Это делается так:
Заходим в /admin/config/content/ckeditor/edit, я обычно удаляю группу настроек full и затем делаю все один раз только в Advanced (если вам нужно сложнее, то оставляйте full), захожу в редактирование этого Advanced (/admin/config/content/ckeditor/edit/Advanced), в группе "Основные настройки" ставлю отображать его в full html и filtered html, дальше в группе "Внешний вид редактора", я обычно жму сначала "Панель инструментов" - "основное" и затем добавляю те кнопки, которые мне нужны и выставляю порядок (так, как на скриншоте ниже), при этом добавляю невидимую кнопку "MediaEmbed" а так же ставлю ниже галочку "Plugin for inserting images from Drupal media module". Все сохраняю и вот какой результат оформления нашей формы комментариев получился в итоге:

Чтобы пользователи не кликали по 5 раз на кнопку "Сохранить" и при этом не создавали по 5 одинаковых тем, я добавляю такой код в teamplte.php моей темы оформления:

function advanced_forum_skeletontheme_form_alter(&$form, $form_state, $form_id) {
  if (isset($form['actions']['submit'])) {
    $path = base_path() . drupal_get_path('theme', 'advanced_forum_skeletontheme') . '/images/ajax-loader.gif';
    if (!isset($form['actions']['submit']['#suffix'])) $form['actions']['submit']['#suffix'] = '';
    $loading = '<img src="' . $path . '" alt="loading..."/>';
    $form['actions']['submit']['#suffix'] .= '<script>jQuery("#edit-submit").click(function() {
      jQuery(this).hide();
      jQuery(this).parent().append(\'<div class="throbber_comment_save">' . t('Loading') . '...</div>\');
    });</script>';
  }
}

Да, я знаю что это не совсем красиво, но удобно копировать/вставлять, и оно работает. Если когда-нибудь доведется мне делать специальную форум-сборку для друпала, может сделаю красивее, в отдельном файлике.

Смайлики

Зависит от того, какая версия CKEditor у вас установлена. Сейчас свежая версия 4.х, способ его настройки и установки смайликов заметно отличается от версии 3.6.х.
Итак, для свежей версии 4.х инструкция по установке смайликов следущая:
Вообще смайлики колобков можно скачать отсюда. Если вам лень скачивать по одному, то вот вам готовый архив с понравившимися мне смайлами. Скачиваем его и копируем в sites/default/files/smileys вашего сайта (папку smileys нужно создать)
Открываем /admin/config/content/ckeditor/edit/Advanced
в последней группе "Дополнительные параметры" добавляем

config.smiley_path = '/sites/default/files/smileys/';
config.smiley_images = [
'smile.gif','shok.gif', 'pardon.gif', 'clapping.gif', 'crazy.gif', 'ROFL.gif', 'biggrin.gif', 'blum3.gif', 'mamba.gif', 'dance4.gif', 'yahoo.gif',
'scratch_one-s_head.gif', 'sad.gif', 'cray2.gif', 'aggressive.gif', 'fool.gif', 'nono.gif', 'tomato2.gif', 'rtfm.gif', 'Cherna-facepalm.gif',
'dash1.gif', 'help.gif', 'new_russian.gif', 'blush.gif', 'Connie_twiddle.gif', 'wink.gif',
'Laie_11.gif', 'phil_19.gif', 'big_boss.gif', 'Connie_runner.gif', 'ok.gif', 'secret.gif', 'stop.gif', 'unknw.gif', 'wacko.gif', 'drinks.gif',
];
config.smiley_descriptions = [
'Smile', 'Shock', 'Pardon', 'Bravo!', 'Crazy', 'LOL', 'Big grin', 'Blum', 'Mamba', 'Dance', 'Yahoo!',  
'Scratch head', 'Sad', 'Crying', 'Aggressive', 'Fool', 'No no no', 'Tomato', 'RTFM', 'Facepalm',
'Dash to a wall', 'Help', 'New russian', 'Blush', 'Twiddle', 'Wink',
'Money', 'Clean up', 'Big boss', 'Runner', 'OK', 'Secret', 'Stop', 'Unknow', 'Wacko', 'Drinks',
];
config.smiley_columns = 6;

Дальнейшая настройка CKEditor'a 4.x прекрасно описано на dru.io.

Вот мой полный конфиг для настройки CKEditor 4.x:

config.extraAllowedContent = 'span(*); p(*); ul(*); li(*); ';
config.smiley_path = '/sites/default/files/smileys/';
config.smiley_images = [
'smile.gif','shok.gif', 'pardon.gif', 'clapping.gif', 'crazy.gif', 'ROFL.gif', 'biggrin.gif', 'blum3.gif', 'mamba.gif', 'dance4.gif', 'yahoo.gif',
'scratch_one-s_head.gif', 'sad.gif', 'cray2.gif', 'aggressive.gif', 'fool.gif', 'nono.gif', 'tomato2.gif', 'rtfm.gif', 'Cherna-facepalm.gif',
'dash1.gif', 'help.gif', 'new_russian.gif', 'blush.gif', 'Connie_twiddle.gif', 'wink.gif',
'Laie_11.gif', 'phil_19.gif', 'big_boss.gif', 'Connie_runner.gif', 'ok.gif', 'secret.gif', 'stop.gif', 'unknw.gif', 'wacko.gif', 'drinks.gif',
];
 
config.smiley_descriptions = [
'Smile', 'Shock', 'Pardon', 'Bravo!', 'Crazy', 'LOL', 'Big grin', 'Blum', 'Mamba', 'Dance', 'Yahoo!',  
'Scratch head', 'Sad', 'Crying', 'Aggressive', 'Fool', 'No no no', 'Tomato', 'RTFM', 'Facepalm',
'Dash to a wall', 'Help', 'New russian', 'Blush', 'Twiddle', 'Wink',
'Money', 'Clean up', 'Big boss', 'Runner', 'OK', 'Secret', 'Stop', 'Unknow', 'Wacko', 'Drinks',
];
config.smiley_columns = 6;
config.disableNativeSpellChecker = false;
config.removePlugins = 'liststyle,scayt,';
config.allowedContent = true;

В группе настроек "CSS" в на странице настроек CKEditor мне пришлось указать вручную несколько css файлов чтобы шрифт внутри ckeditor соответсвовал моему сайту: Я выбрал "Определить CSS стили" и затем добавил следущее:

sites/all/themes/skeletontheme/css/style.css,%t/css/styles-custom.css

И затем добавил отдельный файл с названием css/ckeditor.css в мою тему оформления, со следующим содержимым:

body {
  font-size: 16px;
  border-top: none;
  padding: 0.5em;
  color: #444444;
}

Так же я установил модуль One Click Upload (2.x версия, сейчас в dev статусе, но работает нормально). В отличии от прошлой версии ничего дополнительно скачивать не надо, все уже есть в модуле. Надо лишь включить соответствующую кнопку на странице CKEditor /admin/config/content/ckeditor/edit/Advanced и поставить галку там же ниже (One click upload), затем зайти на страницу прав доступа и добавить разрешение на загрузку jpg в поле one click upload для авторизованных пользователей.

drush en -y ocupload

Дальше про смайлы можете не читать если только у вас не установлена старая версия ckeditor'a 3.6.х
Устанавливаем смайлики http://drupal.org/project/smiley
Включаем кнопку Smiley extra в настройках wysywig профиля /admin/config/content/wysiwyg

По желанию можно расширить наборы смайликов - для этого надо выбрать новые смайлики здесь http://www.kolobok.us/content_plugins/gallery/gallery.php?smiles.30 , скопировать понравившиеся gif'ки себе на компьютер, например в папку kolobok_extend, и затем всю эту папку залить на сайт по пути /sites/all/modules/smiley/packs
Затем зайти в настройку смайликов /admin/config/content/smiley и добавить по одному каждый смайлик вручную. (можно сделать лучше - точно так же залить все смайлы в папку /sites/all/modules/smiley/packs/название_вашей_папки_любое и зайти на закладку "Импорт" /admin/config/content/smiley/import, по идее он автоматически всё импортнёт). Затем мне пришлось изменить текст у некоторых смайликов, потому что они ломали вёрстку в визуальном редакторе, пототму что комбинации типа =0 встречаются довольно часто. Список изменений текстов здесь невозможно написать, если я когда-нибудь напишу модуль экспорта для smiley, то выложу сюда экспортированный вариант)

Аватарка

Еще надо создать стиль изображений для аватарки здесь /admin/config/media/image-styles/add
(я сделал "Масштабирование" 160х160), и потом выставить его в качестве стиля для аватарок здесь /admin/config/content/advanced-forum
Потом зайти на /admin/config/content/advanced-forum и там в поле "Шаблон для отображения аватара пользователя" выставить нужный стиль (обратите внимание - "Стиль изображений форума" поле не то! Нужно именно "Шаблон для отображения аватара пользователя").

Author pane

Теперь надо настроить инфу о пользователей, которая выводится слева от каждого сообщения на форуме (например кол-во сообщений, когда он последний раз заходил и другое). Сначала устанавливаем модуль author_pane, затем устанавливаем волшебный модуль http://drupal.org/project/user_stats , и дописываем в свой файлик advanced-forum.102rota.author-pane.tpl.php (в скине оформления вашего форума) строчку

      <?php /* Posts */ ?>
      <?php if (isset($user_stats_posts)): ?>
        <div class="author-pane-line author-posts">
          <span class="author-pane-label"><?php print t('Posts'); ?>:</span> <?php print $user_stats_posts; ?>
        </div>
      <?php endif; ?>
 
       <?php /* Last login*/ ?>
      <?php if (isset($user_stats_login_date)): ?>
        <div class="author-pane-line author-login-date">
          <span class="author-pane-label"><?php print t('Last login'); ?>:</span> <?php print format_date($user_stats_login_date, 'medium'); ?>
        </div>
      <?php endif; ?>

Правда мне пришлось хакнуть модуль user_stats, в файле user_stats.author-pane.inc добавить следующие строчки, чтобы отображалась дата последнего входа: (по аналогии с уже существующими)

function user_stats_preprocess_author_pane..
...
      if ($cached_stats[$account_id]['login_date'] !== FALSE) {
        $variables['user_stats_login_date'] = $cached_stats[$account_id]['login_date'];
      }
...
      $login_date = user_stats_get_stats('login_date', $account_id);
      if ($login_date !== FALSE) {
        $variables['user_stats_login_date'] = $login_date;
      }   
      $cached_stats[$account_id]['login_date'] = $login_date;

Уведомления

Теперь очень важно - настроить подписку на уведомления о новых комментариях на форуме.
Надо установить модуль http://drupal.org/project/comment_notify, а так же желательно установить модуль http://drupal.org/project/htmlmail, потому что все комментарии пишутся в wysywig редакторе и мы не хотим, чтобы в письмах присутствовали комменты типа

привет!

Так же мне пришлось установить модуль http://drupal.org/project/smtp, потому что it-patrol не хотел почему-то отправлять мои письма - пришлось настроить через gmail отправку, кстати, работает прекрасно, все письма приходят моментально.
Итак, установили модуль smtp, настраиваем его как написано здесь: http://softnastroy.com/content/nastraivaem-otpravku-pochty-s-sayta-drupa...
Вкратце - надо на странице /admin/config/system/smtp пропписать адрес сервера smtp.gmail.com, порт 465, использовать SSL, ввести свои логин-пароль и поставить галку "Разрешить отправлять html-письма"

Теперь надо настроить, чтобы отправлялись именно html-сообщения, причем именно через модуль smtp. (если у вас не используется модуль smtp, то на этой же странице вам надо поставить htmlmailsystem по умолчанию для всего сайта)- заходим на /admin/config/system/mailsystem
раздел "Новый класс", там первый селект (формат) выбираем htmlmailsystem, второй селект выбираем smtpmailsystem, жмём кнопку "Сохранить настройки". Страница обновляется, теперь в селекте "Класс интерфейса MailSystemInterface, используемый по умолчанию на всем сайте" можно выбрать странный пункт "HtmlMailSystem_SmtpMailSystem" - выбираем его, сохраняем. Всё, теперь письма будут отсылаться через smtp но в формате html.

Теперь настраиваем сам модуль comment_notify. Заходим на /admin/config/people/comment_notify , ставим галку напротив "Тема форума", "по умолчанию подписывать пользователей";
Тексты писем:
комментаторам:

Здравствуйте, [comment-subscribed:author],<br/>
<br/>
[comment:author] прокомментировал тему "[comment:node:title]"<br/>
<br/>
<div style="border:solid 1px #CECECE; padding:5px; background-color: #F9FAFC;">
[comment:body]
</div>
<br/>
Ссылка: <a href="[comment:url]">[comment:url]</a><br/>
<br/>
<br/>
Это автоматическое сообщение. Не отвечайте на него!<br/>
<br/>
Вы можете отказаться от рассылки по этой ссылке [comment-subscribed:unsubscribe-url]<br/>
<br/>
Вы можете остановить автоматическую подписку на новые комментарии, изменив настройки своего аккаунта здесь: [comment-subscribed:author:edit-url]<br/>
<br/>
С уважением, [site:name]<br/>

Авторам нод:

Здравствуйте, [comment:node:author],<br/>
<br/>
Вы получили новый комментарий к теме "[comment:node:title]"<br/>
<br/>
<div style="border:solid 1px #CECECE; padding:5px; background-color: #F9FAFC;">
[comment:body]
</div>
<br/>
Ссылка: <a href="[comment:url]">[comment:url]</a><br/>
<br/>
<br/>
Вы можете остановить автоматическую подписку на созданные вами темы форума, изменив настройки своего аккаунта здесь: [comment:node:author:edit-url]<br/>
<br/>
С уважением, [site:name]<br/>

При этом под формой комментариев будет не очень красивая мешанина из чекбоксов. Чтобы это было более упорядоченно, я написал крошечный модуль comment_notify_fieldset, который организует все чекбоксы в один fieldset, который затем можно привести к божескому виду с помощью css. Вот код css:

.comment_notify_description {
  font-size:12px;
}
 
fieldset.notify_settings_fieldset {
  margin-bottom:0;
  margin-top:0;
  width:700px;
  float:right;
}
 
fieldset.notify_settings_fieldset legend {
  background:none;
  border:none;
  font-size:12px;
  position:relative;
  width: 226px;
  float: right;
}
 
html.js fieldset.notify_settings_fieldset.collapsed {
  border-top-width: 0;
}
 
fieldset.notify_settings_fieldset .fieldset-wrapper {
margin-top:0;
}
 
fieldset.notify_settings_fieldset .form-type-checkbox, 
fieldset.notify_settings_fieldset .form-radios {
  margin-left: 0;
}

Код моего крошечного модуля можно скачать отсюда.

Теперь проверяем подписку. Для этого смотрим, чтобы у админа /user/1/edit был выставлен ваш действующий email, создаем тему форума. Затем создаем нового пользователя и комментируем эту тему. После этого заходим в отчет о состоянии /admin/reports/status и запускаем cron вручную (потому что письма отсылаются по крону). Через 10 секунд обновляем свою почту, уведомление о комменте должно быть там. Если нет, тестируйте всё по очереди - сначала smtp отправку (там есть поле для тестового письма), затем попробуйте выставить опять по умолчанию формат письма, т.е. не html, и т.д.

Update: Теперь единственное что осталось - это добавить возможность подписки на всю ветку комментариев по клику на специальную ссылку в самом верху темы форума.
Устанавливаем https://www.drupal.org/project/node_notify модуль

Заходим на /admin/config/people/node_notify

Ставим галочкина против "Тема форума" и "Опрос" типов контента. Я не ставлю им галки для подписки по умолчанию. Дальше меняем заголовок на "Новый комментарий в "[comment:node:title]" от [comment:author]". Тело письма вставляем такое же, как для Comment notify (я описывал выше, первый шаблон из двух).

Ссылка уже начнет отображаться, однако она не красивая (не имеет стиля оформления advanced forum). Для исправления надо в ваш модуль добавить хук:

/**
 * Implements hook_node_view().
 */
function advanced_forum_102rota_style_node_view($node) {
  global $user;
    if (isset($node->content['links']['node']['#links']['subscribe'])) {
      $title = $node->content['links']['node']['#links']['subscribe']['title'];
      $node->content['links']['node']['#links']['subscribe']['title'] = '<span>' . $title . '</span>';
      $node->content['links']['node']['#links']['subscribe']['html'] = TRUE;
      $node->content['links']['node']['#links']['subscribe']['attributes'] = array(
        'title' => t('Subscribe to email notifications about comments in this thread'),
        'class' => array('af-button-small', 'subscribe'),
      );
  }
}

и затем в скин оформления advanced forum в файлик advanced-forum.102rota.images.css прописать доп. стили:

.comment-subscribe .af-button-small.subscribe span,
.post-subscribe .af-button-small.subscribe span,
.forum-post-links .af-button-small.subscribe span {
  background: transparent url("images/ap_email.png") no-repeat;
}

Удобство

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

Встроенные вьюсины из Advanced forum'а плохи. Нет, в смысле сами таблички очень даже ничего, но в них есть лишние элементы и вывод там не интуитивно понятен для пользователя.
Таких мелочей очень много, и именно они как раз и определяют, почему люди, услышав "Форум на друпале" кривят лица и отворачивают носы. Я постарался всё исправить.

Здесь я выкладываю все исправленные мною вьюсины Advanced forum'a, а так же свою тему оформления для форума, которую я назвал 102rota (это страйкбольная команда, для которой я делал форум на друпале). Может быть это поможет кому-то сэкономить несколько дней работы, которую пришлось делать мне, когда я писал эту статью.

Чтобы включить тему оформления: у меня стоит модуль advanced_forum_more_styles, надо включить его, и, соответственно, тот модуль с оформлением, что я выложил в конце статьи. Потом в настройках advanced форума выставить, что должна использоваться тема "102рота"

Мой пример вы можете посмотреть по ссылке http://102rota.ru/forum, правда там мало тем, доступных для посторонних.

Главное меню

Главное меню для форума тоже должно быть удобным. Обычно я делаю его отдельным от основного меню сайта и добавляю туда следущие ссылки:
Форумы (forum)
Новые сообщения (forum/new)
Активные сообщения (forum/active)
Личные сообщения (messages)
Профиль (user)
Вход (user/login) (будет показываться только анонимным пользователям)

Иногда нужна кнопка "Всё прочитано", которая отмечает все темы на форуме прочитанными для данного пользователя. Если она вам нужна, то вы можете создать просто пункт в меню, видимый для пользователя, который ссылается на /forum/markasread

Склонение русских имён

Нужно еще дополнительно установить модуль Real Name, чтобы у пользователей отображались не их логины для захода на сайт, а нормальные имена. После установки и включения, надо еще включить модуль private message real name integration (входит как подмодуль модуля real name), чтобы личные сообщения продолжали работать так же хорошо. После этих действий надо создать у пользователей новое поле (здесь /admin/config/people/accounts/fields) я назвал его "Отображаемое имя", вывел его на форму регистрации, но не сделал обязательным. После создания поля надо зайти в настройку модуля Real Name /admin/config/people/realname и выставить это поле в качестве паттерна (у меня получилось [user:field_user_realname] ). Готово.

Еще одна маленькая приятность: в Advanced forum'e если комментарий был ответом на другой комментарий, выводится ссылка "(Reply to #NN)". Я считаю это неинформативным и решил немного его улучшить. Зашел в переводы /admin/config/regional/translate/translate, перевел эту строку как (Ответ на пост #!post_position), а затем зашел в template.php моей темы оформления и добавил хук _preprocess_comment (если у вас его не было) с таким содержанием:

function skeletontheme_preprocess_comment(&$variables) {
  //Если это ответ на коммент
  if ($variables['comment']->pid > 0) {
    $parent_comment = comment_load($variables['comment']->pid);
    //Эта библиотека нужна для склонения в Дательный падеж
    include_once(drupal_get_path('theme', 'advanced_forum_skeletontheme') . '/libs/names.php');
    $parent_author_name = strip_tags(theme('username', array('account' => user_load($parent_comment->uid))));
    $name = new RussianNameProcessor($parent_author_name);
    //Заменяем перевод "(Ответ на пост #!post_position)" (т.е. вам обязательно надо переводить в админке именно так)
    $variables['in_reply_to'] = str_replace("(Ответ", "(Ответ " . $name->fullName($name->gcaseDat), $variables['in_reply_to']); 
    $parent_comment_body = $parent_comment->comment_body['und'][0]['value'];
    if (strlen($parent_comment_body) > 600) {
      $parent_comment_body = substr($parent_comment_body, 0, 600) . '...';
    }
    $variables['content']['comment_body'][0]['#markup'] = check_markup('[quote=' . $parent_author_name . ']' . $parent_comment_body . '[/quote]', 'filtered_html') .  $variables['content']['comment_body'][0]['#markup'];
  }
}

При этом, конечно, надо скачать библиотеку names.php отсюда http://www.web-junior.net/download-manager.php?id=10 и вставить его в свою тему по адресу ваша_тема/lib/names.php
UPD: прикрепил библиотеку к этой статье, видимо у автора какие-то проблемы с сайтом. http://nikita-petrov.com/sites/default/files/articles/nastroyka-udobnogo...

Результат: теперь это сообщение выводится как, например: "Ответ Барону на пост #39"

Настройка поиска

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

/**
 * Implements hook_comment_view().
 */
function advanced_forum_102rota_style_comment_view($comment) {
  if (arg(0)=='forum' && arg(1)=='search') {
    $comment->content['links']['comment']['#links']['to-comment'] = array (
      'title' => '<span>' . "Перейти к комментарию" . '</span>',
      'attributes' => array (
        'title' => 'При нажатии вы попадете в соответствующую тему форума и автоматически пролистается до этого комментария',
        'class' => array('af-button-small'),
      ),
      'href' => base_path() . 'comment/' . $comment->cid . '#comment-' . $comment->cid,
      'external' => TRUE,
      'html' => TRUE,
      'weight' => '50',
    );
  }
}

Настройка опросов

Не всем форумам нужна эта фишка, но если понадобится, то вот инструкция о том, как настроить удобные опросы на вашем форуме.
Устанавливаем модуль Poll (он в ядре Друпала, его надо лишь включить)
После этого надо зайти в редактирование свежесозданного типа материала "Опрос" /admin/structure/types/manage/poll, отключить предпросмотр комментариев и самих опросов, отключить заголовок у комментариев к этому опросу; затем зайти в поля и добавить существующее поле "taxonomy_forums" Ссылка на термин таксономии из словаря Forums.
После этих действий при заходе на страницу какого-либо созданного форума у вас сверху уже будет две кнопки - не только создать тему форума, но и "новый опрос". Даже иконка для этой кнопки уже есть встроенная :)
Останется только оформить чтобы они были в один ряд и порядок (подсказка: добавить css стили

.forum-node-create-links {
  width: 32%;
}
 
.forum-node-create-links.forum-node-create-links-top {
  display: block;
  padding-bottom: 5px;
}

Но теперь у нас другая проблема - обе кнопки имеют перевод "Новая Опрос" и "Новая Тема форума". Причем переводятся они только одновременно! :( Для решения этого приходится реализовать специальный хук в template.php темы оформления:

/**
 * Theme function to show list of types that can be posted in forum.
 */
function advanced_forum_skeletontheme_advanced_forum_node_type_create_list(&$variables) {
  $forum_id = $variables['forum_id'];
 
  // Get the list of node types to display links for.
  $type_list = advanced_forum_node_type_create_list($forum_id);
 
  $output = '';
  if (is_array($type_list)) {
    foreach ($type_list as $type => $item) {
      $output .= '<div class="forum-add-node forum-add-' . $type . '">';
      if ($item['name']=='Опрос') $name = 'Новый Опрос';
      else $name = t('New @node_type', array('@node_type' => $item['name']));
      $output .= theme('advanced_forum_l', array(
        'text' => $name,
        'path' => $item['href'],
        'options' => NULL,
        'button_class' => 'large'
          ));
      $output .= '</div>';
    }
  }
  else {
    // User did not have access to create any node types in this fourm so
    // we just return the denial text / login prompt.
    $output = $type_list;
  }
 
  return $output;
}

Еще стиль результатов опросов очень уж страшный - черные полоски, куча слов, все на английском. Чтобы перевести с английского, см. раздел выше про ввод переводов; а чтобы улучшить внешний виж результатов можете использовать вот этот css код:

.poll .bar .foreground {
background-color: #375199;
}
 
.poll .percent {
font-size: 70%;
}

Мне еще надо было довольно редкую вещь сделать - чтобы рядом с результатам опроса отображались имена тех, кто проголосовал за этот вариант. Я сделал отдельный модуль poll_transparent, правда он требует снова хака ядра (в poll.module добавить параметр в функцию темизации poll_bar, строки 47 и 833), по другому пока не получается сделать, так что здесь я это решение постить не буду.

Наконец-то опросы готовы!

Мелочи

Чтобы в хлебных крошках пропало слово Forums, нужно зайти в настройки словаря таксономии /admin/structure/taxonomy/forums/edit и изменить его название с Forums на что-нибудь русское, например Форумы.
Если вам нужно куда-то прилепить ссылку на выход из текущего аккаунта (user/logout), то я это делаю так: в своем модуле создаю отдельную закладку для этого, которая отображается на странице профиля:

/*
* Implements hook_menu().
*/
function advanced_forum_102rota_style_menu() {
  $items = array();
 
  $items['user/%/log-out'] = array(
    'title' => t('Log out'),
    'page callback' => 'advanced_forum_102rota_style_logout',
    'access arguments' => array('access content'),
    'type' => MENU_LOCAL_TASK,
  );
 
  return $items;
}
 
function advanced_forum_102rota_style_logout() {
  module_load_include('pages.inc', 'user');
  user_logout();
}

Тогда это выглядит примерно вот так:

Кнопка "Вверх"

Иногда удобно нажать на кнопку чтобы быстро переместиться на самый верх страницы. Дл ядобавления этой кнопки надо сделать следущее:
В своем модуле реализовать хук :

/**
 * Implements hook_comment_view().
 */
function advanced_forum_102rota_style_comment_view($comment) {
  $comment->content['links']['comment']['#links']['comment-jump'] = array (
      'title' => '<span>' . t("Top") . '</span>',
      'attributes' => array (
        'title' => t('Jump to top of page'),
        'class' => array('af-button-small', 'forum-jump-link'),
      ),
      'href' => '',
      'fragment' => 'forum-topic-top', 
      'fragment' => 'page-top', 
      'external' => TRUE,
      'html' => TRUE,
      'weight' => 50,
    );
}
 
/**
 * Moves 'Jump to top' link to the end of the array.
 */
function advanced_forum_102rota_style_comment_view_alter(&$build) {
  $link = $build['links']['comment']['#links']['comment-jump'];
  unset($build['links']['comment']['#links']['comment-jump']);
  $build['links']['comment']['#links'] = $build['links']['comment']['#links'] + array(
    'comment-jump' => $link,
  );
}

И затем переопределить шаблон page.tpl.php в теме оформления и в самый верх его добавить одну строчку:

<a name="page-top" href="#"></a>

После очистки кеша кнопка должна появиться у всех комментариев и работать.

Удачи!

Прикреплённые файлы: 
Drupal 7

Комментарии

Гость 24.01.2012 - 23:14

Хорошее начало, жаль, что нет продолжения про Advanced forum
и нет rss на сайте, с ним удобно обновления отслеживать...

Nikita Petrov 17.04.2013 - 22:12

Спасибо за внимание :) За этот год много чего изменилось - и rss на сайт добавил, и статью дописал по полной (потому что столкнулся с этим второй раз). Наслаждайтесь! :)

Анатолий 16.10.2013 - 04:02

"...Здесь я выкладываю все исправленные мною вьюсины Advanced forum'a, а так же свою тему оформления для форума, которую я назвал 102rota...."

Подскажите, пожалуйста, где эти файлы выложены, не вижу здесь...

Nikita Petrov 18.10.2013 - 02:20

Спасибо что заметили, прикрепил вьюсины и скин для форума в конец статьи (вложенные файлы)

Гость 19.10.2013 - 16:51

Здравствуйте.Установил модуль quote и jsquote кнопка jsquote появляется в теме форума и нажимается, но цитата не вставляется, нажимаю обновить страницу и цитата после обновления страницы появляетсяПодскажите в чем может быть причина.

Nikita Petrov 19.10.2013 - 18:45

Не знаю, какой модуль jsquote вы ставили, но пока нормально работающего модуля цитат на той же странице, без перезагрузки, у меня нет.

Олег 20.10.2013 - 00:04

Кто то из ребят на друпал ру оставлял ссылку на скачивание.Модуль quote конечно очень проблемный, форум без цитирования не форум, а тут такая засада и разработчик не занимается с модулем.Очень нужна альтернатива.

Ден 16.11.2013 - 16:22

Спасибо, ваша статья очень помогла
Остались которые вопросы... но это скорее из за моего не полного познания в данной теме)
Если есть возможность резжевать пару моментов - мой скайп lanakondr1
Зарание спасибо

Игорь 20.01.2014 - 17:12

Добрый!
Если не трудно, напишите полный код со всеми ковычками, это код который под
"Правда мне пришлось дописать в модуль user_stats.module такие строчки, чтобы отображалась дата последнего входа: (по аналогии с уже существующими)", я понимаю, что вроде ничего трудно. Но так как моего нулевого познания в программировании (коде) хватает только на копи - паст в нужное место, то тут трудно догадаться как там по аналогии. Смотрел, смотрел в код - ни какой аналогии не нашел!
Спасибо за понимание!

Nikita Petrov 23.01.2014 - 14:32

Вам надо было искать функцию user_stats_preprocess_author_pane, которая оказалась не в файле user_stats.module, а в соседнем user_stats.author-pane.inc . Спасибо за комментарий, добавил это уточнение в статью. Вот полный изменённый код этой функции, но осторожно - гарантированно он будет работать только для версии модуля user_stats 7.x.-1.x.-dev, который стоит у меня. Так что лучше самому добавить те строчки, что указаны в статье выше. Но тем не менее:

/**
 * Implements hook_preprocess_author_pane().
 */
function user_stats_preprocess_author_pane(&$variables) {
  if (function_exists('author_pane_api') && author_pane_api() == "2") {
    // Check if this preprocess needs to be run given who's calling it.
    if (!author_pane_run_preprocess('user_stats', $variables['caller'])) {
      return;
    }
  }
 
  $account_id = $variables['account']->uid;
 
  if ($account_id != 0) {
    static $cached_stats = array();
    if (isset($cached_stats[$account_id])) {
      // Pull the values from the cache
      if ($cached_stats[$account_id]['posts'] !== FALSE) {
        // We don't want the variable to be created if the user doesn't have
        // access to see them to avoid printing the label.
        $variables['user_stats_posts'] = $cached_stats[$account_id]['posts'];
      }
 
      if ($cached_stats[$account_id]['ip'] !== FALSE) {
        $variables['user_stats_ip'] = $cached_stats[$account_id]['ip'];
      }      
      if ($cached_stats[$account_id]['login_date'] !== FALSE) {
        $variables['user_stats_login_date'] = $cached_stats[$account_id]['login_date'];
      }
    }
    else {
      // No cached values for this user. Fetch them.
      $posts = user_stats_get_stats('post_count', $account_id);
      if ($posts !== FALSE) {
        $variables['user_stats_posts'] = $posts;
      }
 
      $ip = user_stats_get_stats('ip_address', $account_id);
      if ($ip !== FALSE) {
        $variables['user_stats_ip'] = $ip;
      }
 
      $login_date = user_stats_get_stats('login_date', $account_id);
      if ($login_date !== FALSE) {
        $variables['user_stats_login_date'] = $login_date;
      }    
 
      // Write to the cache variable. We do this even if it's FALSE because
      // we check for that before using it.
      $cached_stats[$account_id]['posts'] = $posts;
      $cached_stats[$account_id]['ip'] = $ip;
      $cached_stats[$account_id]['login_date'] = $login_date;
    }
  }
}
Светлана 08.07.2014 - 19:37

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

Nikita Petrov 13.10.2014 - 11:18

Светлана, во-первых можете присмотреться к правам доступа к контейнерам форума (они здесь: admin/structure/forum , ссылки редактировать контейнер и редактировать форум)
Там есть группа полей "КОНТРОЛЬ ДОСТУПА". Возможно это то, что вам надо.

Так же можете изучить модуль Organic Groups, в нём должен быть похожий функционал. Или поискать другие модули друпала, в которых есть расширение прав доступа на добавление материалов. К сожалению, конкретнее сказать не могу, пока не было необходимости в таком функционале

Геннадий 12.11.2014 - 23:15

Спасибо, Никита, за отличную статью и свои доработки с цитированием. Работает отлично.
И на всякий случай запишу здесь (чтобы и самому потом не забыть), что высоту поля комментариев можно изменить в sites\all\modules\wysiwyg\editors\ckeditor.inc, где найти слово 'height' => 420 и заменить на 220.

Геннадий 12.11.2014 - 23:59

Никита, хотел доработать Views форума, но ссылки внизу пустые - advancedforumviewsexportzip54754.zip
advancedforum102rotastylezip81858.zip

Геннадий 25.11.2014 - 20:22

Добрый вечер, Никита, можете заново восстановить файлы advancedforumviewsexportzip54754.zip
advancedforum102rotastylezip81858.zip, которые сейчас пустые? Или дать описание доработок Views форума? Спасибо.

Геннадий 25.11.2014 - 21:03

Спасибо, Никита! Вот, большое желание доработать форум, а более лучшей и грамотной статьи об этом я пока не встречал, так что вы меня заинтриговали :)
Теперь буду разбираться. С уважением...

Геннадий 06.12.2014 - 13:15

Добрый день, Никита, возникла идея, сделать общий доступ на отдельную тему форума, чтобы все могли там публиковать временные объявления, как например, назначать встречу в Скайпе, это как общая доска объявлений, на которой мелом написал, потом стер и написал новое (чтобы не плодить отдельные сообщения).
Для этого нашел Forum Access (drupal.org/project/forum_access), но это тянет за собой установку трёх модулей (у меня уже 60). А есть более простое решение?

Nikita Petrov 07.12.2014 - 12:22

Не стоит бояться установки дополнительных модулей. Чем сложнее сайт, тем больше ему нужно кода. Тут вариант или написать код самому или установить специализированный модуль. Конечно же нужно выбирать второе. Вам наверняка потом понадобятся разделы форума, которые будут видеть не все, и модуль разделения прав доступа вам еще пригодится.

Геннадий 07.12.2014 - 15:59

Пожалуй соглашусь с вами, порою достаточно грамотного совета, чтобы найти решение.

Геннадий 11.12.2014 - 15:43

Установил Forum Access (пока на локалке), выставил всем права (кроме незарегистрированных) на редактирование и даже удаление, но обычный пользователь при редактировании чужого сообщения видит в поле Body:
"Это поле отключено, потому, что у вас нет прав для его редактирования".

Все просмотрел, но не могу найти, как открыть это поле. (???)

И еще. При редактировании, у обычного пользователя появляются лишние поля (смена языка, смена темы форума). Как их убрать?

Геннадий 12.12.2014 - 00:19

Проблема с доступом к редактированию для авторизованных пользователей встречается у многих, как я выяснил. Поставил дополнительно Taxonomy Access Control (https://www.drupal.org/project/taxonomy_access), но для редактировании чужого сообщения это не помогло. Поле закрыто.

Потом выяснил, что если я даю доступ авторизованному пользователю доступ на фильтр "Use the Full HTML text format", то поле появляется для редактирования (использую только CKEditor 3.6.2.7275). Хотя для типа материала Форум в таксономии выставил "Use the Filtered HTML text format", и разрешение дал.
Какой-то тупик. Никита, можете что-то посоветовать?

Женя 15.12.2014 - 19:28

Добрй день, Nikita, не подскажешь, как сделать аватар на форуме(выводимый Author pane) ссылкой на профиль пользователя.

я нашел два решения, но они оба не совсем решают эту задачу:

1. первое решение нашел в описании файла author-pane-user-picture.tpl.php , Use $picture_link_profile instead of $picture if you want the picture to link to the account profile page. (Но тогда не выводится дефолтный аватар, для незарегестрированного пользователя)

2. второе решение(https://www.drupal.org/node/582482) обернуть в сылку
uid; ?>"><?php print $picture; ?> (Но тогда дефолтный аватар незарегистрированного пользователя ссылается на страницу /user/0)

Буду благодарен за любую помощь.

Nikita Petrov 18.12.2014 - 03:19

А что вам мешает в шаблоне перед тем как оборачивать аватар в ссылку сначала проверить, зареген ли пользователь (т.е.global $user; if ($user->uid!=0) { obernyt' v ssilky }

Женя 18.12.2014 - 20:39

Nikita, спасибо за ответ, но это проверяеся текуший пользователь, а не автор. А моих познаний php, ксожалению, не хватает, чтобы составить правильное условие.

Nikita Petrov 12.01.2015 - 22:18

Евгений, решение есть, но сложное - вам надо копаться в модуле author_pane и найти функцию, которая вызывает theme функцию по выводу шаблона author_pane на экран. В этой функции будет что-то типа return theme('author_pane', и тут переменные для шаблона)
Вам останется только узнать, в какой переменной хранится uid автора поста и затем уже в шаблоне вставить ссылку на user/UID.
Извини что путанно написал, подробнее не могу, нужно будет тогда самому все делать, а это время.

Женя 10.01.2016 - 18:02

Спустя год, снова вернулся к этому вопросу, и решение оказалось очень простым: if ($account->uid != 0) { obernyt' v ssilky }, возможно кому-то еще пригодится...

Олег 28.01.2015 - 20:43

В файле author-pane-user-picture.tpl.php модуля author_pane все написано в комментариях, а именно:
* Use $picture_link_profile instead of $picture if you want the picture to
* link to the account profile page.

Т.е. Вам надо подключить этот шаблон к себе в тему и изменить print $picture; на print $picture_link_profile;

Спасибо за статью.

Nikita Petrov 28.01.2015 - 21:39

Отлично, не замечал этого комментария в коде, спасибо за полезный опыт, Олег!

Женя 28.01.2015 - 22:24

спасибо, но я находил данное решение, и оно указанно в вопросе, и его недостаток тоже.

Олег 03.01.2016 - 16:02

Здравствуйте
подскажите, никак не пойму, и найти нигде не могу, как перекрыть шаблон сайта отдельным шаблоном форума? Вот как у Вас сделано. Подозреваю функцию в template.php надо вписывать?

Nikita Petrov 03.01.2016 - 22:51

Олег, частично вы правы, можно переопределить часть стандартных шаблонов сайта (page.tpl.php, node.tpl.php, comments.tpl.php и т.д.) в теме оформления сайта, там где лежит у вас template.php. Однако часть элементов именно Advanced forum нельзя переопределить через тему оформления, например шаблон forum-list.tpl.php в котором отображается список форумов или например author-pane.tpl.php который отвечает за часть комментария с аватаркой пользователя, его онлайн-статусом и так далее. Так вот эти части переопределяются через свою _тему оформления advanced forum_, которая по сути является обычным друпал-модулем. Прочитайте часть моей статьи выше с заголовком "Тема оформления", это оно и есть.

Олег 03.01.2016 - 23:04

Никита, спасибо за ответ, читал, не получается. Чтобы я не делал с файлами темы оформления advanced forum, получается одно и тоже, изменения происходят, но выводится в основном контенте, внутри page.tpl основного шаблона. А мне надо, что бы шаблон форума не имел ничего общего с шаблоном сайта, за исключение меню, ну и кой какой мелочи. Я видимо до какой то простой вещи никак не допру.

Олег 03.01.2016 - 23:06

пробовал page--forum.tpl.php
содержимое из advanced-forum.naked.forums.tpl.php
Notice: Undefined variable: forums_defined в функции include() (строка 27 в файле/page--forum.tpl.php).

Олег 04.01.2016 - 00:22

Никита, спасибо за участие, на друпал ру подсказали, надо через print render($page['content'] ) выводить, все вроде сработало

Nikita Petrov 04.01.2016 - 00:38

в таком случае используйте хук _custom_theme, например:

function hook_custom_theme() {
if (arg(0)=='forum') {
return 'my_forum_theme_name';
}
}

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

Олег 04.01.2016 - 00:46

а сами топики (ноды) тоже переопределятся, или для тапа материала-тема форума надо будет вот этот хук?
<?php function themeName_preprocess_page(&$vars) {
if (isset($vars['node']->type)) {
$vars['theme_hook_suggestions'][] = 'page__' . $vars['node']->type;
}
};?>

Олег 04.01.2016 - 01:12

правильно ли я додумал? - если применить hook_custom_theme - то для форума будет применяться полностью другая тема
если использовать туже тему, то тему топиков можно переопределить с помощью themeName_preprocess_page

Александр 07.01.2016 - 11:06

Никит, статьи у тебя очень интересные, давно постоянно читаю. Раньше на других сайтах когда делал по твоим статьям все работало, сейчас занялся новым, столкнулся с проблемой.
при нажатии quote в ckeditor вставляется просто [quote=user][/quote] без самого текста внутри этой цитаты.
В чем может быть проблема?

Александр 07.01.2016 - 15:57

Скрипт получается режет то что внутри или не может прочитать, сам quote открывает в новом окне и не режет и цитирует нормально
D7.41
ckeditor 4.56

Александр 09.01.2016 - 17:37

Никит, прошу прощения, может я не правильно понял как работает или как он должен работать. При выделении текста и затем нажатии "цитата" вставляет как нужно или почти как нужно, при выделении самой цитаты что она встала в сообщение встает просто текст без html-кодов. При нажатии на "цитата" без выделения соответственно ничего не должно вставать?
Если не должно, то можно как то сделать что бы js копировал всё сообщение целиком?

Александр 30.01.2016 - 13:33

UPD:
//get fill message сделал, содержимое вставляет если нет выделения. Проблема в том что не вставляет двойную цитату(ы).
ниже то как вставляет сейчас. а должны быть внутри еще три quote
[quоte=admin]admin пишет:admin пишет:ма 2 проверка фо р    [/quоte]

как настроить подскажи пожалуйста

Nikita Petrov 03.02.2016 - 16:52

Александр, спасибо тебе за обозначение проблемы!
Действительно, с новым CKEditor не совсем корректно работало + не вставляло html из поста, а только текст (из-за этого и проблема с множественным цитированием).
Оказывается множественное цитирование я пофиксил давным-давно, но забыл залить сюда обновленную версию модуля. Так же я подправил селекторы и теперь заработала кнопка цитирования у первого сообщения темы (т.е. у самой ноды).
Обновленная версия модуля прикреплена к этой статье снова, вот ссыль http://nikita-petrov.com/sites/default/files/articles/nastroyka-udobnogo...
Пользуйтесь на здоровье, и берите пример с Александра - пишите полезные комментарии.

Александр 03.02.2016 - 17:35

копирую сообщение из соседней темы:
скрипт ищет div .field-item внутри .field-name-comment-body и .field-name-body
не знаю почему но у меня нет его, я убрал его и все у меня заработало.
до этого я вообще поставил искать просто .field и так тоже работало :) но были проблемы с множественными цитатами. сейчас все ОК! спасибо

Страницы

Добавить комментарий