- PVSM.RU - https://www.pvsm.ru -
Я собрал воедино все инструкции по интеграции форума в Yii framework, выполнив которые, вы гарантированно получите работающий форум и маленький бонус в конце статьи.
Предполагается, что у вас уже имеется действующий сайт, написанный на Yii, далее нужно скачать и установить форум:
@define('DEBUG', true);
@define('DEBUG_EXTRA', true);
Это отключит кеширование шаблонов форума и будет отображать возникающие ошибки
'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'] : '',
// ...
),
// ...
),
class user extends session
{
// ...
function user()
// ...
}
превращаем в:
class bbuser extends session
{
// ...
function bbuser()
// ...
}
$user = new user();
на
$user = new bbuser();
<?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();
}
}
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);
case 'register':
header('location: /site/registration');
exit();
case 'login':
header('location: /site/login');
exit();
case 'logout':
header('location: /site/logout');
exit();
Далее я опишу как просто отобразить форум внутри шаблона вашего сайта не прибегая к iframe и не изобретая двухколёсный велосипед.
Мы будем подключать Yii непосредственно в форум:
<?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');
/**
* Прикручиваем 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
Источник [6]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/php-2/41440
Ссылки в тексте:
[1] Скачиваем форум: https://www.phpbb.com/
[2] скачиваем архив с русификатором: https://www.phpbb.com/customise/db/translation/russian/
[3] Скачиваем: https://github.com/demisang/yii_phpbb_integration
[4] оригинал здесь: http://yiiframework.ru/forum/viewtopic.php?f=9&t=335&start=10#p19106
[5] описана тут: http://www.elisdn.ru/blog/32/podklyuchaem-forum-phpbb-k-yii
[6] Источник: http://habrahabr.ru/post/190868/
Нажмите здесь для печати.