Xeption Опубликовано 3 Октября 2006 Жалоба Поделиться Опубликовано 3 Октября 2006 Иногда требуется отобразить одну тему в разных разделах, пересекающихся по тематике. Например, у меня есть тема "Изменения на форуме" и разделы "Новости, события" и "О форуме". Хочется, чтобы тема отображалась и там и там, а две разных заводить не хочется. Хочу сразу предупредить: в нынешнем виде мод является скорее набором инструкций, нежели полноценным модом, но я всё же решил поделиться, ибо времени на разработку полностью автоматизированной системы, скорее всего, не будет, а инструкции - лучше, чем ничего =) К тому же инструкции довольно просты. Единственное требование: вы должны уметь манипулировать данными в вашей БД (если не умеете - ставьте 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! To do list:1. Сделать инсталлер что ли =)2. Интегрировать с форумом так, чтобы можно было выбирать темы галочками сбоку, а потом снизу из списка среди всяких "Закрыть", "Соединить", "Удалить" и пр. выбрать "Создать зеркало" - и, введя id раздела, получить готовое зеркало. Дабы с БД не заморачиваться, а то несолидно как-то =) Комментарии, дополнения, исправления и предложения приветствуются. Равно как и реализация пунктов To do list'а =]] Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
replicant Опубликовано 3 Октября 2006 Жалоба Поделиться Опубликовано 3 Октября 2006 Мод интересный, но с трудом укладывается в голове практическая его необходимость! Разве, что если это будут два различных форума имеющих разные права доступа! Т.е. люди группы А не видят ветку форума людей группы Б, а сообщить что-то надо им в обеих форумах! Более ничего придумать не смог для себя лично. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Xeption Опубликовано 3 Октября 2006 Автор Жалоба Поделиться Опубликовано 3 Октября 2006 Думаю, что у многих есть темы, тематика которых затрагивает не один раздел. Это, конечно, не та вещь, без которой совсем не прожить, но то, что она удобна - это безусловно. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 3 Октября 2006 Жалоба Поделиться Опубликовано 3 Октября 2006 Новая функция - зеркалирование Думаю, что у многих есть темы, тематика которых затрагивает не один раздел. Это, конечно, не та вещь, без которой совсем не прожить, но то, что она удобна - это безусловно.Да, вещь очень нужная. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Xeption Опубликовано 4 Октября 2006 Автор Жалоба Поделиться Опубликовано 4 Октября 2006 Хех... супер А я когда искал - с ног сбился, ничего не нашёл =\ Song, может, опубликуешь свой мод - он намного удобнее моего получился Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 4 Октября 2006 Жалоба Поделиться Опубликовано 4 Октября 2006 Не, задолбаюсь инструкцию писать, он очень сложен.Это у тебя простенький алгоритм.Кстати, я не додумался добавить ещё одно поле рядом с другим, а сделал сложней, но универсальней, но по стоимости сложности разработки я бы выбрал твой вариант У тебя автоматом работает модерирование например, мне для этого пришлось делать отдельную синхронизацию.При ответе в тему у тебя значок новых также появляется автоматом, мне же запросы надо делать.Так что имхо твой лучше как мне кажется.Только вот удаление зеркал у тебя несколько нелогичное. У меня это отдельные темы, их удалишь и всё. У тебя если удалить, то удалится всё. Поэтому нужно проверку опять же делать. Подумаю я, может гораздо лучше и на твой способ переделать. Мод интересный, но с трудом укладывается в голове практическая его необходимость!...Более ничего придумать не смог для себя лично.Во всяческих базах знаний.Например, загляни в уязвимости 2.х: http://www.sysman.ru/index.php?showforum=109Темы, помеченные ">>" - это зеркала. В данном случае так помечаются уязвимости, которые имеют силу и для 1.х и для 2.хНе было бы зеркал, мне бы пришлось сделать ещё одну тему и потом иметь лишнюю работу по обновлению, если бы таковое имело место быть или делать малозаметные ссылки. ---- Единственное, что может поставить под удар всю твою разработку:Это форма запроса. По-моему MySQL не использует индекса при выборке с OR из разных полей, даже если по ним всем есть индекс.И будет перебирать всю таблицу!Это значит, что при большом количестве топиков (даже неск. тысяч), при большом количестве юзеров, операция просмотра списка топиков будет очень сильно напрягать базу. А это ведь самая частая операция в форуме! Запросы будут выстраиваться в очередь и юзеры будут друг друга ждать.Поэтому совет тебе мой проверить насколько это точно.И если это так, то это единственное НО поставит на нет весь твой замечательный способ Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Firewalll Опубликовано 8 Октября 2006 Жалоба Поделиться Опубликовано 8 Октября 2006 На 1.3 работать будет? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Xeption Опубликовано 11 Октября 2006 Автор Жалоба Поделиться Опубликовано 11 Октября 2006 Не тестил. Но принцип, думаю, понятен. Создаётся второе поле с идентификатором раздела (у меня forum_id_2) в таблице со списком тем (у меня ibf_topics) и в коде правится кусок, где форум проверяет принадлежность тем к разделам (у меня он в /sources/action_public/forums.php). Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Jax Опубликовано 11 Октября 2006 Жалоба Поделиться Опубликовано 11 Октября 2006 Смысл-то понятен. Только не прикольно это все время лазить и править сорсы. Надо скиновые фун-ии писать Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 11 Октября 2006 Жалоба Поделиться Опубликовано 11 Октября 2006 ха-хаа как ты в скиновых функцих часть движка поменяешь? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Xeption Опубликовано 12 Октября 2006 Автор Жалоба Поделиться Опубликовано 12 Октября 2006 Jax, если ты это имеешь ввиду:2. Интегрировать с форумом так, чтобы можно было выбирать темы галочками сбоку, а потом снизу из списка среди всяких "Закрыть", "Соединить", "Удалить" и пр. выбрать "Создать зеркало" - и, введя id раздела, получить готовое зеркало. Дабы с БД не заморачиваться, а то несолидно как-то =)то велкам, все будут только рады =) Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Jax Опубликовано 16 Октября 2006 Жалоба Поделиться Опубликовано 16 Октября 2006 (изменено) ха-хаа как ты в скиновых функцих часть движка поменяешь?Нет, я имею ввиду, чтобы упростить все это дело - юзабилити сделать. Чтобы постоянно сорсы не менять Да, Xeption, именно это я и имел ввиду Song, напиши какую-нить статеечку о взаимодействии сорсов с скиновыми функциями... а то что-то туго соображается в этом направлении Изменено 16 Октября 2006 пользователем Jax Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Hostem Опубликовано 16 Октября 2006 Жалоба Поделиться Опубликовано 16 Октября 2006 Для 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 под знаком вопроса так как надо исследовать использование индексов, по нему же сортировка ведется ... В такой структуре: - не будет лишнего расхода места (например, дублей заголовков)- если в одном месте изменить заголовок, то он и меняется в другом- если у нас "зеркала" создаются при создании темы, и в форум куда должно пойти "зеркало" на премодерации, то "зеркало" в том форуме пойдет на премодерацию- просмотры будут подсчитываться одинаково - при просмотре темы будет в навигации виден тот форум, откуда зашли Но менять всего здесь больше - в одном форуме можно тему зафиксировать, а в другом оставить обычной Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.