В общем я тут решил заняться этим вопросом. Ведь функция достаточно полезная, однако, почему-то, все попытки ее нормально реализовать были неудачными. Итак, для начала подумаем что же нам нужно от этой функции. А нужно всем ровно три вещи:
1. Невозможность редактирования комментов юзером.
2. Возможность вставки коммента в любое место сообщения.
3. Невозможность использования комментов юзером.
Так, по поряку:
Quote:
1. Невозможность редактирования комментов юзером.
|
У меня возникает вопрос ЗАЧЕМ??? Ради этой сомнительной возможности надо городить лишние таблицы в БД с хранением информации о правах редактирования, и писать соответсвующие скрипты. Хотя, если разобраться, то коммент предназначен для информации пользователю. Поэтому, чтобы пользователь с ним не сделал, он его прочтет, что и необходимо. Поэтому, пусть делает с комментом что хочет. Далее:
Quote:
2. Возможность вставки коммента в любое место сообщения.
|
Вот это требование наталкивает нас на единственно выгодное решение этой задачи - ВВ-коды. Но кроме того, что тут возникает сложность исполнения третьего требования, появляется еще одно:
Quote:
4. Отсутсвие этих ВВ-кодов в списке тегов форума
|
Решение:
Итак, для реализации требования №4 нам придется добавлять ВВ-код не через Админку, а встроить его непосредственно в парсер ВВ-кодов. Посему открываем файл class_bbcode.php и редактируем. Сначала вставим код парсера:
Найти:
PHP Code:
}
// standard URL hyperlink
return "<a href=\"$rightlink\" target=\"_blank\">$text</a>";
}
Ниже добавить:
PHP Code:
/**
* Handles a [mod] tag.
* @return string
*/
function handle_bbcode_mod ($comment, $modnick)
{
return "<style type='text/css'>
<!--
.modcomment {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 12px;
color: #FFFFFF;
}
-->
</style>
<table width='90%' border='0' cellpadding='0' cellspacing='0' align='center'>
<tr>
<td><table width='100%' border='0' cellspacing='0' cellpadding='0'>
<tr>
<td width='88' height='20'><img src='images/misc/modcomment_left.gif' width='88' height='20' /></td>
<td height='20' background='images/misc/modcomment_texture.gif'> </td>
<td width='200' height='20'><div align='center'><span class='modcomment'><strong>Комментарий модератора</strong></span></div></td>
<td height='20' background='images/misc/modcomment_texture.gif'> </td>
<td width='88' height='20'><img src='images/misc/modcomment_right.gif' width='88' height='20' /></td>
</tr>
</table>
<table width='100%' border='0' cellpadding='0' cellspacing='3' bordercolor='#FFFFFF' bgcolor='#FFFFFF'>
<tr>
<td width='30' height='29' bgcolor='#FFFFFF' valign='top'><img src='images/misc/mod.jpg' width='30' height='29' /></td>
<td bgcolor='#FFFFFF'><font color=green><b>$modnick:</b></font><br /><font color=black>$comment</font>
</td>
</tr>
</table>
</td>
</tr>
</table>";
}
/**
* Handles a [admin] tag.
* @return string
*/
function handle_bbcode_admin ($comment, $adminnick)
{
return "<style type='text/css'>
<!--
.admincomment {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 12px;
color: red;
}
-->
</style>
<table width='90%' border='0' cellpadding='0' cellspacing='0' align='center'>
<tr>
<td><table width='100%' border='0' cellspacing='0' cellpadding='0'>
<tr>
<td width='88' height='20'><img src='images/misc/modcomment_left.gif' width='88' height='20' /></td>
<td height='20' background='images/misc/modcomment_texture.gif'> </td>
<td width='220' height='20'><div align='center'><span class='admincomment'><strong>Комментарий администратора</strong></span></div></td>
<td height='20' background='images/misc/modcomment_texture.gif'> </td>
<td width='88' height='20'><img src='images/misc/modcomment_right.gif' width='88' height='20' /></td>
</tr>
</table>
<table width='100%' border='0' cellpadding='0' cellspacing='3' bordercolor='#FFFFFF' bgcolor='#FFFFFF'>
<tr>
<td width='30' height='29' bgcolor='#FFFFFF' valign='top'><img src='images/misc/admin.jpg' width='30' height='30' /></td>
<td bgcolor='#FFFFFF'><font color=red><b>$adminnick:</b></font><br /><font color=black>$comment</font>
</td>
</tr>
</table>
</td>
</tr>
</table>";
}
Замечание! Впринципе не важно куда этот код вставлять, но для того чтобы указать рамки "дозволенного" я выбрал для примера именно этот участок кода после парсера url адресов.
Замечание! Содержимое директивы return
не для копипаста, а для примера. Тут вы можете написать все, что хотите видеть.
Далее необходимо подключить эти теги к парсингу. Посему в этом же файле ищем:
PHP Code:
// [POST=XXX]
$tag_list['option']['post'] = array(
'html' => '<a href="' . $prepend_path . 'showthread.php?' . $vbulletin->session->vars['sessionurl'] . 'p=%2$s#post%2$s" title="' . htmlspecialchars_uni($vbulletin->options['bbtitle']) . ' - ' . $vbphrase['post'] . ' %2$s">%1$s</a>',
'option_regex' => '#^\d+$#',
'strip_empty' => true
);
}
Ниже добавить:
PHP Code:
// [MOD=XXX]
$tag_list['option']['mod'] = array(
'callback' => 'handle_bbcode_mod',
'strip_empty' => true
);
// [ADMIN=XXX]
$tag_list['option']['admin'] = array(
'callback' => 'handle_bbcode_admin',
'strip_empty' => true
);
Итак, два из трех условий выполнены. Осталось ограничить использование этих кодов. Для этого воспользуемся механизмом проверки текста поста. Если юзер не является членом группы модов или админов, теги комментирования автоматически вырезаются из его сообщения. Открываем файл newreply.php, ищем код:
PHP Code:
if ($vbulletin->GPC['ajax'])
{
// posting via ajax so we need to handle those entries
$newpost['message'] = convert_urlencoded_unicode($newpost['message']);
}
Ниже добавляем:
PHP Code:
// ###################### Start comments filter #######################
if ($vbulletin->userinfo['usergroupid'] == 6 OR $vbulletin->userinfo['usergroupid'] == 12 OR $vbulletin->userinfo['usergroupid'] == 10)
{
//Allow comments if admin
$newpost['message'] = $newpost['message'];
}
else if ($vbulletin->userinfo['usergroupid'] == 7)
{
//Allow comments if mod
$fil = array("[/admin]", "[admin]");
$newpost['message'] = preg_replace ($fil, '', $newpost['message']);
}
else
{
//Cut comments if illegal
$fil = array("[/mod]", "[/admin]", "[mod]", "[admin]");
$newpost['message'] = preg_replace ($fil, '', $newpost['message']);
}
Далее предусмотрим, чтобы пользователь не смог воспользоваться комментами через редактирование сообщения. Поэтому, редактируя файл editpost.php, найдем:
PHP Code:
}
else
{
$edit['message'] =& $vbulletin->GPC['message'];
}
Ниже добавим:
PHP Code:
// ###################### Start comments filter #######################
if ($vbulletin->userinfo['usergroupid'] == 6 OR $vbulletin->userinfo['usergroupid'] == 12 OR $vbulletin->userinfo['usergroupid'] == 10)
{
//Allow comments if admin
$edit['message'] = $edit['message'];
}
else if ($vbulletin->userinfo['usergroupid'] == 7)
{
//Allow comments if mod
$fil = array("[/admin]", "[admin]");
$edit['message'] = preg_replace ($fil, '', $edit['message']);
}
else
{
//Cut comments if illegal
$fil = array("[/mod]", "[/admin]", "[mod]", "[admin]");
$edit['message'] = preg_replace ($fil, '', $edit['message']);
}
Добавление кнопки в текстовый редактор:
Итак, по причине востребованности этой функции, расскажу как это сделать. Тут не так все просто как кажется. Для начала правим клиент-скрипт vbulletin_textedit.js. Ищем:
PHP Code:
/**
* Insert Link
*/
this.createlink = function(e, url)
{
return this.apply_format('createlink', is_ie, (typeof url == 'undefined' ? true : url));
};
Ниже вставляем:
PHP Code:
// Insert Mod & Admin Comments
this.mod = function(e, selection)
{
var selection = this.get_selection();
return this.insert_text("[mod=" + modname + "]" + selection + "[/mod]\n", 0);
};
this.admin = function(e, selection)
{
var selection = this.get_selection();
return this.insert_text("[admin=" + modname + "]" + selection + "[/admin]\n", 0);
};
// end Insert Mod & Admin Comments
В этом же файле ищем:
PHP Code:
**
* Apply formatting
*/
this.apply_format = function(cmd, dialog, argument)
{
// undo & redo array pops
switch (cmd)
{
case 'bold':
case 'italic':
case 'underline':
{
this.wrap_tags(cmd.substr(0, 1), false);
return;
}
case 'justifyleft':
case 'justifycenter':
case 'justifyright':
{
this.wrap_tags(cmd.substr(7), false);
return;
}
Ниже добавим:
PHP Code:
case 'mod':
case 'admin':
{
this.wrap_tags(cmd, modname);
return;
}
Теперь правка шаблона editor_toolbar_on. В нужное вам место (в зависимости от желаемого рассположения кнопки) вставляем следующее:
1. Сепаратор (если нужен):
HTML Code:
<td><img src="$stylevar[imgdir_editor]/separator.gif" width="6" height="20" alt="" /></td>
2. Сама кнопка (модератор):
HTML Code:
<td><div class="imagebutton" id="{$editorid}_cmd_mod"><img src="$stylevar[imgdir_editor]/mod.gif" width="4" height="20" alt="Комментарий модератора" /></div></td>
3. Сама кнопка (админ):
HTML Code:
<td><div class="imagebutton" id="{$editorid}_cmd_admin"><img src="$stylevar[imgdir_editor]/mod.gif" width="4" height="20" alt="Комментарий администратора" /></div></td>
В этом же шаблоне можно прописать условия для того, чтобы эти кнопки не видели кто попало.
Для вставки кнопок в текстовый редактор на форме быстрого ответа редактируйте вышеописанным способом шаблон showthread_quickreply. Для добавления кнопок в окно быстрого редактирования - шаблон postbit_quickedit.
И последнее. Открываем шаблон editor_clientscript.
Найти:
HTML Code:
var smiliewindow_x = 240;
var smiliewindow_y = 280;
Ниже добавить:
HTML Code:
var modname = '$bbuserinfo[username]';
Функция блокировки поста после комментария:
Для того, чтобы пользователь не смог отредактировать пост после внесения комментария откройте файл class_postbit.php. В нем надо найти:
PHP Code:
// can edit or delete this post, so show the link
$this->post['editlink'] = 'editpost.php?' . $this->registry->session->vars['sessionurl'] . 'do=editpost&p=' . $this->post['postid'];
if ($this->registry->options['quickedit'])
{
$show['ajax_js'] = true;
}
}
Аккуратно заменить на:
PHP Code:
//################## Start parse comments ###################
$fil = array("[/mod]", "[/admin]", "[mod]", "[admin]");
$messagebit = preg_replace($fil, '', $this->post['message']);
//Check if message contains any commenting
if ($messagebit != $this->post['message'])
{
//If admin or mod, show edit button
if (can_moderate($this->thread['forumid'], 'caneditposts'))
{
$this->post['editlink'] = 'editpost.php?' . $this->registry->session->vars['sessionurl'] . 'do=editpost&p=' . $this->post['postid'];
if ($this->registry->options['quickedit'])
{
$show['ajax_js'] = true;
}
}
else
{
$this->post['editlink'] = '';
}
}
else
{
$this->post['editlink'] = 'editpost.php?' . $this->registry->session->vars['sessionurl'] . 'do=editpost&p=' . $this->post['postid'];
if ($this->registry->options['quickedit'])
{
$show['ajax_js'] = true;
}
else
{
$this->post['editlink'] = '';
}
}
}
Внимание! Данный BB-код не работает с редакторами WYSIWYG. Вам необходимо отключить использование визуального редактора в Правке сообщений, и в "полном" редакторе. В редакторе быстрого ответа этот режим можно не отключать.
Внимание! Ввиду того, что ситуация с группами на форумах разная, могут возникнуть проблеммы с установкой. Если что - пишите в этой теме, буду помогать всем.
Вот и все! Не забываем жать Спасибу...