Интеграция phpBB в Yii framework

Пошаговая инструкция о том, как быстро интегрировать форум phpBB в ваш сайт, написанный на Yii framework

Я собрал воедино все инструкции по интеграции форума в Yii framework, выполнив которые, вы гарантированно получите работающий форум и маленький бонус в конце статьи.

Предполагается, что у вас уже имеется действующий сайт, написанный на Yii, далее нужно скачать и установить форум:

  1. Скачиваем форум с официального сайта phpBB, при необходимости, там же скачиваем архив с русификатором
  2. Разархивируем архив с форумом в папку вашего сайта, в поддиректорию "/forum", если Вы скачали русификатор, то так же выполните те действия, которые были описаны на той странице, откуда скачивали русификатор (там инструкция о том, в какие директории необходимо запихать файлы русификации, обратите внимание, что нужно лишь дополнить те директории файлами русификатора, а не затирать)
  3. Открываем в браузере yoursite.com/forum/index.php, вам откроется страница установки форума, выполняем установку, в ней нет ничего сложного. По окончании установки удалите с вашего сервера папку "/forum/install".
    Для удобства отладки форума, рекомендую раскомментировать в файле " /forum/config.php" строки:
    1. @define('DEBUG', true);
    2. @define('DEBUG_EXTRA', true);
    Это отключит кеширование шаблонов форума и будет отображать возникающие ошибки
  4. Скачиваем и устанавливаем расширение для Yii (оригинал здесь), но я его немного исправил.
    После того как скачали, разархивируем его в директорию " /protected/extensions/phpBB", в файле "/protected/config/main.php" добавляем следующее:
    1. 'components'=>array(
    2. 'phpBB'=>array(
    3. 'class'=>'ext.phpBB.phpBB',
    4. 'path'=>'webroot.forum',
    5. ),
    6. 'user'=>array(
    7. 'class'=>'PhpBBWebUser',
    8. 'loginUrl'=>array('/site/login'),
    9. // enable cookie-based authentication
    10. 'allowAutoLogin'=>true,
    11. ),
    12. 'request'=>array(
    13. // Возможно это и костыль, но без него никуда не поехать, тут мы определяем базовый URL нашего приложения.
    14. 'baseUrl'=>$_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF'] != $_SERVER['SCRIPT_FILENAME'] ? 'http://'.$_SERVER['HTTP_HOST'] : '',
    15. // ...
    16. ),
    17. // ...
    18. ),
  5. Далее делаем всё по инструкции, которая уже была описана тут, но я напишу сюда то же самое, только без лишних слов.
    Если в вашем Yii-сайте уже используется класс " user", то выполним следующее:
    • Открываем файл "/forum/includes/session.php" и на 1500 строке кода меняем название класса "user" на "bbuser" и переименовываем функцию внутри класса:
      1. class user extends session
      2. {
      3. // ...
      4. function user()
      5. // ...
      6. }
      превращаем в:
      1. class bbuser extends session
      2. {
      3. // ...
      4. function bbuser()
      5. // ...
      6. }
    • В файле "/forum/common.php" на 101 строке меняем
      1. $user = new user();
      на
      1. $user = new bbuser();
  6. В директорию "/protected/components" добавляем новый файл "PhpBBWebUser.php", со следующим содержимым:
    1. <?php
    2. class PhpBBWebUser extends WebUser{
    3. /** @var UserIdentity */
    4. private $_identity;
    5. public function login($identity, $duration=0) {
    6. $this->_identity = $identity;
    7. return parent::login($identity, $duration);
    8. }
    9. protected function afterLogin($fromCookie) {
    10. if ($this->_identity !== null) {
    11. if (Yii::app()->phpBB->login($this->_identity->username, $this->_identity->password) != 'SUCCESS') {
    12. Yii::log("Ошибка авторизации на форуме({$this->_identity->username})", CLogger::LEVEL_ERROR);
    13. }
    14. }
    15. parent::afterLogin($fromCookie);
    16. }
    17. protected function afterLogout() {
    18. Yii::app()->phpBB->logout();
    19. parent::afterLogout();
    20. }
    21. }
  7. В вашу модель пользователей(Yii) добавляем следующие строки:
    1. protected function afterSave() {
    2. if ($this->isNewRecord) {
    3. // Регистрация нового пользователя на форуме
    4. // Логин, пароль(не захешированный), email, ID группы на форуме(по умолчанию 2-обычный пользователь, 5-администратор)
    5. Yii::app()->phpBB->userAdd($this->login, $this->password, $this->email, 2);
    6. }
    7. parent::afterSave();
    8. }
    9. protected function afterDelete() {
    10. // Удаляем пользователя с форума
    11. Yii::app()->phpBB->userDelete($this->login);
    12. parent::afterDelete();
    13. }
    Если на вашем сайте пользователи могут менять пароли, то добавляем в действие смены пароля следующую строку:
    1. Yii::app()->phpBB->changePassword($user_login, $user_new_password);
  8. Если Вам необходимо закрыть регистрацию и авторизацию на форуме, то в файле "/forum/ucp.php" изменяем следующие строки с case`ами:
    1. case 'register':
    2. header('location: /site/registration');
    3. exit();
    4. case 'login':
    5. header('location: /site/login');
    6. exit();
    7. case 'logout':
    8. header('location: /site/logout');
    9. exit();

На этом часть интеграции форума в Ваш сайт подходит к завершению

Далее я опишу как просто отобразить форум внутри шаблона вашего сайта не прибегая к iframe и не изобретая двухколёсный велосипед.
Мы будем подключать Yii непосредственно в форум:
  1. Создадим новый файл "/forum/yiiapp.php" со следующим содержимым:
    1. <?php
    2. // Yii-приложение для форума
    3. defined('DS') or define('DS', DIRECTORY_SEPARATOR);
    4. // change the following paths if necessary
    5. $yii = dirname(__FILE__).DS.'..'.DS.'yii'.DS.'framework'.DS.'yii.php';
    6. $yii_config = dirname(__FILE__).DS.'..'.DS.'protected'.DS.'config'.DS.'main.php';
    7. require_once($yii);
    8. Yii::createWebApplication($yii_config);
    9. // Переопределяем корневую директорию с "/server/www/forum" на "/server/www", иначе Yii не будет работать как нам надо
    10. Yii::setPathOfAlias('webroot', Yii::getPathOfAlias('webroot').DS.'..');
    11. // Делаем то же самое для папки assets
    12. Yii::app()->assetManager->setBasePath(Yii::getPathOfAlias('webroot').DS.'assets');
  2. В файле "/forum/index.php" (главная страница форума) в самое начало добавляем следующие строки:
    1. /**
    2.  * Прикручиваем Yii к форуму
    3. */
    4. include "yiiapp.php";
    5. $controller = new Controller('bbforum'); // bbforum - произвольное название
    6. Yii::app()->controller = $controller;
    7. ob_start(); // Начинаем буферизацию вывода
    8. // ...
    Далее в этом файле в конце страницы вызывается page_footer(), это собственно и есть вывод на экран результата работы(в других файлах форума данная функция встречается несколько раз в одном файле). Данная функция отображает содержимое и в конце концов делает exit(), нам необходимо доработать эту функцию, откроем файл "/forum/includes/functions.php", найдём там функцию page_footer() и допишем в самый её конец:
    1. function page_footer($run_cron = true)
    2. {
    3. // ...
    4. garbage_collection();
    5. if (class_exists('Yii', false) && Yii::app()->controller !== null) {
    6. $content = ob_get_clean();
    7. Yii::app()->controller->renderPartial('//layouts/main', array('content'=>$content), false, true);
    8. }
    9. exit_handler();
    10. }
Самая интересная строка здесь Yii::app()->controller->renderPartial, мы весь результат работы скрипта форума передаём на обработку в Yii, и теперь главная страница форума будет отображена в контентной части Вашего шаблона "//layouts/main"! Данный способ вам придётся использовать для каждой страницы форума(например viewforum.php, viewtopic.php).
Не забываем, что после такого мы можем использовать все классы вашего Yii-сайта внутри форума.

Конечно всё, что написано выше, можно улучшить, но моей задачей было дать вам работающий способ ;-)

Таким образом, вы можете абсолютно любой сторонний скрипт отобразить "как бы" внутри общего шаблона вашего Yii-проекта!

Comments (0)


Leave a comment