Topic Passwords (пароль на тему) phpbb 3.0.xДовольно интересная доработка к форуму от Pthelovod. позволяет выставить пароль на отдельную тему. из минусов можно отметить то, что после установки пароля не изменить его, не восстановить (в случае утраты) невозможно.
информация под паролем всегда доступна администратору.
прав доступа, как таковых, в административном разделе нет. только в
Форумы имеется выбор разрешения "возможны в данном форуме
темы с паролем" или нет.
по коду, вроде бы, возможно открыть доступ и гостям (если вы им дадите код доступа).
мой небольшой вклад в этот мод заключается только в переводе файла login_topic.html под стиль subsilver2 и небольшой правке инструкции для subsilver2.
сама по себе тема интересна. может кому и пригодится. оригинальная тема и обсуждения находится
здесь.
попозже я установлю модификацию на этот сайт, чтобы можно было "вживую" увидеть работу мода. установил. тема здесь:
демо, пароль для входа:
ghbf1456nhgv4785сканы (чисто информативно):
Вложение:
Комментарий к файлу: выбор пароля при создании темы
posting_prosilver.png [ 10.5 КБ | Просмотров: 3993 ]
posting_prosilver.png
Вложение:
Комментарий к файлу: настройки в админке
adm.png [ 11.4 КБ | Просмотров: 3993 ]
adm.png
Итак, вступление закончено, поехали...
Скачать модификацию из архива сайта:
Скачать из файлового архива сайтараспаковать и содержимое папки root загрузить в корень сайта (где файл config.php).
Теперь необходимо выполнить несколько SQL-запросов на создание таблиц в базе данных:
Код: Выделить всё
CREATE TABLE `phpbb_topics_access` (
`topic_id` mediumint(8) unsigned NOT NULL default '0',
`user_id` mediumint(8) unsigned NOT NULL default '0',
`session_id` char(32) binary NOT NULL default '',
PRIMARY KEY (`topic_id`,`user_id`,`session_id`)
);
Код: Выделить всё
ALTER TABLE phpbb_forums ADD forum_allow_topic_password TINYINT(1) NOT NULL default '0';
Код: Выделить всё
ALTER TABLE phpbb_topics ADD topic_password varchar(40) binary NOT NULL default '';
Код: Выделить всё
ALTER TABLE `phpbb_topics` CHANGE `topic_password` `topic_password` VARCHAR( 40 ) CHARACTER SET utf8 COLLATE utf8_bin NULL
у кого возникли трудности с проведением sql-запроса, то вы можете скачать файл установщик
Вложение:
Комментарий к файлу: файл-установщик sql
db_update.rar [1.44 КБ]
Скачиваний: 35
распаковать, файл
db_update.php загрузить в корень сайта (где файл config.php) и запустить его через браузер по адресу
после отработки запроса удалить файл с сервера.
Теперь необходимо сделать правки файлов:
общие (для любого стиля)
Открыть
posting.phpНайти
Код: Выделить всё
if ($config['allow_topic_notify'] && $user->data['is_registered'])
Вставить перед найденным
Код: Выделить всё
$post_data['topic_password'] = utf8_normalize_nfc(request_var('topic_password', '', true));
Найти
Код: Выделить всё
'post_approved' => (isset($post_data['post_approved'])) ? $post_data['post_approved'] : false,
Вставить после найденного
Код: Выделить всё
'topic_password' => $post_data['topic_password'],
Найти
Код: Выделить всё
{
case 'post':
$page_title = $user->lang['POST_TOPIC'];
Вставить после найденного
Код: Выделить всё
$s_allow_password = $post_data['forum_allow_topic_password'];
Найти
Вставить после найденного
Код: Выделить всё
if ($post_id == $post_data['topic_first_post_id'])
{
$edit_password = $post_data['topic_password'];
}
Найти
Вставить после нйденного
Код: Выделить всё
'S_ALLOW_PASSWORD' => (!empty($s_allow_password)) ? $s_allow_password : '',
'EDIT_TOPIC_PASSWORD' => (!empty($edit_password)) ? $edit_password : '',
Открыть
search.phpНайти
Код: Выделить всё
$sql = 'SELECT t.topic_last_post_time, t.topic_id
FROM ' . TOPICS_TABLE . " t
WHERE t.topic_moved_id = 0
Вставить после найденного
Найти
Код: Выделить всё
if ($show_results == 'posts')
{
$sql = "SELECT p.post_id
FROM $sort_join" . POSTS_TABLE . ' p, ' . TOPICS_TABLE . " t
WHERE t.topic_replies = 0
Вставить после найденного
Найти
Код: Выделить всё
$sql = 'SELECT DISTINCT ' . $sort_by_sql[$sort_key] . ", p.topic_id
FROM $sort_join" . POSTS_TABLE . ' p, ' . TOPICS_TABLE . " t
WHERE t.topic_replies = 0
AND t.topic_moved_id = 0
Вставить после найденного
Найти
Код: Выделить всё
$sql = 'SELECT p.post_id
FROM ' . POSTS_TABLE . ' p
WHERE p.post_time > ' . $user->data['user_lastvisit'] ."
Вставить после найденного
Найти
Код: Выделить всё
$sql = 'SELECT t.topic_id
FROM ' . TOPICS_TABLE . ' t
WHERE t.topic_last_post_time > ' . $user->data['user_lastvisit'] . '
Вставить после найденного
Найти
Код: Выделить всё
$sql = 'SELECT p.*, f.forum_id, f.forum_name, t.*, u.username, u.username_clean, u.user_sig, u.user_sig_bbcode_uid, u.user_colour
FROM ' . POSTS_TABLE . ' p
LEFT JOIN ' . TOPICS_TABLE . ' t ON (p.topic_id = t.topic_id)
LEFT JOIN ' . FORUMS_TABLE . ' f ON (p.forum_id = f.forum_id)
LEFT JOIN ' . USERS_TABLE . " u ON (p.poster_id = u.user_id)
WHERE $sql_where";
Часть строки
Заменить на
Код: Выделить всё
WHERE $sql_where AND t.topic_password = ''";
Открыть
viewforum.phpНайти
Код: Выделить всё
gen_forum_auth_level('forum', $forum_id, $forum_data['forum_status']);
Заменить найденное на
Код: Выделить всё
gen_forum_auth_level('forum', $forum_id, $forum_data['forum_status'], $forum_data['forum_allow_topic_password']);
Открыть
viewtopic.phpНайти
Вставить после найденного
Код: Выделить всё
if (($topic_data['topic_password'])&&((!$auth->acl_get('a_'))&&(!$auth->acl_get('m_', $forum_id))&&(!$auth->acl_get('m_'))))
{
login_topic_box($topic_data);
}
Найти
Код: Выделить всё
gen_forum_auth_level('topic', $forum_id, $topic_data['forum_status']);
Заменить найденное на
Код: Выделить всё
gen_forum_auth_level('topic', $forum_id, $topic_data['forum_status'], $topic_data['forum_allow_topic_password']);
Открыть
adm/style/acp_forums.htmlНайти
Код: Выделить всё
<dt><label for="forum_style">{L_FORUM_STYLE}:</label></dt>
Вставить перед найденным
Код: Выделить всё
<dt><label for="forum_allow_topic_password">{L_FORUM_ALLOW_TOPIC_PASSWORD}:</label><br /><span>{L_FORUM_ALLOW_TOPIC_PASSWORD_EXPLAIN}</span></dt>
<dd><label><input type="radio" class="radio" name="forum_allow_topic_password" value="1"<!-- IF S_FORUM_ALLOW_TOPIC_PASSWORD --> id="forum_allow_topic_password" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
<label><input type="radio" class="radio" name="forum_allow_topic_password" value="0"<!-- IF not S_FORUM_ALLOW_TOPIC_PASSWORD --> id="forum_allow_topic_password" checked="checked"<!-- ENDIF --> /> {L_NO}</label>
</dl>
<dl>
Открыть
includes/constants.phpНайти
Вставить после найденного
Код: Выделить всё
define('TOPICS_ACCESS_TABLE', $table_prefix . 'topics_access');
Открыть
includes/functions.phpНайти
Вставить перед найденным
Код: Выделить всё
/**
* Generate topic login box
*/
function login_topic_box($topic_data)
{
global $db, $config, $user, $template, $phpEx;
$password = request_var('password', '', true);
$sql = 'SELECT topic_id
FROM ' . TOPICS_ACCESS_TABLE . '
WHERE topic_id = ' . $topic_data['topic_id'] . '
AND user_id = ' . $user->data['user_id'] . "
AND session_id = '" . $db->sql_escape($user->session_id) . "'";
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
if ($row)
{
return true;
}
if ($password)
{
// Remove expired authorised sessions
$sql = 'SELECT session_id
FROM ' . SESSIONS_TABLE;
$result = $db->sql_query($sql);
if ($row = $db->sql_fetchrow($result))
{
$sql_in = array();
do
{
$sql_in[] = (string) $row['session_id'];
}
while ($row = $db->sql_fetchrow($result));
// Remove expired sessions
$sql = 'DELETE FROM ' . TOPICS_ACCESS_TABLE . '
WHERE ' . $db->sql_in_set('session_id', $sql_in, true);
$db->sql_query($sql);
}
$db->sql_freeresult($result);
if ($password == $topic_data['topic_password'])
{
$sql_ary = array(
'topic_id' => (int) $topic_data['topic_id'],
'user_id' => (int) $user->data['user_id'],
'session_id' => (string) $user->session_id,
);
$db->sql_query('INSERT INTO ' . TOPICS_ACCESS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
return true;
}
$template->assign_var('LOGIN_ERROR', $user->lang['WRONG_PASSWORD']);
}
page_header($user->lang['LOGIN']);
$template->assign_vars(array(
'S_LOGIN_ACTION' => build_url(array('f', 't')),
'S_HIDDEN_FIELDS' => build_hidden_fields(array('t' => $topic_data['topic_id'])))
);
$template->set_filenames(array(
'body' => 'login_topic.html')
);
page_footer();
}
Открыть
includes/functions_display.phpНайти
Код: Выделить всё
function gen_forum_auth_level($mode, $forum_id, $forum_status)
Заменить найденное на
Код: Выделить всё
function gen_forum_auth_level($mode, $forum_id, $forum_status, $forum_password = FALSE)
Найти
Код: Выделить всё
$rules[] = ($auth->acl_get('f_attach', $forum_id) && $auth->acl_get('u_attach') && !$locked) ? $user->lang['RULES_ATTACH_CAN'] : $user->lang['RULES_ATTACH_CANNOT'];
}
Вставить после найденного
Код: Выделить всё
$rules[] = $forum_password ? $user->lang['RULES_PASSWORD_CAN'] : $user->lang['RULES_PASSWORD_CANNOT'];
Открыть
includes/functions_posting.phpНайти
Код: Выделить всё
'topic_attachment' => (!empty($data['attachment_data'])) ? 1 : 0,
Вставить после найденного
Код: Выделить всё
'topic_password' => $data['topic_password'],
Найти
Код: Выделить всё
'topic_attachment' => (!empty($data['attachment_data'])) ? 1 : (isset($data['topic_attachment']) ? $data['topic_attachment'] : 0),
Вставить после найденного
Код: Выделить всё
'topic_password' => (!empty($data['topic_password'])) ? $data['topic_password'] : '',
Открыть
includes/acp/acp_forums.phpНайти
Код: Выделить всё
'forum_password_confirm'=> request_var('forum_password_confirm', '', true),
Вставить после найденного
Код: Выделить всё
'forum_allow_topic_password' => request_var('forum_allow_topic_password', false),
Найти
Вставить после найденного
Найти
Код: Выделить всё
'S_ENABLE_POST_REVIEW' => ($forum_data['forum_flags'] & FORUM_FLAG_POST_REVIEW) ? true : false,
вставить после найденного
Код: Выделить всё
'FORUM_ALLOW_TOPIC_PASSWORD' => $forum_data['forum_allow_topic_password'],
'S_FORUM_ALLOW_TOPIC_PASSWORD' => ($forum_data['forum_allow_topic_password']) ? true : false,
языковые правки. RUS
Открыть
language/ru/common.phpНайти
Вставить перед найденным
Код: Выделить всё
'LOGIN_TOPIC' => 'Для просмотра данной темы и ее сообщений вы должны ввести пароль.',
'RULES_PASSWORD_CAN' => 'Вы <strong>можете</strong> защищать свои темы паролем',
'RULES_PASSWORD_CANNOT' => 'Вы <strong>не можете</strong> защищать свои темы паролем',
'LOGIN_TOPIC_PASSWORD' => 'Пароль на тему.',
'LOGIN_TOPIC_PASSWORD_INF' => '<b style="color: #FA8072;">!!При создании темы с паролем не забудьте сообщить пароль тем, кому он будет необходим для прочтения данной темы.<br> Ввод пароля при первом входе сохраняется до конца сессии.<br>Внимание:
пароль невозможно изменить или восстановить при утрате!</b>',
Открыть
language/ru/acp/forums.phpНайти
Вставить перед найденным
Код: Выделить всё
'FORUM_ALLOW_TOPIC_PASSWORD' => 'Пароли на свои темы',
'FORUM_ALLOW_TOPIC_PASSWORD_EXPLAIN' => 'Разрешить в этом форуме ставить пароли на свои темы при их создании',
языковые правки. EN
Открыть
language/en/common.phpНайти
Вставить перед найденным
Код: Выделить всё
'LOGIN_TOPIC' => 'To view the topic and its message, you must enter the password.',
'RULES_PASSWORD_CAN' => 'You <strong>can</strong> to protect your themes password',
'RULES_PASSWORD_CANNOT' => 'You <strong>cannot</strong> to protect your themes password',
'LOGIN_TOPIC_PASSWORD' => 'The password on the topic.',
'LOGIN_TOPIC_PASSWORD_INF' => '<b style="color: #FA8072;">When you create a topic with the password, don't forget to give the password to those who will need to read the topic.<br> Enter password at first login is saved until the end of the session.<br>Note:
the password cannot change or recover the loss!</b>',
Открыть
language/en/acp/forums.phpНайти
Вставить перед найденным
Код: Выделить всё
'FORUM_ALLOW_TOPIC_PASSWORD' => 'Passwords on their threads',
'FORUM_ALLOW_TOPIC_PASSWORD_EXPLAIN' => 'To allow this forum to put passwords on their threads when they are created',
для стилей на основе prosilver
Открыть
styles/prosilver/template/posting_editor.htmlНайти
Код: Выделить всё
<!-- IF CAPTCHA_TEMPLATE and S_CONFIRM_CODE -->
Вставить перед найденным
Код: Выделить всё
<!-- IF S_ALLOW_PASSWORD or EDIT_TOPIC_PASSWORD -->
<dl>
<dt><label for="topic_password">{L_LOGIN_TOPIC_PASSWORD}:</label></dt>
<dd><input type="password" name="topic_password" id="topic_password" size="45" maxlength="40" tabindex="3" value="{EDIT_TOPIC_PASSWORD}" class="inputbox autowidth" /></dd>
{L_LOGIN_TOPIC_PASSWORD_INF}
</dl>
<!-- ENDIF -->
для стилей на основе subsilver2
Открыть
styles/subsilver2/template/posting_body.htmlНайти
Код: Выделить всё
<td class="row2" width="78%"><input class="post" style="width:450px" type="text" name="subject" size="45" maxlength="<!-- IF S_NEW_MESSAGE -->60<!-- ELSE -->64<!-- ENDIF -->" tabindex="2" value="{SUBJECT}" /></td>
</tr>
Вставить после найденного
Код: Выделить всё
<!-- IF S_ALLOW_PASSWORD or EDIT_TOPIC_PASSWORD -->
<tr>
<td class="row1" width="22%"><b class="genmed">{L_LOGIN_TOPIC_PASSWORD}:</b></td>
<td class="row2" width="78%"><input class="post" style="width:450px" type="password" name="topic_password" size="45" maxlength="40" tabindex="3" value="{EDIT_TOPIC_PASSWORD}" /></td>
</tr>
<tr>
<td class="row1" colspan="2" width="100%">{L_LOGIN_TOPIC_PASSWORD_INF}</td>
</tr>
<!-- ENDIF -->
Вот и всё. правок, конечно, хватает, но ничего страшного в этом нет.
Теперь надо очистить кэш и разрешить в административном разделе в выбранных форумах возможность пользователям ставить пароли на свои темы.
Слышал, что такое можно применять для защиты "личных страничек", которые хочется показывать только выбранным пользователям. ну или ещё как...
Надеюсь кому-нибудь пригодится.