Пошаговая инструкция о том, как быстро интегрировать форум phpBB в ваш сайт, написанный на Yii framework
Я собрал воедино все инструкции по интеграции форума в Yii framework, выполнив которые, вы гарантированно получите работающий форум и маленький бонус в конце статьи.
Предполагается, что у вас уже имеется действующий сайт, написанный на Yii, далее нужно скачать и установить форум:
- Скачиваем форум с официального сайта phpBB, при необходимости, там же скачиваем архив с русификатором
- Разархивируем архив с форумом в папку вашего сайта, в поддиректорию "/forum", если Вы скачали русификатор, то так же выполните те действия, которые были описаны на той странице, откуда скачивали русификатор (там инструкция о том, в какие директории необходимо запихать файлы русификации, обратите внимание, что нужно лишь дополнить те директории файлами русификатора, а не затирать)
- Открываем в браузере yoursite.com/forum/index.php, вам откроется страница установки форума, выполняем установку, в ней нет ничего сложного. По окончании установки удалите с вашего сервера папку "/forum/install".
Для удобства отладки форума, рекомендую раскомментировать в файле "/forum/config.php" строки:@define('DEBUG', true); @define('DEBUG_EXTRA', true);
Это отключит кеширование шаблонов форума и будет отображать возникающие ошибки
- Скачиваем и устанавливаем расширение для Yii (оригинал здесь), но я его немного исправил.
После того как скачали, разархивируем его в директорию "/protected/extensions/phpBB", в файле "/protected/config/main.php" добавляем следующее:'components'=>array( 'phpBB'=>array( 'class'=>'ext.phpBB.phpBB', 'path'=>'webroot.forum', ), 'user'=>array( 'class'=>'PhpBBWebUser', 'loginUrl'=>array('/site/login'), // enable cookie-based authentication 'allowAutoLogin'=>true, ), 'request'=>array( // Возможно это и костыль, но без него никуда не поехать, тут мы определяем базовый URL нашего приложения. 'baseUrl'=>$_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF'] != $_SERVER['SCRIPT_FILENAME'] ? 'http://'.$_SERVER['HTTP_HOST'] : '', // ... ), // ... ),
- Далее делаем всё по инструкции, которая уже была описана тут, но я напишу сюда то же самое, только без лишних слов.
Если в вашем Yii-сайте уже используется класс "user", то выполним следующее:- Открываем файл "/forum/includes/session.php" и на 1500 строке кода меняем название класса "user" на "bbuser" и переименовываем функцию внутри класса:
class user extends session { // ... function user() // ... }
превращаем в:
class bbuser extends session { // ... function bbuser() // ... }
- В файле "/forum/common.php" на 101 строке меняем
$user = new user();
на
$user = new bbuser();
- Открываем файл "/forum/includes/session.php" и на 1500 строке кода меняем название класса "user" на "bbuser" и переименовываем функцию внутри класса:
- В директорию "/protected/components" добавляем новый файл "PhpBBWebUser.php", со следующим содержимым:
<?php class PhpBBWebUser extends WebUser{ /** @var UserIdentity */ private $_identity; public function login($identity, $duration=0) { $this->_identity = $identity; return parent::login($identity, $duration); } protected function afterLogin($fromCookie) { if ($this->_identity !== null) { if (Yii::app()->phpBB->login($this->_identity->username, $this->_identity->password) != 'SUCCESS') { Yii::log("Ошибка авторизации на форуме({$this->_identity->username})", CLogger::LEVEL_ERROR); } } parent::afterLogin($fromCookie); } protected function afterLogout() { Yii::app()->phpBB->logout(); parent::afterLogout(); } }
- В вашу модель пользователей(Yii) добавляем следующие строки:
protected function afterSave() { if ($this->isNewRecord) { // Регистрация нового пользователя на форуме // Логин, пароль(не захешированный), email, ID группы на форуме(по умолчанию 2-обычный пользователь, 5-администратор) Yii::app()->phpBB->userAdd($this->login, $this->password, $this->email, 2); } parent::afterSave(); } protected function afterDelete() { // Удаляем пользователя с форума Yii::app()->phpBB->userDelete($this->login); parent::afterDelete(); }
Если на вашем сайте пользователи могут менять пароли, то добавляем в действие смены пароля следующую строку:
Yii::app()->phpBB->changePassword($user_login, $user_new_password);
- Если Вам необходимо закрыть регистрацию и авторизацию на форуме, то в файле "/forum/ucp.php" изменяем следующие строки с case`ами:
case 'register': header('location: /site/registration'); exit(); case 'login': header('location: /site/login'); exit(); case 'logout': header('location: /site/logout'); exit();
На этом часть интеграции форума в Ваш сайт подходит к завершению
Далее я опишу как просто отобразить форум внутри шаблона вашего сайта не прибегая к iframe и не изобретая двухколёсный велосипед.
Мы будем подключать Yii непосредственно в форум:
- Создадим новый файл "/forum/yiiapp.php" со следующим содержимым:
<?php // Yii-приложение для форума defined('DS') or define('DS', DIRECTORY_SEPARATOR); // change the following paths if necessary $yii = dirname(__FILE__).DS.'..'.DS.'yii'.DS.'framework'.DS.'yii.php'; $yii_config = dirname(__FILE__).DS.'..'.DS.'protected'.DS.'config'.DS.'main.php'; require_once($yii); Yii::createWebApplication($yii_config); // Переопределяем корневую директорию с "/server/www/forum" на "/server/www", иначе Yii не будет работать как нам надо Yii::setPathOfAlias('webroot', Yii::getPathOfAlias('webroot').DS.'..'); // Делаем то же самое для папки assets Yii::app()->assetManager->setBasePath(Yii::getPathOfAlias('webroot').DS.'assets');
- В файле "/forum/index.php" (главная страница форума) в самое начало добавляем следующие строки:
/** * Прикручиваем Yii к форуму */ include "yiiapp.php"; $controller = new Controller('bbforum'); // bbforum - произвольное название Yii::app()->controller = $controller; ob_start(); // Начинаем буферизацию вывода // ...
Далее в этом же файле следует код самого форума, мы же переходим в самый самый конец этого файла и видим вызов функции page_footer():
page_footer();
данная функция и отображает весь контент форума, но если мы изучим её, то увидим, что она завершает работу приложения, необходимо исправить это, переходим в файл "/forum/includes/functions.php" и закомментируем строку 4812:
function page_footer($run_cron = true) { // ... garbage_collection(); exit_handler(); // Вот эту строку удалим или закомментируем }
Возвращаемся обратно в файл "/forum/index.php" в самый его конец и пишем после функции page_footer():
// ... page_footer(); $content = ob_get_clean(); // $content будет содержать html главной страницы форума. $controller->renderPartial('//layouts/main', array('content'=>$content), false, true);
Самая последняя строка самая интересная, мы весь результат работы скрипта форума передаём на обработку в Yii, и теперь главная страница форума будет отображена в контентной части Вашего шаблона "//layouts/main"!
Данный способ вам придётся использовать для каждой страницы форума(например viewforum.php, viewtopic.php).
Не забываем, что после такого мы можем использовать все классы вашего Yii-сайта внутри форума.
Конечно всё, что написано выше, можно улучшить, но моей задачей было дать вам работающий способ ;-)
Таким образом, вы можете абсолютно любой сторонний скрипт отобразить «как бы» внутри общего шаблона вашего Yii-проекта!
Автор: Demisang