Интеграция 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():

    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-проекта!

ссылка на оригинал статьи http://habrahabr.ru/post/190868/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *