Перейти к публикации

Рекомендованные сообщения

Теоретически этот способ годится для для интеграции любых движков с DLE. На практике проверил его с phpBB и HESK (с HESK только дизайн). Инструкции приведены для DLE 9.2 и phpBB 3.0.x, но сам способ не заточен именно под эти версии.

Single sign-on делается через через реализацию мтетодов login и logout, которые вызываются из модуля sitelogin.php DLE. SSO работает только при входе/выходе через DLE, поэтому элементы авторизации в дизайне стороннего движка надо прятать. Единую регистрацию ещё не сделал, но это вопрос ближайшего будущего.

Общая идея интеграции дизайна такая:

  1. Во-первых немного модифицируем сторонний движок. Для начала заставляем его буферировать вывод.
  2. Обычно в любом движке есть одна-две финальные точки, где получаем готовый HTML. Там через HTTP вызываем также немного модифицированный DLE со специальным аргументом (do=embed) и получаем "обёртку" с пометкой, куда надо будет вставить дизайн. Эту пометку для начала обрамляем
    <div id="embed"></div>
    , специальный id поможет нам избежать конфликта имен стилей DLE и встраиваемого дизайна.
  3. Теперь самая тонкая хирургическая операция - достаём из буфера дизайн, отделяем head и body, из head переносим в заголовок обёртки все link и script (сохраняем стили и скрипты), а также атрибуты body в body обертки. Это минимум. По-хорошему надо аккуратно вшить как можно больше из head в заголовок обёртки, а style, class и id из body перенести в <div id="embed">.
  4. Наконец в помеченное место вставляем внутренности body дизайна.
  5. А теперь самая жесть - надо перелопатить ВСЕ подключаемые стили стороннего движка, заменить html и body на #embed (дизайн внешнего движка теперь лежит в div'е, а не в body) и к названиям всех стилей добавить #embed, чтобы не было конфликта со стилями DLE. В стандартной prosilver phpBB мне пришлось вручную переделать несколько сотен названий :(. Сделать новый стиль сложнее, но правильнее, чтобы форум не выглядел пятном в общем дизайне сайта. К тому же все равно нужно вырезать лишние ссылки, типа login/logout и т.п. ;)
