Эксперимент: улучшаем форум в Drupal 5.x. Часть первая. Базовые настройки.

Главные вкладки

Аватар пользователя Natalie Natalie 18 марта 2007 в 21:57

Продолжение. Начало здесь.

Форумы и таксономия. Создание форумов и контейнеров.

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

Заметьте, если вы сразу после включения модуля форума зайдете на страницу категорий, словаря форума там не будет. Он появится автоматически, как только вы зайдете в Administer-Content Management-Forums. Поскольку мы только что включили модуль, на этой странице нас ждет сообщение о том, что форумов и контейнеров на данный момент не существует и предложение создать новые. Что такое форумы, мы уже знаем, а контейнеры и есть главное отличие форумов от других словарей. При создании форумов вы можете выбрать для них контейнер, но к контейнерам, в отличие от терминов, нельзя прикрепить материалы (то есть темы форума). Контейнеры нужны для группировки связанных форумов. Без них вполне можно обойтись, но они улучшают организацию большого количества форумов.

Давайте создадим пару контейнеров и один-два форума для каждого (для контейнеров выбираем родителем root, а для форумов – контейнеры). Как и обычные термины, форумы и контейнеры могут организовываться по весу. Контейнеры и форумы можно поместить в другие контейнеры и форумы, но злоупотреблять этим не стоит: более плоская структура удобнее для пользователей. После создания контейнеров и форумов страница управления форумами будет выглядить примерно так:

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

Если вы теперь зайдете в управление категориями, там будет словарь Forums со всеми созданными нами контейнерами и форумами. Если вы попробуете отредактировать словарь форумов (edit vocabulary), вам тут же сообщат, что это специальный словарь для форумов и некоторые типичные опции словарей были убраны. И действительно, у вас не будет возможности сделать множественную иерархию терминов или убрать тему форума из прикрепленных в данному словарю типов контента. Здесь можно добавить Help text – инструкции, которые будут показываться пользователю при создании темы форума, а больше ничего трогать. Форумы и контейнеры нужно создавать на странице управления форумами, поскольку здесь вам даже не дадут выбрать между ними.

Настройки форумов

Теперь зайдите в настройки форума (settings) – вкладка на странице администрации форумов. Это управление вывода списка тем в форумах. Здесь можно установить количество сообщений для того, чтобы тема считалась «горячей» (то есть специально обозначалась), сколько тем выводить на страницу и порядок вывода тем. По умолчанию Date – newest first (чем новее, тем выше в списке тем), что нам и нужно. Пока что можно оставить дефолтные настройки.

Настройки комментариев для форума.

Мы настроили вывод списка тем, но как быть с самими сообщениями? Дело в том, что хотя в Drupal для тем форума существует специальный тип контента, ответы на тему форума будут теми же самим комментариями, что и для других типов контента. В материале даже появится точно такая же ссылка «добавить комментарий», которая несколько странно смотрится в теме форума. Идеологически комментарии для форума и комментарии для других типов контента ничем не отличаются, и управляются в одном и том же месте. В связи с этим комментарии в форуме не обладают многими нужными свойствами нод, что вызывает множество неудобств, которые мы попытаемся решить или обойти по ходу нашего маленького эксперимента.

Комментарии настраиваются в Administer-Content management, вкладка Settings. Вспоминаем нашу задачу: ленточный форум с показов всех сообщений в хронологическом порядке (от самых старых к самым новым).

Раздел viewing options (опции показа):

Режим показа (Default display mode) – выбираем Flat list – expanded.

Порядок показа (Default display order) – oldest first (самые старые вначале).

Комментариев на страницу (Default comments per page) – можно оставить стандартные 50 или поменять на какое-то другое число.
Comment control (Управление комментариями)

Возможно, вы захотите предоставить пользователям возможность выбирать показ сообщений, но... процитируем статью Lullabot:

