Постинг в SMF со страниц сайта с помощью SSI.php
Дата: 15 декабря, 2009 год
Кто не знает, сообщаю – у SMF-форума есть некое подобие API, все функции которого находятся в файле SSI.php. Этот API урезанный – он может только вытаскивать информацию из БД форума в различных формах, типа, последние посты, последние топики, дни рождения, список юзеров, профайл юзера, список тем и пр. А также – логин и логаут юзера. Для первичной, поверхностной интеграции форума с сайтом этих функций вполне достаточно, однако, полноценно использовать все возможности форума через корневой сайт невозможно – нет соответствующих функций.
Собственно, с этим я и столкнулся, когда делал очередной хороший сайт, где надо было иметь возможность комментировать некие юниты информации на сайте таким образом, чтобы эти комментарии были одновременно и постами на форуме.
Таким образом, получалась некая смесь комментирования и обсуждения юнитов, что и было конечной целью интеграции форума с сайтом.
Задачи, связанные с выводом последних постов-комментирев, имён комментирующих и прочей информации были решены с помощью SSI.php, а вот для постинга комментариев я написал функцию, которую добавил к другим в вышеназванном файле.
function ssi_postMessage ($topic, $subj, $name, $email, $body) {
global $context, $settings, $scripturl, $txt, $db_prefix, $ID_MEMBER, $user_info, $modSettings, $func;
$return = true;
if ($context['user']['is_guest']) {
$ID_MEMBER = 0;
} else {
//увеличиваем счетчик сообщений юзера
$user_info['posts']++;
$request0 = db_query ("update {$db_prefix}members set posts=".$user_info['posts']." where ID_MEMBER=".$ID_MEMBER, __FILE__, __LINE__);
}
//добавляем сообщение
$q = "insert into {$db_prefix}messages values(NULL, ".$topic.", 2, ".time().", ".$ID_MEMBER.", 0, 'Re: ".$subj."', '".$name."', '".$email."', '".$user_info['ip']."', 1, 0, '', '".$body."', '')";
$request = db_query ($q, __FILE__, __LINE__);
$last_id = mysql_insert_id();
if (mysql_affected_rows() != 1) $return = false;
//добавляем в сообщение ID, сгенерированный auto_increment`ом
$q2 = "update {$db_prefix}messages set ID_MSG_MODIFIED=".$last_id." where ID_MSG=".$last_id;
$request2 = db_query ($q2, __FILE__, __LINE__);
if (mysql_affected_rows() != 1) $return = false;
//определяем кол-во сообщений в теме
$q3 = "select numReplies from {$db_prefix}topics where ID_TOPIC=".$topic;
$request3 = db_query ($q3, __FILE__, __LINE__);
if (mysql_num_rows($request3) != 1) $return = false;
$row = mysql_fetch_assoc($request3);
$row['numReplies']++;
//апдейтим тему, добавляя ID последнего сообщения и пр. статистическую инфу
$q4 = "update {$db_prefix}topics set ID_LAST_MSG='".$last_id."', ID_MEMBER_UPDATED='".$ID_MEMBER."', numReplies='".$row['numReplies']."' where ID_TOPIC=".$topic;
$request4 = db_query ($q4, __FILE__, __LINE__);
if (mysql_affected_rows() != 1) $return = false;
if ($return) return true;
else return false;
}
Функция не подразумевает проверку входных данных, их нужно фильтровать перед её применением.
Функция универсальна – подходит и для гостя, и для залогиненного пользователя. В случае с пользователем нужно вписать его имя и мыло в параметры, вытащив из $user_info.
Еще по теме: SSI, интеграция
Категория: Хаки и доработки
[...] сделаем, чего уж там. Тем более, что у меня уже есть готовый скрипт постинга в SMF, осталось только написать небольшой скрипт [...]