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

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


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

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

 

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

 

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

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

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

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

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

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

 

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

 

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

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

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

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

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

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

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

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

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

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