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

в 13:48, , рубрики: php, phpbb, yii, 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():

    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

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js