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

phpBB

У любого разработчика может возникнуть необходимость установки форума на сайт, написанный на 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 код обновления данных и копирования изображения в папку аватарок на форуме.

Готовое поведение можно найти во всём наборе здесь:

Код модуля на GitHub

Оно при необходимости копирует фотографию пользователя в папку аватарок форума и синхронизирует указанные атрибуты.

В комплекте также содержится модель 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">Новых <?php 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, то либо переименуйте его, либо настройте пространства имён.

Также не забудьте в форуме выставить немного большее время жизни сессии, иначе авторизация на форуме будет частенько «отваливаться».

Другие статьи

Каждый «ленивый» разработчик в глубине души желает упростить себе работу с создаваемой им системой. Как вы, наверное, заметили, в каждом совете этого блога автор руководствуется привычкой выносить всё общее и всё изменяемое в отдельные самодостаточные компоненты (в поведения, действия, валидаторы, фильтры, виджеты, переопределённые базовые классы). В итоге такая практика приводит к состоянию, когда порой несколько разнородных проектов работают на одном и том же коде с различием только в теме оформления. В этот раз поговорим именно о темах.

Стандартный класс CUrlManager в Yii (да и в других фреймворках) позволяет собирать URL динамически на основе правил маршрутизации. В интернет-магазинах и блогах часто используются многоуровневые категории. Попробуем использовать их в Yii.

В системах управления контентом (CMS) интернет-магазинов (да и часто для других нужд) можно встретить возможность добавлять неограниченное число полей к различным сущностям. Это знакомые всем списки характеристик товаров, а иногда имеется целая система создания новых типов контента (CCK), которой, кстати, славится Drupal. До полноценной системы CCK нам далеко, но реализовать динамические поля для товаров своего интернет-магазина на Yii всё-таки стоит.

При переделывании своего проекта на модульную структуру сразу же захотелось сделать модули минимально связанными. При этом многим приходится сталкиваться с организацией выноса настроек модулей из главного конфигурационного файла в сами модули. Рассмотрим несколько приёмов и подводных камней.

Комментарии

 

Виталий Иванов

Отлично! Когда ты только все успеваешь?
Обязательно реализую твой метод у себя на сайте.

Ответить

 

Дмитрий Елисеев

По горячим следам, так сказать...

Ответить

 

Артур

Отличная статья! Буду пробовать, все пошагово, должно получится. А вообще я искал немного другую информацию. Я хотел сделать всё тоже самое, но только не 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 заменить компонент

Yii::app->phpBB

на

Yii::app()->dle

Также нужно будет немного переделать остальной код под специфику DLE.

Ответить

 

Артур

Спасибо за разъеснения, но всё же мне не под силу наверное будет это сделать самому.

Ответить

 

seobot

Было бы прекрасно, еще под IPB или vbulletin

Ответить

 

Дмитрий Елисеев

Ну это если вдруг руки дойдут.

Ответить

 

Александр

Все сделал по инструкции. Пишет неправильное имя или пароль!
Может в этой сточке я ошибся?

'path'=>'webroot.forum'

что может быть не так?

Ответить

 

Дмитрий Елисеев

Где пишет?

Ответить

 

Oleg

Добрый день!

Столкнулся с такой проблемой:

Авторизация на форуме происходит, даже появляется ник в графе "кто онлайн", но в браузере по прежнему висит форма с вводом логина и пароля и без авторизации на форуме делать ничего не дает. В бд появляется 2 записи о сессиях. одна запись с айди пользователя, вторая запись с айди анонима. Подскажите, пожалуйста, куда копать :)

Ответить

 

Дмитрий Елисеев

Да уж. Даже не представляю, если честно.

Ответить

 

Oleg

Жаль. Ну ладно, буду тогда разбираться дальше :) Спасибо!

Ответить

 

BlackAdder

спасибо за подробный мануал. сделал по нему сквозную авторизацию.