“Включив управление комментариями, мы даем возможность пользователям сконфигурировать любую из выше перечисленных настроек – то есть фактически разрушить любую конфигурацию комментариев, проделанную администратором. Я считаю, что опции должны быть у администраторов, а не у юзеров. Какой-нибудь новичок переделает настройки так, что не сможет больше следовать за комментариями. Они буду звонить вам по телефону и спрашивать, что случилось с сайтом. Рекомендую проставить «не показывать» для управления комментариями.”
Добавим, что если вы дальше будете существенно менять дизайн вывода тем (например, через flatforum), то в предоставлении контроля за комментариями вообще нет смысла. Наш выбор – Do not display (Не показывать).

Posting settings (Настройки сообщения)

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

Comment subject field (Поле заголовка комментария) – по умолчанию Drupal берет первые несколько слов из сообщения для заголовка. Если мы включим эту опцию, то пользователи могут вводить свой собственный заголовок. Почему бы не предоставить им такую возможность?

Preview comment (Предварительный просмотр комментария) – снова процитируем Lullabot:
“обязательный предпросмотр комментариев перед отправкой предоставляет еще одну линию защиты от спама. А поскольку анонимные пользователи не смогут редактировать свои комментарии, как только они добавляются на сайте, это дает им последний шанс проверить свое сообщение перед отправкой. Тем не менее, с точки зрения юзабилити, идея добавить еще один экран к процессу отправления комментариев запутывает. Многие пользователи, добравшись до экрана предпросмотра, решат, что, поскольку они видят свой комментарий на экране, то он уже отправлен на сайт. Они могут уйти со страницы и так и не добавят комментарий на самом деле.
Моя рекомендация: если на вашем сайте пишут в основном зарегистрированные пользователи, не требуйте предпросмотра. Если на вашем сайте в основном обитают анонимные (не вошедшие) пользователи, то требуйте.”
Location of Comment Form (Расположение формы комментария):
это не принципиально. Можно показывать форму внизу, чтобы она выполняла роль формы быстрого ответа, которая существует на многих форумах.

Вот и все, не забываем сохранить настройки.

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

Первый этап настройки комментариев закончен. Ваш форум будет доступен по адресу вашсайт/forum. Можно зайти, полюбоваться на структуру и создать новую тему с несколькими сообщениями для проверки настроек в действии. Для удобства доступа включите пункт меню для форума в управлении меню (Administer-Site Building-Menus). Пункту меню можно добавить описание, поменять родительский пункт меню и вес (на более легкий, если вы хотите, чтобы он показывался вверху меню).

Сразу становятся заметны несколько проблем:
А) Если форма ответа появляется не странице, то у самого первого сообщения (которое и есть нода форума), пропадает ссылка на ответ и надо прокрутить страницу до самого низа, чтобы ответить. А что, если пользователь не знает об этом? Возможно, стоит делать форму ответа на отдельно странице до тех, пор пока мы не будем менять оформление.
Б) В выборе терминов включены контейнеры, к которым нельзя добавить тему, но при этом никак не обозначается, что это контейнер. Если тема создается со страницы форума, это не так важно, но если со страницы контейнера или через пункт меню «создать тему», то это не очень удобно.
Кто-нибудь знает, как с этим бороться помимо отключения пункта меню и удаления ссылки через оформление? По идее, контейнеры должны показываться в списке, но не выбираться.

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

Комментарии

Аватар пользователя garamond garamond 18 марта 2007 в 22:31

Замечательная работа!

вот только не совсем понял:
"Если вы захотите удалить контейнер, то с ним удалятся все вложенные в него форумы, поэтому предварительно им нужно поменять родителя."

но треды при этом сохранятся?

Аватар пользователя Natalie Natalie 18 марта 2007 в 22:35

Темы тоже удалятся. Добавила уточнение в статью.
- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
Переводы некоторых модулей.
All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.

Аватар пользователя Natalie Natalie 18 марта 2007 в 23:39

Ну вообще там появляется предупреждение Smile Хотя по-хорошему лучше бы был выбор между удалением всех подфорумов и тем и просто превращением их в "сироты" (orphans).
- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
Переводы некоторых модулей.
All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.

Аватар пользователя KCEOH KCEOH 19 марта 2007 в 1:21

