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

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


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

Предполагается, что у вас уже имеется действующий сайт, написанный на Yii, далее нужно скачать и установить форум:
  1. Скачиваем форум с официального сайта phpBB, при необходимости, там же скачиваем архив с русификатором
  2. Разархивируем архив с форумом в папку вашего сайта, в поддиректорию "/forum", если Вы скачали русификатор, то так же выполните те действия, которые были описаны на той странице, откуда скачивали русификатор (там инструкция о том, в какие директории необходимо запихать файлы русификации, обратите внимание, что нужно лишь дополнить те директории файлами русификатора, а не затирать)
  3. Открываем в браузере yoursite.com/forum/index.php, вам откроется страница установки форума, выполняем установку, в ней нет ничего сложного. По окончании установки удалите с вашего сервера папку "/forum/install".
    Для удобства отладки форума, рекомендую раскомментировать в файле "/forum/config.php" строки:
    @define('DEBUG', true);
    @define('DEBUG_EXTRA', true);
    
    Это отключит кеширование шаблонов форума и будет отображать возникающие ошибки
  4. Скачиваем и устанавливаем расширение для 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'] : '',
    		// ...
    	),
    	// ...
    ),
    
  5. Далее делаем всё по инструкции, которая уже была описана тут, но я напишу сюда то же самое, только без лишних слов.
    Если в вашем 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();
      

  6. В директорию "/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();
    	}
    
    }
    
  7. В вашу модель пользователей(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);
    
  8. Если Вам необходимо закрыть регистрацию и авторизацию на форуме, то в файле "/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 непосредственно в форум:
  1. Создадим новый файл "/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');
    
  2. В файле "/forum/index.php" (главная страница форума) в самое начало добавляем следующие строки:
    /**
     * Прикручиваем Yii к форуму
    */
    include "yiiapp.php";
    
    $controller = new Controller('bbforum'); // bbforum - произвольное название
    Yii::app()->controller = $controller;
    ob_start(); // Начинаем буферизацию вывода
    // ...
    

    Далее в этом файле в конце страницы вызывается page_footer(), это собственно и есть вывод на экран результата работы(в других файлах форума данная функция встречается несколько раз в одном файле). Данная функция отображает содержимое и в конце концов делает exit(), нам необходимо доработать эту функцию, откроем файл "/forum/includes/functions.php", найдём там функцию page_footer() и допишем в самый её конец:
    function page_footer($run_cron = true)
    {
    	// ...
    	garbage_collection();
    	if (class_exists('Yii', false) && Yii::app()->controller !== null) {
    		$content = ob_get_clean();
    		Yii::app()->controller->renderPartial('//layouts/main', array('content'=>$content), false, true);
    	}
    	exit_handler();
    }
    


Самая интересная строка здесь Yii::app()->controller->renderPartial, мы весь результат работы скрипта форума передаём на обработку в Yii, и теперь главная страница форума будет отображена в контентной части Вашего шаблона "//layouts/main"!
Данный способ вам придётся использовать для каждой страницы форума(например viewforum.php, viewtopic.php).
Не забываем, что после такого мы можем использовать все классы вашего Yii-сайта внутри форума.

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

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

upd: более актуальная версия статьи здесь: http://ivan-orlov.com/ru/articles/integraciya-phpbb-v-yii-framework
Поделиться публикацией
Похожие публикации
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Комментарии 6
  • +6
    Рискую получить в лоб, но мсье знает толк…
    • 0
      Я согласен, толк автор знает, но после прочтения у меня возник только 1 вопрос (он не к автору конкретно, а скорее — так, общий): а зачем это?
      • 0
        таки да! phpbb, мне кажется, уже отжил свое как и джумла… потом проблем больше
        • 0
          Просто для меня этот вопрос стоит примерно так: Неужели люди, разрабатывающие приложения на Yii не способны быстро создать на нем же форум под свои нужды, не используя костыли типа интеграции phpBB?
          • 0
            Yii пока в релизах, скоро Yii2. Может потому и не спешат глобальное что-то делать…
        • +3
          На данный момент нет готового форума на Yii, который мог бы пойти в сравнение с phpBB.
          Конечно, можно для маленьких сайтов писать свои форумы или использовать имеющиеся расширения(1, 2), но с ними «потом проблем больше» и времени они много отнимут, а тут поставил, настроил и забыл.

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