Постинг в 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.

Еще по теме: ,

Категория: Хаки и доработки

Comments (2)

 

  1. […] сделаем, чего уж там. Тем более, что у меня уже есть готовый скрипт постинга в SMF, осталось только написать небольшой скрипт […]

  2. viliyms:

    Приветствую! Спасибо за реализацию сайта по данной тематике!

SEO Powered by Platinum SEO from Techblissonline