zargaz 0 Опубликовано: 1 февраля 2011 Рассказать Опубликовано: 1 февраля 2011 (изменено) Теоретически этот способ годится для для интеграции любых движков с DLE. На практике проверил его с phpBB и HESK (с HESK только дизайн). Инструкции приведены для DLE 9.2 и phpBB 3.0.x, но сам способ не заточен именно под эти версии. Single sign-on делается через через реализацию мтетодов login и logout, которые вызываются из модуля sitelogin.php DLE. SSO работает только при входе/выходе через DLE, поэтому элементы авторизации в дизайне стороннего движка надо прятать. Единую регистрацию ещё не сделал, но это вопрос ближайшего будущего. Общая идея интеграции дизайна такая: Во-первых немного модифицируем сторонний движок. Для начала заставляем его буферировать вывод. Обычно в любом движке есть одна-две финальные точки, где получаем готовый HTML. Там через HTTP вызываем также немного модифицированный DLE со специальным аргументом (do=embed) и получаем "обёртку" с пометкой, куда надо будет вставить дизайн. Эту пометку для начала обрамляем <div id="embed"></div> , специальный id поможет нам избежать конфликта имен стилей DLE и встраиваемого дизайна. Теперь самая тонкая хирургическая операция - достаём из буфера дизайн, отделяем head и body, из head переносим в заголовок обёртки все link и script (сохраняем стили и скрипты), а также атрибуты body в body обертки. Это минимум. По-хорошему надо аккуратно вшить как можно больше из head в заголовок обёртки, а style, class и id из body перенести в <div id="embed">. Наконец в помеченное место вставляем внутренности body дизайна. А теперь самая жесть - надо перелопатить ВСЕ подключаемые стили стороннего движка, заменить html и body на #embed (дизайн внешнего движка теперь лежит в div'е, а не в body) и к названиям всех стилей добавить #embed, чтобы не было конфликта со стилями DLE. В стандартной prosilver phpBB мне пришлось вручную переделать несколько сотен названий . Сделать новый стиль сложнее, но правильнее, чтобы форум не выглядел пятном в общем дизайне сайта. К тому же все равно нужно вырезать лишние ссылки, типа login/logout и т.п. Теперь по шагам, что конкретно надо делать. Устанавливаем phpBB. Теоретически можно в любое место, даже вне структуры DLE. Я установил в корне DLE (в каталог phpBB). Также можно в любую базу, не обязательно в общую с DLE. Главное условие - один домен с DLE (иначе не будет работать SSO), но это уже вопрос настройки web-сервера. Создаём файл <корень 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; ?> В файле <корень DLE>/engine/engine.php перед default : добавляем case "embed" : include_once ENGINE_DIR . '/modules/embed.php'; break; В файле <корень 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); Если phpBB установлен в структуре DLE (например, в директории phpBB), то в файле .htaccess послеRewriteEngine On добавляем RewriteRule ^(phpBB.*)$ $0 [L] Создаём файл <корень 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(); } ?> В файле <корень phpBB>/includes/functions.php в функции page_footer перед garbage_collection(); добавляем $embed = $template->assign_display('body', '', true); include "<корень DLE>/engine/modules/embed.php"; Собственно всё, вроде бы ничего не забыл. Аналогично я интегрировал и HESK, причем всех изменений - в общей сложности три строки в паре мест. Ну и полсотни названий стилей Изменено 1 февраля 2011 пользователем zargaz Цитата Ссылка на сообщение Поделиться на других сайтах
_M_ 0 Опубликовано: 5 марта 2012 Рассказать Опубликовано: 5 марта 2012 будет ли данное работать на DLE 9.5 и phpbb 3.0.10? Цитата Ссылка на сообщение Поделиться на других сайтах
a1ex 60 Опубликовано: 8 марта 2012 Рассказать Опубликовано: 8 марта 2012 дебилизм через curl открывать свои страницы 1 Цитата Ссылка на сообщение Поделиться на других сайтах
DimkaG 5 Опубликовано: 7 марта 2013 Рассказать Опубликовано: 7 марта 2013 9.8 => 3,0,11 как дружат? Цитата Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.