Интеграция форума SMF 2.0 и CMS Livestreet 0.4.2

В статье рассмотрен вариант интеграции форума SMF 2.0 и CMS Livestreet 0.4.2, при котором авторизация/аутентификация пользователя ведётся через пользовательскую БД Livestreet.
Предыстория задачи такова. Был сайт на движке Livestreet, всё в нём хорошо, но однажды пользователям захотелось форум. Просто надо и всё, вынь да полож. Просто усатановить и настроить новый движок — не вариант, поскольку каждому уже зарегистрированному пользователю придётся регистрироваться по-новой на форуме, а каждому новому пользователю – регистрироваться в обоих CMS. Регистрации/входа через соц. сети по историческим причинам не было. И потому встала передо мной задача:
  1. Развернуть форум SMF (Simple Machines Forum) 2.0 чтоб он был доступен по адресу www.mysite.com/forum
  2. При входе пользователя на форум, проверка того, авторизован он или нет проверять через БД Livestreet.
  3. Регистрируются пользователи только в CMS Livestreet
  4. Проверка логина и пароля только через CMS Livestreet


В движке SMF реализован мехнизм хуков с помощью которого можно изменять поведение системы. Исходя из вышеописанных задач, нам необходимо переопределить поведение системы посредством следующих хуков:
  • integrate_verify_user
  • integrate_verify_password
  • integrate_validate_login
  • integrate_login
  • integrate_logout
  • integrate_reset_pass
  • integrate_register
  • integrate_change_member_data


Для того, чтобы SMF узнал что мы хотим переопределить его поведение, в корневой папке движка форума необходимо создать скрипт-установщик, назовём его add_livestreetAuth_hook.php, со следующим содержимым:

<?php
	// If SSI.php is in the same place as this file, and SMF isn't defined, this is being run standalone.
	if (file_exists(dirname(__FILE__) . '/SSI.php') && !defined('SMF'))
		require_once(dirname(__FILE__) . '/SSI.php');
	// Hmm... no SSI.php and no SMF?
	elseif (!defined('SMF'))
		die('<b>Error:</b> Cannot install - please verify you put this in the same place as SMF\'s index.php.');
	 
	add_integration_function('integrate_pre_include', "$sourcedir/Subs-LivestreetAuth.php");
	add_integration_function('integrate_verify_user', 'livestreet_verify_user_add_hook',TRUE);
	add_integration_function('integrate_validate_login ', 'livestreet_validate_login_add_hook',TRUE);
	add_integration_function('integrate_login', 'livestreet_integrate_login_add_hook',TRUE);
	add_integration_function('integrate_logout', 'livestreet_integrate_logout_add_hook',TRUE);
	add_integration_function('integrate_reset_pass', 'livestreet_integrate_reset_pass_add_hook',TRUE);
	add_integration_function('integrate_register', 'livestreet_integrate_register_add_hook',TRUE);
	add_integration_function('integrate_change_member_data', 'livestreet_integrate_change_member_data_add_hook',TRUE);
	add_integration_function('integrate_menu_buttons', 'livestreet_integrate_menu_buttons_hook',TRUE);
	 
	?>

$sourcedir – глобальная переменная, содержащая путь к директории Sources движка SMF
add_integration_function – функция реализованная в движке, которая привязывает Вашу функцию (2-й параметр) к хуку (1-й параметр). Третий параметр функции TRUE или FALSE – определяет, сохранять привязку в БД и кэше или нет.

Первый вызов функции add_integration_function(‘integrate_pre_include’,»$sourcedir/Subs-LivestreetAuth.php») – сообщает движку путь к файлу, в котором реализованы нижеописанные функции.
Далее в директории Sources движка создаём файл Subs-LivestreetAuth.php, в котором реализуем все функции, которые связаны с хуками.
После этого, из браузера запускаем на выполнение скрипт www.mysite.com/forum/add_livestreetAuth_hook.php. Если вы увидели белый экран без всяких ошибок, значит привязка произошла успешно. Более того, для успокоения нервов можно проверить содержимое таблицы smf_settings базы данных. Ближе к концу таблицы должны быть записи с Вашими хуками и функциями, которые к ним привязаны.

Пара моментов при реализации функций в файле Sources/Subs-LivestreetAuth.php.

  1. Первая строчка файла должна содержать следующий код для предотвращения прямого обращения к файлу из браузера:
    if (!defined(‘SMF’)) die(‘Hacking attempt…’);
  2. Для работы с БД внутри каждой функции объявляете глобальную переменную: global $smcFunc;
    Эта переменная содержит массив функций для работы с БД. Приведу маленький пример работы этой прослойкой:
    $res=$smcFunc['db_query']('',"SELECT id_member FROM {db_prefix}members WHERE member_name=\"user1\"",array());
    	if($smcFunc['db_num_rows']($res)>0)
    	{
    		$smf_user_row=$smcFunc['db_fetch_assoc']($res);
    		return $smf_user_row['id_member'];
    	} 
    	

    {db_prefix} – Префикс таблиц БД указанный при установке движка.

    Подробнее в документации.
  3. Необходимо обратить внимание, что передача параметров в функции осуществляется по ссылке. Например:
    function livestreet_validate_login_add_hook(&$username,&$hashedPass=NULL,&$cookieLifetime)
    	{	
    		return 'ok';// retry|ok
    	}


    Внимательно читайте в мануале что должна возвращать функция привязанная к тому или иному хуку.


