info navigation

phpbb-belk.ru

темы, связанные с форумом phpbb 3.0.x



Новая тема  [ 1 сообщение ]  Просмотры: 3993

Автор Сообщение
Не в сети
(Андрей)  
Администратор
Аватара пользователя

Стаж: 9 лет 3 месяца 27 дней
Сообщения: 1235
Откуда: здешние мы


Стиль: subsilver2


Репутация: 11


Russia

Тиц и PR

перейти на сайт пользователя
Найти темы пользователя


Topic Passwords (пароль на тему) phpbb 3.0.x

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

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

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

сканы (чисто информативно):

Вложение:
Комментарий к файлу: выбор пароля при создании темы
posting_prosilver.png
posting_prosilver.png [ 10.5 КБ | Просмотров: 3993 ] posting_prosilver.png



Вложение:
Комментарий к файлу: настройки в админке
adm.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) и запустить его через браузер по адресу

Код: Выделить всё

http://ваш сайт/db_update.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'];

Найти

Код: Выделить всё

$page_title = $user->lang['EDIT_POST'];


Вставить после найденного

Код: Выделить всё

      if ($post_id == $post_data['topic_first_post_id'])
      {
         $edit_password = $post_data['topic_password'];
      }

Найти

Код: Выделить всё

'S_BBCODE_QUOTE'      => $quote_status,


Вставить после нйденного

Код: Выделить всё

   '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


Вставить после найденного

Код: Выделить всё

AND t.topic_password = ''

Найти

Код: Выделить всё

            if ($show_results == 'posts')
            {
               $sql = "SELECT p.post_id
                  FROM $sort_join" . POSTS_TABLE . ' p, ' . TOPICS_TABLE . " t
                  WHERE t.topic_replies = 0


Вставить после найденного

Код: Выделить всё

AND t.topic_password = ''

Найти

Код: Выделить всё

               $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


Вставить после найденного

Код: Выделить всё

AND t.topic_password = ''

Найти

Код: Выделить всё

               $sql = 'SELECT p.post_id
                  FROM ' . POSTS_TABLE . ' p
                  WHERE p.post_time > ' . $user->data['user_lastvisit'] ."


Вставить после найденного

Код: Выделить всё

AND t.topic_password = ''

Найти

Код: Выделить всё

               $sql = 'SELECT t.topic_id
                  FROM ' . TOPICS_TABLE . ' t
                  WHERE t.topic_last_post_time > ' . $user->data['user_lastvisit'] . '


Вставить после найденного

Код: Выделить всё

AND t.topic_password = ""

Найти

Код: Выделить всё

         $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";


Заменить на

Код: Выделить всё

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

Найти

Код: Выделить всё

   login_forum_box($topic_data);
}


Вставить после найденного

Код: Выделить всё

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

Найти

Код: Выделить всё

// Additional tables


Вставить после найденного

Код: Выделить всё

define('TOPICS_ACCESS_TABLE',         $table_prefix . 'topics_access');



Открыть includes/functions.php

Найти

Код: Выделить всё

// Little helpers


Вставить перед найденным

Код: Выделить всё

/**
* 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),

Найти

Код: Выделить всё

'forum_password_confirm'=> '',


Вставить после найденного

Код: Выделить всё

                     '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 -->



Вот и всё. правок, конечно, хватает, но ничего страшного в этом нет.
Теперь надо очистить кэш и разрешить в административном разделе в выбранных форумах возможность пользователям ставить пароли на свои темы.

Слышал, что такое можно применять для защиты "личных страничек", которые хочется показывать только выбранным пользователям. ну или ещё как... :-D

Надеюсь кому-нибудь пригодится.




трёхголовый белк семейства рептилоидов:
"три головы - хорошо, на как же трудно придти к согласию..."
Topic Passwords,phpbb 3.0.x,forum,пароль на тему
Показать сообщения за:  Поле сортировки  
Ответить на тему  [ 1 сообщение ] 

Кто сейчас на сайте:

Всего посетителей: 1, из них зарегистрированных: 0, скрытых: 0 и гостей: 1 (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (122) здесь было 19 дек 2023, 12:10

Сейчас этот раздел просматривают: нет зарегистрированных пользователей и гости: 1



Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения
Вы не можете защищать свои темы паролем

Найти:
Перейти:  





Текущее время: 19 янв 2025, 08:44

Создано на основе phpBB® Forum Software © phpBB Group
Яндекс.Метрика

Полная версия Мобильный вид