Здравствуйте.
Я озадачился объединением нескольких (неизвестно даже точное их количество)
форумов между собой. Объединение планируется не полное, а лишь частичное, по принципу "открытые под-
форумы с одинаковыми названиями объединяются, а с отличающимися названиями - остаются на каждом
форуме свои".
Планирую сделать это методом экспорта/импорта сообщений через RSS-ленту.
В связи с чем возникли вопросы:
1. Я вообще, не велосипед случайно изобретаю?
2. Существует ли какой-то единый формат RSS-ленты, предназначенный именно для этой цели (экспорт/импорт сообщений с корректным распределением сообщений по топикам, а топиков - по под-
форумам)?
3. Охотно приму на условиях Open Source предложения сотрудничества от специалистов по движку IPB, поскольку как минимум 2 из нужных мне
форумов работают именно на нём, а я с ним ещё не работал. Со своей стороны, могу обеспечить решение задачи для
phpBB в случае, если Total Syndication Suite для
phpBB 3.0.4 нас чем-то не устроит.
Мои наработки по данному вопросу находятся по адресу: www.wgent.com/velikoe_obqhedinenie_forumov.htm
Спустя 4 часа, 42 минуты, 37 секунд (22.09.2009 - 22:08) FatCat написал(а):
Цитата (Max Brown @ 22.09.2009 - 18:25) |
Планирую сделать это методом экспорта/импорта сообщений через RSS-ленту. |
ИМХО, проще на отдающий
форум написать простенький пхп-скрпит, например через модули, который по запросу будет собирать напрямую нужную информацию из БД и отдавать по запросу принимающему
форуму.
Нечто похожее у меня сделано для импорта информации из
форума на сайт в другом домене (и на другом хосте), могу поделиться кодами.
Образец:
Топик в форуме =>
Страница сайта Спустя 1 день, 3 часа, 54 минуты, 59 секунд (24.09.2009 - 02:03) Guest написал(а):
За предложение поделиться кодом - спасибо, но скорее всего, я позаимствую из него только те части, которые работают с пока что малоизвестной мне базой данных IPB, т.к. я уже твёрдо нацелился на RSS-обмен.
Должен сразу предупредить, что позаимствованные фрагменты кода неминуемо будут опубликованы, т.к. мои разработки будут делаться строго по принципам Open Source.
Файлы можно прислать на адрес:
"Max Brown" <mx@obninsk.ru>
(адрес нужно вводить в поле "Кому:" целиком с именем, иначе завернёт спам-фильтр).
Спустя 10 часов, 23 минуты, 5 секунд (24.09.2009 - 12:26) FatCat написал(а):
Цитата (Guest @ 24.09.2009 - 03:03) |
позаимствованные фрагменты кода неминуемо будут опубликованы |
Не проблема.
Приведу здесь полный код, благо он довольно простой. Писал несколько лет назад, когда еще только начинал осваивать пхп, поэтому прошу сильно не смеяться. В своих модулях конечно же код можете модернизировать как угодно.
В корень
форума кладется файл; с других серверов обращение к этому файлу с нужными параметрами вызова.
PHP |
if(is_dir( "../../pharmfo.rum" ))define('RPATH','/home/pharmfo.rum/www/'); //локалка else define('RPATH','/home/path_to_forum/pharm-forum.ru/'); //сервер
require RPATH.'conf_global.php';
Error_Reporting(1+2+4+8); // Connect to the Database if (!($link = mysql_connect($INFO['sql_host'], $INFO['sql_user'], $INFO['sql_pass']))) { echo( sprintf( "Нет соединения С базой данных!", mysql_error() ) ); exit(); };
function check_perms($fid) { $fid = intval($fid); $query_site = "select read_perms, password from ibf_forums where id='".$fid."'"; if (!($result_site = mysql_db_query("pharmforum", $query_site))) { echo mysql_errno(), mysql_error(); return 0; } $perms = mysql_fetch_array($result_site); $perms['read_perms'] = ",".$perms['read_perms'].","; $perms['password'] .= "pwd"; $perms['read_perms'] = str_replace(",*,",",2,",$perms['read_perms']); if($perms['password']=='pwd' and stristr($perms['read_perms'],",2,"))return TRUE; else return FALSE; }
function parse_forum_to_site($txt) { $txt = preg_replace( "#(<!--)(.+?)(,)(.+?)(\/\/-->)#is", "<!--\\2 //-->", $txt ); $txt = preg_replace( "#(<li class=ssi2><a class=ssi2 href='http:\/\/www.pharm-forum.ru\/index.php\?showtopic=)(.+?)('>)(.+?)(</a>)#is", "<li class=ssi2>[a href='index.php?pid=']\\4", $txt ); $txt = preg_replace( "#(\[a href='index.php\?pid='\])(.+?)(</li>\n<!-- )(.+?)( \/\/-->)#is", "<a class=ssi2 href='index.php?pid=\\4'>\\2</a>", $txt ); $txt = preg_replace( "#<!--(.+?)//-->\n\n#is", "", $txt ); return $txt; }
if(isSet($pid) and isSet($fid))die("Невозможно одновременно отобразить список сообщений и одно сообщение!");
if(isSet($pid)) { $pid = intval($pid); $query_site = "SELECT p.pid, p.post, t.forum_id, t.id_apteka FROM ibf_topics t, ibf_posts p WHERE p.pid =".$pid." AND t.tid = p.topic_id";
if (!($result_site = mysql_db_query("pharmforum", $query_site))) { echo mysql_errno(), mysql_error(); return 0; } $post = mysql_fetch_array($result_site); if(check_perms($post['forum_id']) or $post['id_apteka'] != '0'){ require RPATH."sources/lib/post_parser.php"; $parser = new post_parser(); $return_post = $parser->post_db_parse($post['post'], 1 ); echo $return_post; } else if($post['id_apteka'] == '0') {echo "Сообщению в закрытом разделе не задан ключ экспорта.";} else {echo "Ошибка вызова ssi2.php.";} }
if(isSet($fid)) { $fid = intval($fid); if(isSet($keyword))$keyword = addslashes($keyword);else $keyword = ""; $order = ""; if(isSet($sort)){ if(stristr("forum_id|tid|title|description|id_apteka", $sort))$qprefix = "t."; elseif(stristr("pid|post|topic_id", $sort))$qprefix = "p."; else $qprefix = ""; if($qprefix != "") { $order = $qprefix.addslashes($sort); if(isSet($scale)){if($scale == 'desc'){$order .= " desc";}} $order .= ", "; } }
if(isSet($skin))$skiner = "act=ST&f=".intval($skin)."&t="; else $skiner = "showtopic=";
$result_text = "\n\n"; $result_text .= "<ul class=ssi2>"; $query_site = "SELECT t.forum_id, t.tid, t.title, t.description, t.id_apteka, p.pid, p.post, p.topic_id FROM ibf_topics t, ibf_posts p WHERE t.tid = p.topic_id AND t.forum_id = ".$fid." order by ".$order." p.pid";
if (!($result_messs = mysql_db_query("pharmforum", $query_site))){echo mysql_errno(), mysql_error(); return 0 ;} $topic_counter = "0"; $post_counted = ""; $perms_checker = TRUE; while($row_messs = mysql_fetch_array($result_messs)) { $row_messs['id_apteka'] = ",".$row_messs['id_apteka'].",,"; if( $topic_counter == "0" )$perms_checker = check_perms($row_messs['forum_id']); if($perms_checker) { if($row_messs['tid'] != $topic_counter) { if($post_counted != "")$result_text .= "\n<!-- ".$post_counted." //-->\n"; $post_counted = $row_messs['pid'].","; if(stristr($row_messs['id_apteka'], ",".$keyword.",")) {if(!stristr($result_text,$row_messs['tid']."'>")) { $result_text .= "\n<li class=ssi2><a class=ssi2 href='http://www.pharm-forum.ru/index.php?".$skiner.$row_messs['tid']."'>"; $result_text .= $row_messs['title']; $result_text .= '</a>'; if($row_messs['description']!=''){$result_text .= '<br><span class=ssi2>'.$row_messs['description'].'</span>';}; $result_text .= '</li>'; } } } else { $post_counted .= $row_messs['pid'].","; } } $topic_counter = $row_messs['tid']; } $result_text .= "\n<!-- ".$post_counted." //-->\n"; $result_text .= "</ul>";
if(!isSet($reply))$reply = "false"; elseif($reply != "true")$reply = "false"; // Вывод ссылок на форум только по ключу true
if($reply == "false") { $result_text = parse_forum_to_site($result_text); }
echo($result_text); }
if(isSet($count)) { $count = intval($count); $query_site = "SELECT attach_hits FROM ibf_posts WHERE pid =".$count;
if (!($result_site = mysql_db_query("pharmforum", $query_site))) { echo mysql_errno(), mysql_error(); return 0; } $post = mysql_fetch_array($result_site); echo($post['attach_hits']); } |