Теперь по шагам, что конкретно надо делать.
  1. Устанавливаем phpBB. Теоретически можно в любое место, даже вне структуры DLE. Я установил в корне DLE (в каталог phpBB). Также можно в любую базу, не обязательно в общую с DLE. Главное условие - один домен с DLE (иначе не будет работать SSO), но это уже вопрос настройки web-сервера.
  2. Создаём файл <корень DLE>/engine/modules/embed.php Не разобрался как тут добавлять файлы, поэтому используйте копипаст.
    
    <?php
    
    /*
    
    =====================================================
    
     Файл: embed.php
    
    -----------------------------------------------------
    
     Назначение: интеграция сторонних движков с DLE
    
    =====================================================
    
    */
    
    
    define("EMBED_TAG", "{EMBED}"); /* Пометка места для встраивания стороннего HTML. */
    
    define("DLE_DOMAIN", "http://domain.ru"); /* Домен DLE. */
    
    define("PHPBB_SSO", DLE_DOMAIN . "/phpBB/sso.php"); /* URL скрипта реализации SSO. */
    
    
    if( ! defined( 'DATALIFEENGINE' ) ) {
    
    	/* Подключение из стороннего (встраиваемого) движка. Формируем HTML. */
    
    	/* В переменной $embed может быть передан встраиваемый HTML. Если нет - берём его из буфера. */
    
    	if (!isset($embed))
    
    		$embed = @ob_get_contents();
    
    	@ob_end_clean();
    
    	/* Получаем "обёртку" DLE, куда встроим "внешний" HTML. */
    
    	$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n"));
    
    	$context = stream_context_create($opts);
    
    	$envel = file_get_contents(DLE_DOMAIN . "/index.php?do=embed", false, $context);
    
    	/* Извлекаем head встраиваемого HTML, ... */
    
    	preg_match("#<head>(.*)</head>#isU", $embed, $m);
    
    	$head = $m[1];
    
    	/* body... */
    
    	preg_match("#<body.*>(.*)</body>#isU", $embed, $m);
    
    	$body = $m[1];
    
    	/* ... и атрибуты body (обычно class, id, style, onload...). */
    
    	preg_match("#<body(.*)>#isU", $embed, $m);
    
    	$body_attr = $m[1];
    
    	/* Все <link> заголовка встраиваемого HTML... */
    
    	preg_match_all("#<link.*>#isU", $head, $m);
    
    	$links = implode("\r\n", $m[0]);
    
    	/* ... и <script>... */
    
    	preg_match_all("#<script.*</script>#isU", $head, $m);
    
    	$scripts = implode("\r\n", $m[0]);
    
    	/* ... переносим в head DLE-обёртки. */
    
    	$envel = preg_replace("#(</head>)#i", $links . "\r\n" . $scripts . "\r\n" . "$1", $envel);
    
    	/* Напоследок добиваем body DLE-обёртки атрибутами body встраиваемого HTML. */
    
    	$envel = preg_replace("#(<body)#i", "$1" . $body_attr, $envel);
    
    	/* Встраиваемый HTML встравляем в помеченное место в DLE-обёртке. */
    
    	echo str_replace(EMBED_TAG, "<div id=\"embed\">\r\n$body\r\n</div>", $envel);
    
    	return;
    
    }
    
    
    /* Вызов API SSO phpBB. */
    
    
    function SSO_phpBB($arg) {
    
    	function handleHeader($ch, $string) {
    
    		$s = "Set-Cookie: ";
    
    		if (substr($string, 0, strlen($s)) == $s)
    
    			header($string, false);
    
    		return strlen($string);
    
    	}
    
    	$ch = curl_init(PHPBB_SSO . "?$arg");
    
    	curl_setopt_array($ch, array(CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'], CURLOPT_COOKIE => $_SERVER['HTTP_COOKIE'], CURLOPT_HEADERFUNCTION => "handleHeader"));
    
    	curl_exec($ch);
    
    	curl_close($ch);
    
    }
    
    
    /* Методы API интеграции - login и logout. */
    
    
    function embed_login($name, $pass) {
    
    	SSO_phpBB("do=login&name=$name&pass=$pass");
    
    }
    
    
    function embed_logout() {
    
    	SSO_phpBB("do=logout");
    
    }
    
    
    /* Это срабатывает при каждом внешнем обращении к движку DLE. Просто помечаем место, куда встраивать сторонний HTML. */
    
    
    if ($_REQUEST["do"] == "embed") $tpl->result['content'] = EMBED_TAG;
    
    
    ?>
    
    
  3. В файле <корень DLE>/engine/engine.php перед
    default :
    добавляем
    case "embed" :
    
    	include_once ENGINE_DIR . '/modules/embed.php';
    
    	break;
  4. В файле <корень DLE>/engine/modules/sitelogin.php после
    if( ! defined( 'DATALIFEENGINE' ) ) {
    
    	die( "Hacking attempt!" );
    
    }
    , добавляем
    include_once ENGINE_DIR . '/modules/embed.php';
    после
    header( "Location: {$_SERVER['PHP_SELF']}" );
    добавляем
    embed_logout();
    после
    if( isset( $_POST['login'] ) and $_POST['login'] == "submit" ) {
    добавляем
    $login_name = $_POST['login_name'];
    
    $login_pass = $_POST['login_password'];
    после
    $db->query( "UPDATE LOW_PRIORITY " . USERPREFIX . "_users set lastdate='{$_TIME}', logged_ip='" . $_IP . "' WHERE user_id='$member_id[user_id]'" );
    добавляем
    embed_login($login_name, $login_pass);
  5. Если phpBB установлен в структуре DLE (например, в директории phpBB), то в файле .htaccess после
    RewriteEngine On
    добавляем
    RewriteRule ^(phpBB.*)$ $0 [L]
  6. Создаём файл <корень phpBB>/sso.php (код откуда-то позаимствовал, но он работает).
    
    <?
    
    
    define('PHPBB_ROOT_PATH', './');
    
    define('IN_PHPBB', true);
    
    
    // Set phpBB root folder properly. Change in according to the actual board folder
    
    $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
    
    
    $phpEx = substr(strrchr(__FILE__, '.'), 1);
    
    include($phpbb_root_path . 'common.' . $phpEx);
    
    error_reporting(0);
    
    
    // Start session management
    
    $user->session_begin();
    
    
    $auth->acl($user->data);
    
    $user->setup('ucp');
    
    
    if ($_REQUEST["do"] == "login") {
    
    
    	// Check if user has submitted login and password and try to log in
    
    	$auth->login($_REQUEST['name'], $_REQUEST['pass'], true);
    
    
    } elseif ($_REQUEST["do"] == "logout") {
    
    
    	$user->session_kill();
    
    
    }
    
    
    ?>
    
    
  7. В файле <корень phpBB>/includes/functions.php в функции page_footer перед
    garbage_collection();
    добавляем
    $embed = $template->assign_display('body', '', true);
    
    include "<корень DLE>/engine/modules/embed.php";


Собственно всё, вроде бы ничего не забыл.

Аналогично я интегрировал и HESK, причем всех изменений - в общей сложности три строки в паре мест. Ну и полсотни названий стилей :)

Изменено пользователем zargaz
Ссылка на сообщение
Поделиться на других сайтах
  • 1 год спустя...
  • 11 месяцев спустя...

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...