ИМХО использовать стандартные определения - хорошо, но сразу надо бы приводить более понятные аналоги.

Контейнер - раздел
Форум - подраздел.

Хотя скриншот дает примерное представление.
---

И "Поле заголовка комментария" - редко на каких форумах используется, пользователи в рунете мало к такому привычны. Посему или выводить этот заголовок обычным текстом (а не большим и жирным, как было с комментами на drupal.htdogs.ru - долго не мог привыкнуть и отвлекало от чтения).
---

А вот что, если я хочу, чтобы на сайте были одни комментарии, а на форуме другие? На сайте - древовидные, а форум плоский? Или наоборот? Можно ли как-нибудь настройки разделить?

Аватар пользователя Natalie Natalie 19 марта 2007 в 3:04

>>Контейнер - раздел
Форум - подраздел.

Хотя скриншот дает примерное представление.

Так я вроде объяснила разницу.

>>
И "Поле заголовка комментария" - редко на каких форумах используется, пользователи в рунете мало к такому привычны. Посему или выводить этот заголовок обычным текстом (а не большим и жирным, как было с комментами на drupal.htdogs.ru - долго не мог привыкнуть и отвлекало от чтения).

На том же phpBB можно ввести заголовок сообщения, а по умолчанию выводится название темы, а не первые несколько слов сообщения, как здесь (хотя это наверное удобно при администрировании).

>>А вот что, если я хочу, чтобы на сайте были одни комментарии, а на форуме другие? На сайте - древовидные, а форум плоский? Или наоборот? Можно ли как-нибудь настройки разделить?

Нельзя, в том-то и дело.
- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
Переводы некоторых модулей.
All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.

Аватар пользователя selff selff 19 марта 2007 в 14:21

другие проблемы Комментов том что не показывают время создания, а только дату,
а еще в списке форума пишут о создании коммента - 31 минут 11 секунд назад,
вместо привычных даты-время.
ИМХО: это все надо исправлять.

Аватар пользователя dlynx dlynx 21 марта 2007 в 6:52

>>другие проблемы Комментов том что не показывают время создания, а только дату,
>>а еще в списке форума пишут о создании коммента - 31 минут 11 секунд назад,
>>вместо привычных даты-время.
>>ИМХО: это все надо исправлять.

А исправить очень даже не сложно в модуле форума либо в шаблоне темы, можно также написать собственной модуль-твикер

