Перейти к контенту

Одна тема в двух форумах


Рекомендуемые сообщения

Иногда требуется отобразить одну тему в разных разделах, пересекающихся по тематике. Например, у меня есть тема "Изменения на форуме" и разделы "Новости, события" и "О форуме". Хочется, чтобы тема отображалась и там и там, а две разных заводить не хочется.

 

Хочу сразу предупредить: в нынешнем виде мод является скорее набором инструкций, нежели полноценным модом, но я всё же решил поделиться, ибо времени на разработку полностью автоматизированной системы, скорее всего, не будет, а инструкции - лучше, чем ничего =) К тому же инструкции довольно просты. Единственное требование: вы должны уметь манипулировать данными в вашей БД (если не умеете - ставьте phpMyAdmin и учитесь =))

 

Итак, приступим. Для начала нам нужно создать новое поле forum_id_2 в таблице ibf_topics (ваш префикс таблицы может быть другим, в примере - дефолтный ibf_. Узнать ваш префикс можно, посмотрев значение переменной $INFO['sql_tbl_prefix'] в файле conf_global.php в корне форума). Свйоства поля должны быть в точности такими же, как и свойства поля forum_id, находящегося в той же таблице, за исключением того, что опция Not Null не должна быть включена (ну и, соответственно, дефолтное значение будет Null (не путать с 0 =)))

 

Теперь нам нужно заставить форум смотреть на это поле при поиске тем, входящих в форум. Для этого в папке /sources/action_public находим файл forums.php и в нём ищем

$query = "t.forum_id=".$this->forum['id']." AND t.pinned IN (0,1) {$approved} and (t.last_post > $Prune OR t.pinned=1)";

и заменяем на

$query = "t.forum_id=".$this->forum['id']." OR t.forum_id_2=".$this->forum['id']." AND t.pinned IN (0,1) {$approved} and (t.last_post > $Prune OR t.pinned=1)";

 

В том же файле ищем

$query = "t.forum_id=".$this->forum['id']." AND t.pinned IN (0,1) {$approved}";

и заменяем на

$query = "t.forum_id=".$this->forum['id']." OR t.forum_id_2=".$this->forum['id']." AND t.pinned IN (0,1) {$approved}";

 

Всё. Установка закончена. Теперь - как этим пользоваться =)

 

Для того, чтобы тема стала отображаться в двух разделах, нужно, во-первых, знать 2 вещи: id клонируемой темы и id раздела, где будет располагаться её клон. ID темы - это цифра, которая стоит после showtopic= в ссылке на эту тему. ID раздела - это цифра, которая стоит после showforum= в ссылке на этот раздел.

Во-вторых, в таблице ibf_topics нужно найти эту тему. Сделать это очень просто: поле tid содержит ID темы, так что зная его, мы можем легко найти тему в БД. Найдя нужную нам тему, нужно в поле forum_id_2 этой темы вписать ID раздела, где будет располагаться зеркало.

Voila! :D

 

 

To do list:

1. Сделать инсталлер что ли =)

2. Интегрировать с форумом так, чтобы можно было выбирать темы галочками сбоку, а потом снизу из списка среди всяких "Закрыть", "Соединить", "Удалить" и пр. выбрать "Создать зеркало" - и, введя id раздела, получить готовое зеркало. Дабы с БД не заморачиваться, а то несолидно как-то =)

 

Комментарии, дополнения, исправления и предложения приветствуются. Равно как и реализация пунктов To do list'а =]]

Ссылка на комментарий
Поделиться на других сайтах

Мод интересный, но с трудом укладывается в голове практическая его необходимость!

 

Разве, что если это будут два различных форума имеющих разные права доступа!

 

Т.е. люди группы А не видят ветку форума людей группы Б, а сообщить что-то надо им в обеих форумах!

 

Более ничего придумать не смог для себя лично.

Ссылка на комментарий
Поделиться на других сайтах

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

Новая функция - зеркалирование

 

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

Да, вещь очень нужная.

Ссылка на комментарий
Поделиться на других сайтах

Хех... супер :D

А я когда искал - с ног сбился, ничего не нашёл =\

 

