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