Итак временное решение правкой модуля форума:
В файлике forum.module находим строку (у меня 694):
<?php
return t('time ago
by !author', array('time' => format_interval(time() - $topic->timestamp), '!author' => theme('username', $topic)));
?>
меняем на:
<?php
return t('time
by !author', array('time' => format_date($topic->timestamp, 'custom', 'D, d M Y H:i:s', NULL), '!author' => theme('username', $topic)));
?>

P.s. Также по аналогии можно поступить с модулем comment.module исправив блок "Последнии комметарии" и с модулем tracker.module

Аватар пользователя Natalie Natalie 21 марта 2007 в 7:08

dlynx, ты не мог бы написать вариант для модуля или для темы? Мы все-таки решили обходиться по возможности без хаков ядра.
- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
Переводы некоторых модулей.
All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.

Аватар пользователя Shedko Shedko 22 марта 2007 в 0:47

а может в файле темы comment.tpl.php строку
<?php print $submitted ?>
просто заменить на
<?php print $date ?>
и будет выводится например: чт, 2006-11-09 04:15

Аватар пользователя dlynx dlynx 22 марта 2007 в 4:15

>>dlynx, ты не мог бы написать вариант для модуля или для темы? Мы все-таки решили обходиться по возможности без хаков ядра.

Natalie - быстро написать модуль не обещаю....

Вариант решение для темы:

Задача: - Изменить формат вывода метки времени в списке форумов и списке подфорумов

Рассуждения:
Смотрим модуль forum.module, узнаём что за это отвечает функция _forum_format($topic).
Напрямую, как я понял, такую функцию переопределить в шаблоне темы нельзя!
Можно переопределять те что что-то прорисовывают в теме и начинаются на theme_

Находит те что нас интересуют, это:
* theme_forum_list - общий список форумов
* theme_forum_topic_list - список подфорумов
Почему эти? Как раз в них используется функция _forum_format и эти списки определены в задаче...
Для чего? В них мы заменим вызов функции _forum_format на вызов своей

Решение:

В папке вашей тему в файлик template.php добавляем свою функцию:

<?php
function dlynx_forum_format($topic) {
if ($topic && $topic->timestamp) {
//return t('time ago
by !author', array('time' => format_interval(time() - $topic->timestamp), '!author' => theme('username', $topic)));
return t('time
by !author', array('time' => format_date($topic->timestamp, 'custom', 'D, d M Y H:i:s', NULL), '!author' => theme('username', $topic)));
}
else {
return t('n/a');
}
}
?>

И

<?php
function phptemplate_forum_list($forums, $parents, $tid) {
global $user;

if ($forums) {

$header = array(t('Forum'), t('Topics'), t('Posts'), t('Last post'));

foreach ($forums as $forum) {
if ($forum->container) {
$description = '

depth * 30) ."px;\">\n";
$description .= '
'. l($forum->name, "forum/$forum->tid") ."

\n";

if ($forum->description) {
$description .= '

'. filter_xss_admin($forum->description) ."

\n";
}
$description .= "

\n";

$rows[] = array(array('data' => $description, 'class' => 'container', 'colspan' => '4'));
}
else {
$new_topics = _forum_topics_unread($forum->tid, $user->uid);
$forum->old_topics = $forum->num_topics - $new_topics;
if (!$user->uid) {
$new_topics = 0;
}

$description = '

depth * 30) ."px;\">\n";
$description .= '
'. l($forum->name, "forum/$forum->tid") ."

\n";

if ($forum->description) {
$description .= '

'. filter_xss_admin($forum->description) ."

\n";
}
$description .= "

\n";

$rows[] = array(
array('data' => $description, 'class' => 'forum'),
array('data' => $forum->num_topics . ($new_topics ? '
'. l(format_plural($new_topics, '1 new', 'count new'), "forum/$forum->tid", NULL, NULL, 'new') : ''), 'class' => 'topics'),
array('data' => $forum->num_posts, 'class' => 'posts'),
array('data' => dlynx_forum_format($forum->last_post), 'class' => 'last-reply'));
}
}

return theme('table', $header, $rows);
}
return _phptemplate_callback('forum_list', array('forums' => $forums, 'parents' => $parents, 'tid' => $tid));
}

function phptemplate_forum_topic_list($tid, $topics, $sortby, $forum_per_page) {
global $forum_topic_list_header;

if ($topics) {

foreach ($topics as $topic) {
// folder is new if topic is new or there are new comments since last visit
if ($topic->tid != $tid) {
$rows[] = array(
array('data' => theme('forum_icon', $topic->new, $topic->num_comments, $topic->comment_mode, $topic->sticky), 'class' => 'icon'),
array('data' => check_plain($topic->title), 'class' => 'title'),
array('data' => l(t('This topic has been moved'), "forum/$topic->tid"), 'colspan' => '3')
);
}
else {
$rows[] = array(
array('data' => theme('forum_icon', $topic->new, $topic->num_comments, $topic->comment_mode, $topic->sticky), 'class' => 'icon'),
array('data' => l($topic->title, "node/$topic->nid"), 'class' => 'topic'),
array('data' => $topic->num_comments . ($topic->new_replies ? '
'. l(format_plural($topic->new_replies, '1 new', 'count new'), "node/$topic->nid", NULL, NULL, 'new') : ''), 'class' => 'replies'),
array('data' => dlynx_forum_format($topic), 'class' => 'created'),
array('data' => dlynx_forum_format(isset($topic->last_reply) ? $topic->last_reply : NULL), 'class' => 'last-reply')
);
}
}
}

$output = theme('table', $forum_topic_list_header, $rows);
$output .= theme('pager', NULL, $forum_per_page, 0);

return $output;

return _phptemplate_callback('forum_topic_list', array('tid' => $tid, 'topics' => $topics, 'sortby' => $sortby, 'forum_per_page' => $forum_per_page));
}
?>

В заключение: не претендую на 100% правильность решения, но данный способ работает отлично Smile
В функциях списков как писал выше поправил только вызов на нашу функцию... а в принципе можно переопределить вобще вид списка....
в дополнение можно создать файлы в теме соотвественно: forum_list.tpl.php и forum_topic_list.tpl.php с простым содержанием
<?php
print ('Hello world!');
?>

В прикрепленном файле рабочий шаблон от темы garland

Аватар пользователя cheslav cheslav 20 ноября 2009 в 5:03

Работает, но только под админом и анонимным пользователем. Захожу под зарег. пользователем на страницах форума forum_list и forum_topic_list выдает ошибку в common.inc on line 1582 Использую Drupal 6.14

Аватар пользователя Natalie Natalie 23 марта 2007 в 5:07

dlynx, а возможно ли заменять вчерашние и сегодняшние даты на соответственно вчера и сегодня? То есть вместь 22 марта в 7:30 должно быть сегодня в 7:30
- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
Переводы некоторых модулей.
All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.

Аватар пользователя dlynx dlynx 23 марта 2007 в 6:01

>> dlynx, а возможно ли заменять вчерашние и сегодняшние даты на соответственно вчера и сегодня? То есть вместь 22 марта в 7:30 должно быть сегодня в 7:30

Это возможно! В новой функции что мы добавили нужно добавить соответствующую проверку

Аватар пользователя dlynx dlynx 23 марта 2007 в 9:44

<?php
function dlynx_forum_format($topic) {
if ($topic && $topic->timestamp) {
//return t('time ago
by !author', array('time' => format_interval(time() - $topic->timestamp), '!author' => theme('username', $topic)));
if ((time() - $topic->timestamp) <= 172800)
if ((time() - $topic->timestamp) <= 86400)
return t('Today in time
by !author', array('time' => format_date($topic->timestamp, 'custom', 'H:i', NULL), '!author' => theme('username', $topic)));
else {
return t('Yesterday in time
by !author', array('time' => format_date($topic->timestamp, 'custom', 'H:i', NULL), '!author' => theme('username', $topic)));
}
else {
return t('time
by !author', array('time' => format_date($topic->timestamp, 'custom', 'D, d M Y', NULL), '!author' => theme('username', $topic)));
}
}
else {
return t('n/a');
}
}
?>

В прикрепленном файле рабочий шаблон
В работе см тут: http://forum.koryak.ru/forum

Аватар пользователя chup chup 2 мая 2007 в 23:23

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

Аватар пользователя cwer cwer 12 мая 2007 в 2:16

Сделал хаком. Если кому нужно:

В функции comment_render (файл modules/comment/comment.php) после строк

    $mode = _comment_get_display_setting('mode');
    $order = _comment_get_display_setting('sort');
    $comments_per_page = _comment_get_display_setting('comments_per_page');

(где-то около 946 строки) написал

    if ($node->type == 'forum') {$mode = 2;}

Если кто подскажет не хак - буду благодарен Smile

Аватар пользователя krimal krimal 29 ноября 2007 в 8:45

а может кто нибудь подскажет как написать ф-цию
чтоб она подменяла commen.tpl.php на comment-forum.tpl.php если публикуеться на форуме (или идет комментарием к node-forum.tpl.php)
Спасибо!

Аватар пользователя ivantr ivantr 21 августа 2008 в 10:47

спасибо за материал!
у меня вопрос.
создаю контейнер, и форум.
а словарь не появился
Drupal 5
где копать? подскажите плиз

Аватар пользователя Asankhip Asankhip 30 января 2010 в 1:23

а это что значит? (у меня 6-й друпал)

warning: Invalid argument supplied for foreach() in /home/o/sitename/public_html/modules/forum/forum.module on line 670.

И пишет, что нет прав на добавление темы. Хотя права есть.