Основная работа по интеграции ложится на функцию livestreet_verify_user_add_hook() которую мы привязали к хуку integrate_verify_user и реализовали в файле Sources/Subs-LivestreetAuth.php.

  1. Первое что она должна делать, так это проверять $_COOKIE['key'], который устанавливает CMS Livestreet. Если его нет, либо он некорректен, то возвращать 0(ноль), тем самым указывая что зашедший пользователь является Гостем.
  2. Далее функция по $_COOKIE['key'] выбирает user_id из таблицы {$prefix}session БД Livestreet, после чего по полученному user_id из таблицы {$prefix}user выбирает всю инфу о пользователе.
  3. Проверяет в таблице {db_prefix}members БД SMF есть ли пользователь с таким логином, если нет, то заносит
  4. Возвращает id_member таблицы {db_prefix}members БД SMF


Отдельно хотелось бы упомянуть про хук livestreet_integrate_menu_buttons_hook. С его помощью можно переопределить пункты главного меню движка. Например, в моём случае необходимо было:
  • Добавить ссылку на главную страницу сайта
  • чтобы по нажатию на ссылку «Вход» пользователь отправлялся на страницу ввода логина и пароля CMS Livestreet
  • При нажатии на ссылку «Регистрация» пользователь отправляется на страницу регистрации CMS Livestreet.

Собственно, реализация функции:
function livestreet_integrate_menu_buttons_hook(&$buttons)
	{
		//print_r($buttons);exit;//Чтобы глянуть что внутри
		if($config=getLivestreetConfig())
		{
			$new_buttons=array(
				'login'=>array(
					'href'=>'http://mysite.com/login/',
				),
				'register'=>array(
					'href'=>'http://mysite.com/registration/',
				),
			);
			foreach($new_buttons as $key=>$val)
			{
				if(isset($buttons[$key]))
				{
					//unset($buttons[$val]);
					$buttons[$key]['href']=$val['href'];
				}
			}
			//Добавление ссылки на главную всего сайта
			$buttons=array(
				'mainpage'=>array(
					'title'=>'На главную',
					'href'=>'http://mysite.com/',
					'show'=>1,
					'sub_buttons'=>array()
				)
			)+$buttons;
		}
	 
	}


В функцию по ссылке передаётся многомерный массив, содержащий все пункты главного меню.

Удаление хуков.
Для того, чтобы удалить привязку функций к хукам необходимо создать файл в корневой директории движка форума (допустим remove_livestreet_auth_hook.php), в котором поочерёдно вызвать функцию remove_integration_function. Пример содержимого файла:

<?php
	// If SSI.php is in the same place as this file, and SMF isn't defined, this is being run standalone.
	if (file_exists(dirname(__FILE__) . '/SSI.php') && !defined('SMF'))
		require_once(dirname(__FILE__) . '/SSI.php');
	// Hmm... no SSI.php and no SMF?
	elseif (!defined('SMF'))
		die('<b>Error:</b> Cannot install - please verify you put this in the same place as SMF\'s index.php.');
	 
	remove_integration_function('integrate_pre_include', "$sourcedir/Subs-YourAction.php");
	remove_integration_function('integrate_verify_user ', 'livestreet_verify_user_add_hook');
	remove_integration_function('integrate_validate_login ', 'livestreet_validate_login_add_hook');
	remove_integration_function('integrate_login', 'livestreet_integrate_login_add_hook');
	remove_integration_function('integrate_logout', 'livestreet_integrate_logout_add_hook');
	remove_integration_function('integrate_reset_pass', 'livestreet_integrate_reset_pass_add_hook');
	remove_integration_function('integrate_register', 'livestreet_integrate_register_add_hook');
	remove_integration_function('integrate_change_member_data', 'livestreet_integrate_change_member_data_add_hook');


Далее, как и в случае с установкой, необходимо из браузера запустить скрипт на выполнение.
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 6

    0
    Не совсем понятен смысл объединения форума и движка коллективных блогов.
      0
      Пользователи на сайте устроили опрос по результатам которого я просто вынужден был в дополнение развернуть форум. На форуме завели ветки с «вечными» темами, типа болталки и опыта покупки стройматериалов подешевле.
        0
        Какие-то у вас очень самостоятельные пользователи… Они домен еще ни разу не пытались отобрать? ))
          0
          Да вот, боюсь, что этим всё и закончится )))
            0
            Повезло, не так уж просто привлечь активных пользователей на форум. Кому интересно — может почитать
      0
      А кто-то прикручивал LS и IPB?

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое