Постинг в 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, осталось только написать небольшой скрипт […]
Приветствую! Спасибо за реализацию сайта по данной тематике!