Подскажите как настроить синхронизацию кукисов. пока что форум у меня не видит кукисов сайта..
yii и phpbb изучаю недавно.

или подскажите в какую торону копать.

Ответить

 

Дмитрий Елисеев

У меня тоже они не видели cookies друг друга. Копать особо не стал.

Ответить

 

Святослав

А под PhpBB2 такого модуля невстречали?

Ответить

 

Дмитрий Елисеев

Не искал. Надо попробовать на совместимость с phpBB2 и phpBB3.

Ответить

 

Андрей

странно, но у меня не хотело работать, пока не заменил
в \protected\extensions\phpBB\phpBB.php

строку

Yii::import('phpbb.extensions.phpBB.phpbbClass');

на

Yii::import('ext.phpBB.phpbbClass');

и только тогда юзер зарегился в phpbb и залогинился...

Ответить

 

Дмитрий Елисеев

Ничего странного. Вы поместили его в главную папку protected/extensions, а я подключил как модуль protected/modules/phpbb/extensions. Вот путь и стал другим.

Ответить

 

Андрей

Распаковал в корень, подключил модуль - чето не пошло, начало не находить какойто и файлов.

Вобщем, сделал по своему.

Вы бы для новичком указали куда распаковать, это совсем не очевидно для меня, читаю манула и половину не понимаю.

Ответить

 

Андрей

Все понятно. Распаковал Код модуля на GitHub в корень сайта а не в папку phpbb. Ладно и так заработало после долгих мучений.

Новичкам, кто будет делать обратите внимание:

в config/main.php должно быть объявление:

'forumDb'=>array(
    'class'=>'CDbConnection',
    'tablePrefix'=>'phpbb_',
    'connectionString' =.....далее.ваши данные с db
),

Далее:

в контроллере User/Register перед сохранением

$model->new_password = $model->password;

поскольку пароль передается в phpbb незахешированный его надо передать через new_password в модель User

В модели User не забываем

public $new_password;

а сам бехавиор

'PhpBBUserBehavior'=>array(
    'class'=>'application.components.PhpBBUserBehavior',
    'usernameAttribute'=>'login',
    'newPasswordAttribute'=>'new_password',
    'emailAttribute'=>'email',
    'forumDbConnection'=>'forumDb',
    ....
),

Короче, помог как смог, уж не обессудьте.

Ответить

 

Андрей

переделал на модуль, все поудалял - ругается на отсутствие файла PhpBBWebUser.php - пришлось вернуть, не стал разбираться уже

также пришлось в файле phpbbuserbehavior добавить null а то php ругается на отсутствие аргумента:

public function afterSave($event=null)
public function afterDelete($event=null)

Ответить

 

Дмитрий Елисеев

Странно, что ругается.

Ответить

 

Андрей

Еще хотелось бы узнать

'phpBbUser'=>array(self::HAS_ONE, 'PhpBBUser', 'login'),

array('username'=>'username') заменил на 'login' - это правильно?

Ответить

 

Дмитрий Елисеев

Нет, так как должна быть ссылка не на первичный ключ:

array('поле из таблицы сайта'=>'поле из таблицы форума')

То есть в вашем случае

array('login'=>'username')
Ответить

 

Андрей

ага понял! спасибо!!!

Ответить

 

Андрей

еще не понятно что делать с аватарами на форуме - Разрешить прямую загрузку аватар?

я так понимаю НАДО ОТКЛЮЧИТЬ, и загружать на сайте, создав в таблице user поле avatar ?

а можно ли сделать наоборот с форума данные чтобы синхронизировались?
там это все реализовано уже в профиле

Ответить

 

Дмитрий Елисеев

Да, на форуме надо отключить (убрать поле загрузки из шаблона) и указать avatarAttribute и avatarPath на сайте, откуда они будут автоматически копироваться в аналогичную папку форума.

Или сделать по-своему, изменив метод _updateAvatar() поведения.

Ответить

 

Андрей

