Интеграция форума phpBB в Yii

У любого разработчика может возникнуть необходимость установки форума на сайт, написанный на Yii. Простой установкой в отдельную папку на сервере и в отдельную или эту же базу данных это порой не ограничивается. С большой вероятностью разработчику нужно будет организовать единую сквозную авторизацию на сайте и форуме. Попробуем это сделать.
Мы должны придумать систему, которая бы синхронизировала пользователей нашего приложения (в дальнейшем «сайта») с пользователями форума, а также производила авторизацию одновременно. В сети нашлось несколько советов по интеграции к любому сайту, но почти нет материалов про интеграцию форума phpBB конкретно к Yii Framework. Рассмотрим некоторые вопросы.
Ведение базы пользователей
Первым делом надо решить, где будет храниться главная база пользователей (на исходном сайте или на форуме). Можно рассматривать три подхода:
Хранение единой базы пользователей на форуме
Используется таблица phpbb_users на форуме, и она же используется для модели User. Таблица tbl_user с сайта удаляется, а её поля добавляются в phpbb_users. Получается одна таблица с большим количеством полей.
Плюсы подхода:
- Таблица одна, данные в одном экземпляре, поэтому не нужна синхронизация;
- Регистрироваться можно в любом месте (либо на сайте, либо на форуме).
Минусы:
- Необходимость переименовывать поля модели User под формат таблицы форума, что усиливает связанность системы;
- Модель User при регистрации на сайте должна на низком уровне работать со служебными таблицами и полями форума;
- Изменение системы хэширования пароля (чтобы на сайте и на форуме хэширование происходило одинаково);
- При размещении форума в другой базе данных возникают проблемы с кроссбазовыми JOIN запросами.
Действительно, чтобы зарегистрировать пользователя нужно заполнить служебные поля таблицы phpbb_users, а потом для этого пользователя добавить запись в таблицу phpbb_user_group.
Хранение основной базы на сайте с синхронизацией в базу форума
Таблицы на сайте и на форуме остаются как есть. При обновлении первой данные автоматически копируются во вторую. Страницы регистрации и редактирования общих данных профиля на форуме закрываются.
Плюсы:
- Таблицы и модели на сайте и на форуме остаются нетронутыми;
- Реляционные запросы можно выполнять и там, и там;
- Таблицы форума можно спокойно держать в другой базе (и на другом сервере);
- Можно работать через API форума, не заботясь о хэшах.
Минусы:
- Необходимость написания системы синхронизации;
- Закрытие регистрации и некоторых настроек профиля на форуме.
Второй минус решается добавлением простых редиректов с форума на страницы регистрации и редактирования профиля на сайте.
Хранение основной базы в форуме с синхронизацией в базу сайта
Плюсы и минусы этой системы такие же, как и у предыдущей, за исключением того, что модуль синхронизации нужно дописывать к форуму. Для работы с ActiveRecord моделью User нужно будет поднять приложение Yii непосредственно из кода форума, что не очень оправдано.
Первый подход из приведённых требует много жертв, третий – немного не оправдан, так как нам нужно привязать форум к сайту, а не сайт к форуму. Второй подход выглядит наиболее подходящим.
Создание модуля синхронизации
В исходниках форума можно подсмотреть алгоритм работы с пользователями. До нас это уже подсмотрели, поэтому можно спокойно взять готовое расширение отсюда и немного модифицировать.
Данный компонент умеет логинить, добавлять, удалять и обновлять пользователей.
Установим phpBB в папку forum, указав имя пользователя Admin и любой пароль. Также на наш сайт добавим администратора с таким же именем пользователя и паролем. Теперь можно пробовать.
Распакуем архив в папку расширений, а в конфигурационный файл protected/config/main.php добавим объявление компонента:
return array( // ... 'components'=>array( // ... 'phpBB'=>array( 'class'=>'ext.phpBB.phpBB', 'path'=>dirname(dirname(dirname(__FILE__))).'/forum/', ), ), );
Перед использованием нужно исправить пару моментов.
В нашем свежем форуме нужно зайти в административный раздел и в настройках регистрации отключить опцию «Активация аккаунта». Далее в файле phpBB.php этого расширения в метод init() добавить импорт обработчика UTF-8 и поменять формат представления пути path:
class phpBB extends CApplicationComponent { // ... public function init() { if(!$this->path) throw new CException("Don't set forum path"); Yii::import($this->path . '.includes.utf.utf_normalizer'); $this->_phpbb = new phpbbClass(Yii::getPathOfAlias($this->path) . DIRECTORY_SEPARATOR, $this->php); } // ... }
Теперь в настройках компонента заменим путь на его псевдоним 'webroot.forum':
return array( // ... 'components'=>array( // ... 'phpBB'=>array( 'class'=>'ext.phpBB.phpBB', 'path'=>'webroot.forum', ), ), );
Это расширение использует функционал форума, а именно запускает файл forum/common.php и использует встроенные методы форума. Сам форум использует свой класс user, поэтому при первом же обращении к компоненту мы увидим ошибку о попытке перезаписать класс User. Необходимо разрешить этот конфликт имён. Для этого откроем файл forum/includes/session.php и переименуем класс user и его конструктор
class user extends session { // ... function user() // ... }
в любой другой
class bbuser extends session { // ... function bbuser() // ... }
И в файле forum/common.php исправим операцию создания экзепляра
// Instantiate some basic classes $user = new user();
соответственно на
// Instantiate some basic classes $user = new bbuser();
После этого можно попробовать добавить пользователя и авторизоваться
Yii::app()->phpBB->userAdd('TestUser', 'password', 'email@site.com', 2); Yii::app()->phpBB->login('TestUser', 'password');
Если всё пройдёт успешно, то перейдя на форум мы увидим себя авторизованными.
Сквозная авторизация
У нас появился инструмент для управления пользователями, теперь осталось его правильно применить.
Производить авторизацию на форуме нужно в момент авторизации на сайте, поэтому можно поместить код входа/выхода в стандартные действия контроллера:
class SiteController extends Controller { public function actionLogin() { $model = new LoginForm(); if(isset($_POST['LoginForm'])) { $model->attributes = $_POST['LoginForm']; if($model->validate() && $model->login()) { // Авторизуем Yii::app()->phpBB->login($model->username, $model->password); $this->redirect(Yii::app()->user->returnUrl); } } $this->render('login',array('model'=>$model)); } public function actionLogout() { Yii::app()->user->logout(); // Выходим Yii::app()->phpBB->logout(); $this->redirect(Yii::app()->request->urlReferrer ? Yii::app()->request->urlReferrer : Yii::app()->homeUrl); } }
Но этот вариант не очень удачный, так как, во-первых, заставляет нас во многих местах дополнять код нашего приложения, а во-вторых, при использовании авторизации через социальные сети нам придётся вписывать этот код и в другие контроллеры.
Откажемся от этой затеи и уберём добавленный код из контроллеров.
Исследуя код метода LoginForm::login и действия SiteController::actionLogout, мы можем заметить, что вход и выход осуществляются с использованием вызова методов компонента Yii::app()->user:
// Вход Yii::app()->user->login($this->_identity, $duration); // Выход Yii::app()->user->logout();
Компонент Yii::app()->user используется всеми видами авторизации на сайте, поэтому код авторизации на форуме нам нужно поместить в него. По умолчанию это экземпляр класса CWebUser. Этот класс содержит шаблонные методы afterLogin и afterLogout, которые мы можем легко переопределить в наследнике WebUser. Достаточно переопределить эти методы и поместить в них код авторизации на форуме.
Если Вы строили своё первое приложение по официальному руководству и используете RBAC, то наверняка у вас этот класс переопределён вашим классом WebUser для получения роли пользователя:
class WebUser extends CWebUser { private $_model = null; function getRole() { if($user = $this->getModel()) return $user->role; else return 'guest'; } private function getModel() { if (!$this->isGuest && $this->_model === null) $this->_model = User::model()->findByPk($this->id, array('select' => 'role')); return $this->_model; } }
и он подключен вместо стандартного:
'user'=>array( 'class'=>'WebUser', 'allowAutoLogin'=>true, 'loginUrl'=>array('site/login'), ),
Постараемся не нарушать его работу. Просто отнаследуемся прямо от этого класса:
class PhpBBWebUser extends WebUser { protected function afterLogin($fromCookie) { } protected function afterLogout() { } }
Но вот незадача: компоненту phpBB для авторизации нужно передавать имя пользователя и пароль в виде Yii::app()->phpBB->login($username, $password), а в afterLogin эти данные недоступны. Их можно извлечь из экземпляра UserIdentity, который передаётся при логине. Декорируем метод CWebUser::login так, чтобы переданный в него объект $identity сохранялся в приватной переменной:
class PhpBBWebUser extends WebUser { private $_identity; public function login($identity, $duration=0) { $this->_identity = $identity; return parent::login($identity, $duration); } protected function afterLogin($fromCookie) { } protected function afterLogout() { } }
Теперь мы можем из $this->_identity получить введённые имя пользователя и пароль:
class PhpBBWebUser extends WebUser { private $_identity; public function login($identity, $duration=0) { $this->_identity = $identity; return parent::login($identity, $duration); } protected function afterLogin($fromCookie) { if ($this->_identity !== null) Yii::app()->phpBB->login($this->_identity->username, $this->_identity->password); parent::afterLogin($fromCookie); } protected function afterLogout() { Yii::app()->phpBB->logout(); parent::afterLogout(); } }
Заменим в настройках класс на новый:
'user'=>array( 'class'=>'PhpBBWebUser', 'allowAutoLogin'=>true, 'loginUrl'=>array('site/login'), ),
C авторизацией на этом всё. Можно попробовать войти в свой аккаунт и если пароли на сайте и на форуме совпадают, то авторизация на форуме должна работать синхронно. Обратная авторизация работать не будет, так как форум на наш сайт не влияет.
Теперь для подключения авторизации к любому из наших сайтов нам нужно всего лишь поменять класс WebUser на PhpBBWebUser в конфигурационном файле.
Синхронизация пользователей
В примитивном случае, можно добавить код добавления пользователя в код регистрации:
class SiteController extends Controller { public function actionRegistration() { $model = new User(User::SCENARIO_REGISTER); if(isset($_POST['User'])) { $model->attributes = $_POST['User']; if ($model->save()) { // Добавляем пользователя Yii::app()->phpBB->userAdd($model->username, $model->password, $model->email, 2); Yii::app()->user->setFlash('register-form','Регистрация завершена'); $this->refresh(); } } $this->render('register', array('model'=>$model)); } }
Но, как мы уже видели, это не лучший путь. Пользователей может добавлять администратор, при регистрации через аккаунт социальных сетей пользователи создаются автоматически в другом контроллере и т.д. К тому же, куда поместить код удаления пользователя?
По аналогии с предыдущим подходом мы можем использовать методы afterSave и afterDelete, но уже в модели User:
class User extends CActiveRecord { public $new_password; // ... private $_isNew; protected function beforeSave() { $this->_isNew = $this->getIsNewRecord(); return parent::beforeSave(); } protected function afterSave() { if ($this->new_password) { if ($this->_isNew) Yii::app()->phpBB->userAdd($this->username, $this->new_password, $this->email, 2); else Yii::app()->phpBB->changePassword($this->username, $this->new_password); } parent::afterSave(); } protected function afterDelete() { Yii::app()->phpBB->userDelete($this->username); } }
Этот функционал уже умеет синхронно создавать пользователей на форуме, удалять их и менять пароль.
Чтобы не загромождать наш код удалим эти дополнения из модели
class User extends CActiveRecord { public $new_password; // Здесь были обработчики }
и перенесём его в поведение:
class PhpBBUserBahavior extends CActiveRecordBehavior { public $usernameAttribute = 'username'; public $newPasswordAttribute = 'new_password'; public $emailAttribute = 'email'; private $_isNew; public function beforeSave($event) { $model = $this->getOwner(); $this->_isNew = $model->getIsNewRecord(); } public function afterSave($event) { $model = $this->getOwner(); if ($model->{$this->newPasswordAttribute}) { if ($this->_isNew) Yii::app()->phpBB->userAdd($model->{$this->usernameAttribute}, $model->{$this->newPasswordAttribute}, $model->{$this->emailAttribute}, 2); else Yii::app()->phpBB->changePassword($model->{$this->usernameAttribute}, $model->{$this->newPasswordAttribute}); } } public function afterDelete($event) { $model = $this->getOwner(); Yii::app()->phpBB->userDelete($model->{$this->usernameAttribute}); } }
Подключим теперь это поведение к нашей модели User:
class User extends CActiveRecord { public $new_password; // ... public function behaviors() { return array( 'PhpBBUserBahavior'=>array( 'class'=>'PhpBBUserBahavior', 'usernameAttribute'=>'username', 'newPasswordAttribute'=>'new_password', 'emailAttribute'=>'email', ), ); } }
Как видим, теперь для подключения форума к любому сайту на Yii достаточно всего лишь заменить имя класса компонента user на PhpBBWebUser и приписать поведение PhpBBUserBahavior к классу User. И, собственно, всё.
Синхронизация данных пользователя
В предыдущем примере мы написали поведение для управления пользователями и для смены пароля. Его уже достаточно, но что делать, если мы хотим автоматически обновлять атрибуты профиля (например, site, icq) и аватарку? Для этого достаточно добавить в afterSave код обновления данных и копирования изображения в папку аватарок на форуме.
Готовое поведение можно найти во всём наборе здесь:
Оно при необходимости копирует фотографию пользователя в папку аватарок форума и синхронизирует указанные атрибуты.
В комплекте также содержится модель PhpBBUser, отражающая запись в таблице форума.
В полном виде можно использовать поведение и модель так:
class User extends CActiveRecord { public function behaviors() { return array( 'PhpBBUserBehavior'=>array( 'class'=>'phpbb.components.PhpBBUserBehavior', 'usernameAttribute'=>'username', 'newPasswordAttribute'=>'new_password', 'emailAttribute'=>'email', 'avatarAttribute'=>'avatar', 'avatarPath'=>'webroot.upload.images.avatars', 'forumDbConnection'=>'forumDb', 'syncAttributes'=>array( 'site'=>'user_website', 'icq'=>'user_icq', 'from'=>'user_from', 'occ'=>'user_occ', 'interests'=>'user_interests', ) ), ); } public function relations() { Yii::import('phpbb.models.*'); return array( 'phpBbUser'=>array(self::HAS_ONE, 'PhpBBUser', array('username'=>'username')), ); } }
Здесь мы подключили поведение для синхронизации и отношение phpBbUser к строке пользователя форума. С помощью этого отношения мы можем выводить поля из базы данных форума. Модель PhpBBUser содержит также обратное отношение user к модели User и отношение friends для получения списка друзей, поэтому можно производить переход между User и PhpBBUser в любую сторону.
Вывод числа непрочитанных сообщений:
<?php $model = User::model()->findByPk(Yii::app()->user->id); Личный сообщения: <a href="/forum/ucp.php?i=pm&folder=inbox">Новых echo $model->phpBbUser->user_unread_privmsg; </a>
Вывод списка друзей:
foreach ($model->phpBbUser->friends as $friend) { echo $friend->user->name . ' ' . $friend->user->lastname . ' ' . $friend->age; }
В комплекте есть пример виджета для вывода списка друзей любого пользователя.
Последние штрихи
На форуме мы отключили активацию учётной записи.
Теперь нам нужно убрать ненужные страницы входа и регистрации. Удалять ссылки из шаблонов мы не будем. Просто поставим редиректы на страницы сайта.
Открываем файл forum/ucp.php и добавляем строки переадресации в ненужные теперь действия (подсмотрено здесь):
case 'register': header('location: /site/registration'); exit(); break; case 'login': header('location: /site/login'); exit(); break; case 'logout': header('location: /site/logout'); exit(); break;
Теперь откроем шаблоны ucp_profile_profile_info.html и ucp_profile_avatar.html текущей темы и удалим оттуда поля ввода для аватарки, мессенжеров и описания интересов. Оставляем там только просмотр информации.
Исправление системных файлов форума затрудняет его обновление. Поэтому если Вы не хотите трогать код ядра, то организуйте перенаправления в файле
.htaccess. Если ваше приложение использует класс User, то либо переименуйте его, либо настройте пространства имён.
Также не забудьте в форуме выставить немного большее время жизни сессии, иначе авторизация на форуме будет частенько «отваливаться».
Виталий ИвановОтлично! Когда ты только все успеваешь?
Обязательно реализую твой метод у себя на сайте.
Дмитрий ЕлисеевПо горячим следам, так сказать...
АртурОтличная статья! Буду пробовать, все пошагово, должно получится. А вообще я искал немного другую информацию. Я хотел сделать всё тоже самое, но только не phpBB к сайту на yii, а DLE к сайту на yii. Как сделать единую сквозную авторизацию? Может сделаешь и по этой теме такой же подробрый урок?
Спасибо.
Дмитрий ЕлисеевС DLE на уровне API я не работал, так что про устройство авторизации в нём ничего не знаю. Но всё равно нужно раскапывать работу с сессией авторизации.
Артури как это примерно сделать?
Дмитрий ЕлисеевНайти и изучить в DLE функции, которые сохраняют информацию о залогиненном пользователе в сессию и которые добавляют (а также изменяют или удаляют) пользователя в БД.
Потом скопировать их (или съэмулировать их работу) в класс DleManager, либо «поднять» минимальное окружение DLE и прямо обращаться к системным компонентам движка, как мы запускаем бутстрап и напрямую обращаемся к методам самого phpBB (если DLE это позволяет).
Интерфейс класса можно сделать аналогичным:
class DleManager extends CComponent { public function login($username, $password){...} public function logout(){...} public function createUser($username, $password, $email){...} public function updateUser(...){...} public function deleteUser(...){...} }Теперь достаточно подключить этот компонент в конфигурационном файле
'components'=>array( // ... 'dle'=>array( class'=>'DleManager', // ... ), ),и далее в аналогичных поведении DleUserBehavior и классе DleWebUser заменить компонент
на
Также нужно будет немного переделать остальной код под специфику DLE.
АртурСпасибо за разъеснения, но всё же мне не под силу наверное будет это сделать самому.
seobotБыло бы прекрасно, еще под IPB или vbulletin
Дмитрий ЕлисеевНу это если вдруг руки дойдут.
АлександрВсе сделал по инструкции. Пишет неправильное имя или пароль!
Может в этой сточке я ошибся?
что может быть не так?
Дмитрий ЕлисеевГде пишет?
OlegДобрый день!
Столкнулся с такой проблемой:
Авторизация на форуме происходит, даже появляется ник в графе "кто онлайн", но в браузере по прежнему висит форма с вводом логина и пароля и без авторизации на форуме делать ничего не дает. В бд появляется 2 записи о сессиях. одна запись с айди пользователя, вторая запись с айди анонима. Подскажите, пожалуйста, куда копать :)
Дмитрий ЕлисеевДа уж. Даже не представляю, если честно.
OlegЖаль. Ну ладно, буду тогда разбираться дальше :) Спасибо!
BlackAdder – mc.blackadder.ruспасибо за подробный мануал. сделал по нему сквозную авторизацию.
Подскажите как настроить синхронизацию кукисов. пока что форум у меня не видит кукисов сайта..
yii и phpbb изучаю недавно.
или подскажите в какую торону копать.
Дмитрий ЕлисеевУ меня тоже они не видели cookies друг друга. Копать особо не стал.
СвятославА под PhpBB2 такого модуля невстречали?
Дмитрий ЕлисеевНе искал. Надо попробовать на совместимость с phpBB2 и phpBB3.
Андрей – chistopolye.ruстранно, но у меня не хотело работать, пока не заменил
в \protected\extensions\phpBB\phpBB.php
строку
Yii::import('phpbb.extensions.phpBB.phpbbClass');на
Yii::import('ext.phpBB.phpbbClass');и только тогда юзер зарегился в phpbb и залогинился...
Дмитрий ЕлисеевНичего странного. Вы поместили его в главную папку protected/extensions, а я подключил как модуль protected/modules/phpbb/extensions. Вот путь и стал другим.
Андрей – chistopolye.ruРаспаковал в корень, подключил модуль - чето не пошло, начало не находить какойто и файлов.
Вобщем, сделал по своему.
Вы бы для новичком указали куда распаковать, это совсем не очевидно для меня, читаю манула и половину не понимаю.
Андрей – chistopolye.ruВсе понятно. Распаковал Код модуля на GitHub в корень сайта а не в папку phpbb. Ладно и так заработало после долгих мучений.
Новичкам, кто будет делать обратите внимание:
в config/main.php должно быть объявление:
'forumDb'=>array( 'class'=>'CDbConnection', 'tablePrefix'=>'phpbb_', 'connectionString' =.....далее.ваши данные с db ),Далее:
в контроллере User/Register перед сохранением
поскольку пароль передается в phpbb незахешированный его надо передать через new_password в модель User
В модели User не забываем
а сам бехавиор
'PhpBBUserBehavior'=>array( 'class'=>'application.components.PhpBBUserBehavior', 'usernameAttribute'=>'login', 'newPasswordAttribute'=>'new_password', 'emailAttribute'=>'email', 'forumDbConnection'=>'forumDb', .... ),Короче, помог как смог, уж не обессудьте.
Андрей – chistopolye.ruпеределал на модуль, все поудалял - ругается на отсутствие файла PhpBBWebUser.php - пришлось вернуть, не стал разбираться уже
также пришлось в файле phpbbuserbehavior добавить null а то php ругается на отсутствие аргумента:
public function afterSave($event=null)
public function afterDelete($event=null)
Дмитрий ЕлисеевСтранно, что ругается.
Андрей – chistopolye.ruЕще хотелось бы узнать
array('username'=>'username') заменил на 'login' - это правильно?
Дмитрий ЕлисеевНет, так как должна быть ссылка не на первичный ключ:
array('поле из таблицы сайта'=>'поле из таблицы форума')То есть в вашем случае
array('login'=>'username')
Андрей – chistopolye.ruага понял! спасибо!!!
Андрей – chistopolye.ruеще не понятно что делать с аватарами на форуме - Разрешить прямую загрузку аватар?
я так понимаю НАДО ОТКЛЮЧИТЬ, и загружать на сайте, создав в таблице user поле avatar ?
а можно ли сделать наоборот с форума данные чтобы синхронизировались?
там это все реализовано уже в профиле
Дмитрий ЕлисеевДа, на форуме надо отключить (убрать поле загрузки из шаблона) и указать avatarAttribute и avatarPath на сайте, откуда они будут автоматически копироваться в аналогичную папку форума.
Или сделать по-своему, изменив метод _updateAvatar() поведения.
Андрей – chistopolye.ruНикак не могу синхронизировать картинки. Выдает:
Invalid image file webroot.upload.avatars\/upload/avatars/2013-11-29-05-57-22.jpg
Андрей – chistopolye.ruсделал:
$originalFile = Yii::app()->basePath . '/..' . $model->{$this->avatarAttribute};все работает )
Дмитрий ЕлисеевИсправил на
Yii::getPathOfAlias($this->avatarPath) . DIRECTORY_SEPARATOR . $model->{$this->avatarAttribute}А у вас всё правильно получилось, просто в вашей таблице хранится полный путь /upload/avatars/2013-11-29-05-57-22.jpg, а не только имя файла.
Андрей – chistopolye.ruбольшая просьба подсказать,
у меня на сайте логин идет через email или login
через login на форуме логинится, а вот когда ввожу email - то нет
используется UserIdentity
Дмитрий ЕлисеевВ UserIdentity извлеките имя пользователя из модели и присвойте его в $this->username:
public function authenticate() { $user = User::model()->find('LOWER(username)=:name OR LOWER(email)=:name', array( ':name'=>strtolower($this->name) )); ... $this->_id = $user->id; $this->username = $user->username; ... }
Андрей – chistopolye.ruтам у меня поиск по логину, если не находит запись о юзере, то по емайлу ищет,
я просто добавил туда после поиска по емайл $this->username=$record->login; и все заработало ))
костыль такой получился
СтаниславИзвините за столь банальный вопрос... Но какие файлы из phpbb-integration-kit где находятся? Данный мануал с какими папками работает (/protected/extensions/, /protected/companents/..) или все-таки средства интеграции стоит распаковать в папку /protected/modules/phpBB или /protected/phpBB?
Дмитрий ЕлисеевМожно это всё как есть закинуть как модуль phpbb, а можно раскидать отдельно по имеющимся папкам components, models и extensions. Здесь без разницы. Главное пути до этих файлов правильными указать в директивах импорта.
СтаниславСпасибо, полагаю, вы в статье шли от /protected/modules/phpBB.
А не подскажите, что я делаю не так, если получаю вот такую ошибку при попытке залогиниться или разлогиниться:
Alias "www.forum.includes.utf.utf_normalizer" is invalid. Make sure it points to an existing directory or file.
www/protected/modules/phpbb/extensions/phpBB/phpBB.php(58): YiiBase::import("www.forum.includes.utf.utf_normalizer")
При этом на хостинге 2 сайта, а данный проект висит на поддомене (не уверен, что это важно, но мало ли)
СтаниславЯ пытаюсь интегрировать, как модуль /protected/modules/phpBB
Конфиг выглядит вот так (основные моменты):
'modules'=>array( 'phpbb',... ), 'components'=>array( 'phpBB'=>array( 'class'=>'phpbb.extensions.phpBB.phpBB', 'path'=>'www.forum', ), ),
СтаниславПроблема решилась. webroot - надо было писать как есть =). Спасибо за возможность интеграции. Очень много времени удалось сэкономить, даже учитывая кучу моих ошибок =).
СтаниславПодскажите еще пожалуйста, а как все-таки "сменить" пароль на форуме и на сайте, например, в каком-то не связанном контроллере и экшне? (например в SiteController'e)
Дмитрий ЕлисеевУказать новый:
СтаниславУ меня после этих строк скрипт выдает 500ую без ошибок и т.д.... И все. Вообще никак и ничего, ни в логах - нигде... Падает именно на $user->save(); без неё работает... Да и с ней работает, как ни странно (пароль меняет, но шаблон не выдает упорно)
СтаниславДолго парился и вот выцепил ошибку:
КириллПростой установкой в отдельную папку на сервере и в отдельную
Дмитрий Елисеев...и в отдельную или эту же базу данных...
Александр ШиллингУстановил модуль, подключил и сделал все настройки как написано на гитхабе.
Но при авторизации на сайте, не входит на форуме, в чём может быть проблема? Пароль, ник и на сайте и на форуме одинаковый.
Дмитрий ЕлисеевА форум не на поддомене работает?
Александр ШиллингНет. Установлен в папку /forum. Я воспользовался другой инструкцией http://ivan-orlov.com/ru/articles/integraciya-phpbb-v-yii-framework, всё работает.
АлександрСделал всё в точности, но, не могу ничего вывести. Ошибки на несуществующие свойства.
$user = User::model()->findByPk(1);
var_dump($user->phpBbUser) - возвращает NULL
Соответственно из-за этого не могу получить ничего с форума...
Дмитрий ЕлисеевЗначит в базе форума нет пользователя с таким же username. Добавьте всех имеющихся в Yii в форум конструкцией:
АлександрСпасибо, я разобрался. У меня в модели юзера в афтерфинде для логина первая буква ставилась в верхний регистр. Сделал небольшой костыль, сейчас всё работает
Викторздравствуйте! делал синхронизацию форума с yii, по по этому примеру http://habrahabr.ru/post/190868/. статья написана на основе вашей.
сначала синхронизация работала, при переходе на форум после авторизации на сайте, я уже был авторизован на форуме. через некоторое время этот функционал перестал работать. помогите найти причину, почему не происходит совместная авторизация. или может кто знает другие методы как можно это сделать. ну очень нужна помощь, буду очень благодарен
Дмитрий ЕлисеевВидимо время жизни сессии на форуме меньше, чем на сайте.
Викторвы меня наверное неправильно поняли, сейчас, когда я логинюсь на сайте и перехожу на форум, то на форуме я не авторизовний
Дмитрий ЕлисеевА на форуме никаких ограничений не включено?
Виктора как узнать есть ли какие то ограничения?
Дмитрий ЕлисеевКак-нибудь попасть в админку форума и посмотреть, выключена ли активация аккаунта, требования к сложности пароля и прочие вещи, касаемые регистрации.
Викторкажется разобрался. надо было настройки куки и сервера настроить. скажите пожалуйста а есть возможность сделать обратную авторизацию, когда авторизуешся на форуме, и переходишь на сайт чтобы пользователь уже был авторизованный
Дмитрий ЕлисеевНе пробовал. Я просто с форумных login, logout и registration редиректы на сайт сделал, как в последних предложениях указано.
ВикторПростите, я наверное вас достал со своими вопросами, но у меня есть еще один вопрос. На сайте у меня тоже присутствует авторизация через социальные сети. И когда пользователь авторизуется через соц сеть вылезает ошибка "Не определено свойство EAuthUserIdentity.username" в файле phpbbwebuser.php в этом месте
if (Yii::app()->phpBB->login($this->_identity->username, $this->_identity->password)! = 'SUCCESS ") {Как мне передать необходимые параметры для авторизации? И вообще возможно сделать такого рода авторизацию? Соц. сети возвращают разные данные в $this->_identity, но как ими воспользоваться я незнаю, и где взять пароль?
Дмитрий ЕлисеевВместо
можно генерировать логин вроде
И также составить какой-нибудь пароль для таких случаев.
Но для корректной работы нужно чтобы пользователи хранились в таблицах. То есть можно переопределить EAuthUserIdentity так, чтобы он для каждого нового посетителя находил или создавал пользователя User (почти как стандартный UserIdentity). В модель User можно добавит поля service и eauthid и параллельно заполнять username и password автоматически сгенерированными данными. И не забыть запретить авторизацию этим пользователям через обычную форму входа.
НиллСпасибо! Полезный материал. Сделал то же самое для Yii2, пришлось немного подправить. Хотел бы перейти на phpBB 3.1.x, но сильно изменилась архитектура, простыми решениями не выходит. У вас нет случайно такого опыта, с интеграцией на новую версию форума?
Дмитрий ЕлисеевНовый не смотрел. Не приходилось.
135 – 4x4krasnodar.ruУ меня не Yii, но phpbb(ex) и я пошел несколько по другому пути. Я не стал ломать CMS ни форум и сращивать их в котопса, а просто настроил репликацию данных. В моём случае всегда возможен разрыв связи, замена любого из элементов и менее болезненный апгрейд любого из элементов.
Нагрузка на элементы минимальна, код минимален, так как интеграция решена средствами СУБД. В коде элементов изменения только в части единообразного сессионного механизма и образования хешей паролей.
BrriliantЗдравствуйте! Регистрация получилось спасибо за статью А вот авторизация не работает тоесть не соединилось Никаких ошибок не выводить В чем может быть проблема
Владимир3 статьи и 3 видеоурока по установке и переносу phpBB на хостинг
1. Перенос CMS phpBB на хостинг cPanel:
статья https://shneider-host.ru/blog/Perenos-cms-phpbb-na-hosting-cpanel.html
видеоурок https://www.youtube.com/watch?v=80T8MVPjX_M
2. Установка phpBB через Softaculous на cPanel:
статья https://shneider-host.ru/blog/Ustanovka-phpbb-cherez-softaculous-na-cpanel.html
видеоурок https://www.youtube.com/watch?v=YMb1w1Wz5xY
3. Установка phpBB на хостинг cPanel из исходников:
статья https://shneider-host.ru/blog/Ustanovka-phpbb-na-hosting-cpanel-iz-ishodnikov.html
видеоурок https://www.youtube.com/watch?v=xhq--13tU9U
ДмитрийСделал по инструкции.
При авторизации на сайте функция ,
user_login - возвращает SUCCESS ,
куки форума создаются
но авторизации на самом форуме не происходит т.е форма запрос пароля так и весит
куда копать ?
ДмитрийСпасибо, разобрался
Игорь МастерВот бы еще под yii2 такой мануальчик.
РоманА нет решения с yii2 ? Чтобы быстро и безболезненно? А то сроки жим жим ))
Дмитрий ЕлисеевВроде было. Может у Вас заработает.
Серегаucp_profile_profile_info.html и ucp_profile_avatar.html можно не менять и редирект через htaccess тоже не надо. Все это можно просто отключить в админке как модуль, и в навигации оно не будет отображаться