Song, может, опубликуешь свой мод - он намного удобнее моего получился ;)

Ссылка на комментарий
Поделиться на других сайтах

Не, задолбаюсь инструкцию писать, он очень сложен.

Это у тебя простенький алгоритм.

Кстати, я не додумался добавить ещё одно поле рядом с другим, а сделал сложней, но универсальней, но по стоимости сложности разработки я бы выбрал твой вариант :D

У тебя автоматом работает модерирование например, мне для этого пришлось делать отдельную синхронизацию.

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

Так что имхо твой лучше как мне кажется.

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

 

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

 

Мод интересный, но с трудом укладывается в голове практическая его необходимость!

...

Более ничего придумать не смог для себя лично.

Во всяческих базах знаний.

Например, загляни в уязвимости 2.х: http://www.sysman.ru/index.php?showforum=109

Темы, помеченные ">>" - это зеркала. В данном случае так помечаются уязвимости, которые имеют силу и для 1.х и для 2.х

Не было бы зеркал, мне бы пришлось сделать ещё одну тему и потом иметь лишнюю работу по обновлению, если бы таковое имело место быть или делать малозаметные ссылки.

 

----

 

Единственное, что может поставить под удар всю твою разработку:

Это форма запроса. По-моему MySQL не использует индекса при выборке с OR из разных полей, даже если по ним всем есть индекс.

И будет перебирать всю таблицу!

Это значит, что при большом количестве топиков (даже неск. тысяч), при большом количестве юзеров, операция просмотра списка топиков будет очень сильно напрягать базу. А это ведь самая частая операция в форуме! Запросы будут выстраиваться в очередь и юзеры будут друг друга ждать.

Поэтому совет тебе мой проверить насколько это точно.

И если это так, то это единственное НО поставит на нет весь твой замечательный способ ;)

Ссылка на комментарий
Поделиться на других сайтах

Не тестил. Но принцип, думаю, понятен. Создаётся второе поле с идентификатором раздела (у меня forum_id_2) в таблице со списком тем (у меня ibf_topics) и в коде правится кусок, где форум проверяет принадлежность тем к разделам (у меня он в /sources/action_public/forums.php).
Ссылка на комментарий
Поделиться на других сайтах

ха-ха

а как ты в скиновых функцих часть движка поменяешь?

Ссылка на комментарий
Поделиться на других сайтах

Jax, если ты это имеешь ввиду:

2. Интегрировать с форумом так, чтобы можно было выбирать темы галочками сбоку, а потом снизу из списка среди всяких "Закрыть", "Соединить", "Удалить" и пр. выбрать "Создать зеркало" - и, введя id раздела, получить готовое зеркало. Дабы с БД не заморачиваться, а то несолидно как-то =)

то велкам, все будут только рады =)

Ссылка на комментарий
Поделиться на других сайтах

ха-ха

а как ты в скиновых функцих часть движка поменяешь?

Нет, я имею ввиду, чтобы упростить все это дело - юзабилити сделать. Чтобы постоянно сорсы не менять :D

 

Да, Xeption, именно это я и имел ввиду ;)

 

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

Изменено пользователем Jax
Ссылка на комментарий
Поделиться на других сайтах

Для N зеркал коректный способ разделять таблицу топиков на две части. Первая - (tid (PRIMARY), ttid, forum_id, approved, pinned, last_post(?) ), вторая - (ttid (PRIMARY), title, description, starter_id, starter_name, start_date, last_poster_name, last_poster_id, last_post(?), views, posts, ...все, что осталось... ). Last_post под знаком вопроса так как надо исследовать использование индексов, по нему же сортировка ведется :D...

 

В такой структуре:

- не будет лишнего расхода места (например, дублей заголовков)

- если в одном месте изменить заголовок, то он и меняется в другом

- если у нас "зеркала" создаются при создании темы, и в форум куда должно пойти "зеркало" на премодерации, то "зеркало" в том форуме пойдет на премодерацию

- просмотры будут подсчитываться одинаково

- при просмотре темы будет в навигации виден тот форум, откуда зашли

 

Но менять всего здесь больше ;)

 

- в одном форуме можно тему зафиксировать, а в другом оставить обычной

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

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

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.