Никак не могу синхронизировать картинки. Выдает:
Invalid image file webroot.upload.avatars\/upload/avatars/2013-11-29-05-57-22.jpg

Ответить

 

Андрей

сделал:

$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, а не только имя файла.

Ответить

 

Андрей

большая просьба подсказать,

у меня на сайте логин идет через 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;
    ...
}
Ответить

 

Андрей

там у меня поиск по логину, если не находит запись о юзере, то по емайлу ищет,

я просто добавил туда после поиска по емайл $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)

Ответить

 

Дмитрий Елисеев

Указать новый:

$user->new_password = '...';
$user->save()
Ответить

 

Станислав

У меня после этих строк скрипт выдает 500ую без ошибок и т.д.... И все. Вообще никак и ничего, ни в логах - нигде... Падает именно на $user->save(); без неё работает... Да и с ней работает, как ни странно (пароль меняет, но шаблон не выдает упорно)

Ответить

 

Станислав

Долго парился и вот выцепил ошибку:

PHP Fatal error: Call to undefined method phpbbuser::model() in /home/u298328/cabinet.7461212.ru/www/protected/modules/phpbb/components/PhpBBUserBehavior.php on line 198, referer: http://cabinet.7461212.ru/site/settings
Ответить

 

Кирилл

Простой установкой в отдельную папку на сервере и в отдельную

Ответить

 

Дмитрий Елисеев

...и в отдельную или эту же базу данных...

Ответить

 

Александр Шиллинг

Установил модуль, подключил и сделал все настройки как написано на гитхабе.
Но при авторизации на сайте, не входит на форуме, в чём может быть проблема? Пароль, ник и на сайте и на форуме одинаковый.

Ответить

 

Дмитрий Елисеев

А форум не на поддомене работает?

Ответить

 

Александр

Сделал всё в точности, но, не могу ничего вывести. Ошибки на несуществующие свойства.
$user = User::model()->findByPk(1);
var_dump($user->phpBbUser) - возвращает NULL
Соответственно из-за этого не могу получить ничего с форума...

Ответить

 

Дмитрий Елисеев

Значит в базе форума нет пользователя с таким же username. Добавьте всех имеющихся в Yii в форум конструкцией:

Yii::app()->phpBB->userAdd($username, $password, $email, 2);
Ответить

 

Александр

Спасибо, я разобрался. У меня в модели юзера в афтерфинде для логина первая буква ставилась в верхний регистр. Сделал небольшой костыль, сейчас всё работает

Ответить

 

Виктор

здравствуйте! делал синхронизацию форума с 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, но как ими воспользоваться я незнаю, и где взять пароль?

Ответить

 

Дмитрий Елисеев

Вместо

$this->_identity->username

можно генерировать логин вроде

$this->_identity->service . '_' . $this->_identity->id

И также составить какой-нибудь пароль для таких случаев.

Но для корректной работы нужно чтобы пользователи хранились в таблицах. То есть можно переопределить EAuthUserIdentity так, чтобы он для каждого нового посетителя находил или создавал пользователя User (почти как стандартный UserIdentity). В модель User можно добавит поля service и eauthid и параллельно заполнять username и password автоматически сгенерированными данными. И не забыть запретить авторизацию этим пользователям через обычную форму входа.

Ответить

 

Нилл

Спасибо! Полезный материал. Сделал то же самое для Yii2, пришлось немного подправить. Хотел бы перейти на phpBB 3.1.x, но сильно изменилась архитектура, простыми решениями не выходит. У вас нет случайно такого опыта, с интеграцией на новую версию форума?

Ответить

 

Дмитрий Елисеев

Новый не смотрел. Не приходилось.

Ответить

 

135

У меня не 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 тоже не надо. Все это можно просто отключить в админке как модуль, и в навигации оно не будет отображаться

Ответить

Оставить комментарий

Войти | Завести аккаунт


(никто не увидит)



Можно использовать теги <p> <ul> <li> <b> <i> <a> <pre>