Yii+phpBB. Автоматизация.

Обсуждение документации. Переводы Cookbook и авторские рецепты.
Ответить
Alexkhovich
Сообщения: 4
Зарегистрирован: 2012.11.02, 23:27
Откуда: Беларусь, Минская область, Молодечно
Контактная информация:

Yii+phpBB. Автоматизация.

Сообщение Alexkhovich »

Нижеследующие костыли были сделаны на скорую руку. Может быть гуру Yii заинтересуются достигнутыми результатами и сделают что-то вразумительное. Тем не менее это работает и может помочь.

В проекте используется форум phpBB. Он располагается в директории forum/ в корне сайта. На сайте есть структура каталог-раздел-подраздел-продукт. Соответственно на форуме автоматически создается конференция-форум-подфорум-тема, для возможности обсуждения продукта заинтересованными лицами. В отображение продукта добавляется ссылка на соответствующую тему.

Предварительное приготовление.

Правим forum/includes/session.php. В это файле находятся класс: user, который перекликается с Yii.

Код: Выделить всё

class user extends session
Меняем его на bbuser:

Код: Выделить всё

class bbuser extends session
Чуть ниже меняем название функции:

Код: Выделить всё

function user()
    {
        global $phpbb_root_path;

        $this->lang_path = $phpbb_root_path . 'language/';
    }

Код: Выделить всё

function bbuser()
    {
        global $phpbb_root_path;

        $this->lang_path = $phpbb_root_path . 'language/';
    }
в файле forum/common.php исправим операцию создания экзепляра:

Код: Выделить всё

  // Instantiate some basic classes
  $user       = new user();

Код: Выделить всё

  // Instantiate some basic classes
  $user       = new bbuser();
Следом тут же вручную добавляем создание глобальных переменных:

Код: Выделить всё

$GLOBALS['user'] = $user;
  $GLOBALS['auth'] = $auth;
  $GLOBALS['template'] = $template;
  $GLOBALS['cache'] = $cache;
  $GLOBALS['db'] = $db; 
И чуть ниже config:

Код: Выделить всё

  // Grab global variables, re-cache if necessary
  $config = $cache->obtain_config();
  $GLOBALS['config'] = $config; 
Блокирую валидацию при создании форума в автоматическом режиме. Файл forum/includes/acp/acp_forums.php , заменяю:

Код: Выделить всё

validate_range($range_test_ary, $errors);

Код: Выделить всё

if (!$auto)
    validate_range($range_test_ary, $errors);
Приготовления закончены.

Скрипт добавления конференции или форума в моем случае размещается в методе beforeSave в классе модели.

Код: Выделить всё

/**
     * Добавление конференции на форум, согласно вновь создаваемому каталогу
     */
    public function beforeSave()
    {
        global $cache, $auth;

               $forum_data = array(
                   'parent_id'            => 0, // либо id форума, в который 
                                                   //вы хотите вложить данный создаваемый
                   'left_id'              => 0,
                   'right_id'             => 0,
                   'forum_parents'        => '',
                   'forum_name'           => $this->title,
                   'forum_desc'           => $this->description,
                   'forum_desc_bitfield'  => '',
                   'forum_desc_options'   => 7,
                   'forum_desc_uid'       => '',
                   'forum_link'           => '',
                   'forum_password'       => '',
                   'forum_style'          => 0,
                   'forum_image'          => '',
                   'forum_rules'          => '',
                   'forum_rules_link'     => '',
                   'forum_rules_bitfield' => '',
                   'forum_rules_options'  => 7,
                   'forum_rules_uid'      => '',
                   'forum_topics_per_page'=> 0,
                   'forum_type'           => 0,   // 0 - конференция  1 - форум
                   'forum_status'         => 0,
                   'forum_posts'          => 0,
                   'forum_topics'         => 0,
                   'forum_topics_real'    => 0,
                   'forum_last_post_id'   => 0,
                   'forum_last_poster_id' => 0,
                   'forum_last_post_subject' => '',
                   'forum_last_post_time'    => 0,
                   'forum_last_poster_name'  => '',
                   'forum_last_poster_colour'   => '',
                   'forum_flags'            => 32,
                   'display_on_index'       => false,
                   'enable_indexing'        => true,
                   'enable_icons'           => false,
                   'enable_prune'           => false,
                   'prune_next'            => 0,
                   'prune_days'            => 7,
                   'prune_viewed'          => 7,
                   'prune_freq'            => 1,
               );

                       //разрешаем доступ к форуму из стороннего скрипта
                       define('IN_PHPBB', true);
                       // устанавливаем корень форума и расширение файлов
                       define('PHPBB_ROOT_PATH',  
                          dirname(Yii::app()->basePath).'/forum/');
                       $phpbb_root_path = dirname(Yii::app()->basePath).'/forum/';
                       $GLOBALS['phpbb_root_path'] = $phpbb_root_path;
                       $phpEx = substr(strrchr(__FILE__, '.'), 1);
                       $GLOBALS['phpEx'] = $phpEx;
                       $GLOBALS['auto'] = true;
                       include($phpbb_root_path . 'common.' . $phpEx);
                       // подключаем функционал работы с форумом
                       include($phpbb_root_path . 'includes/acp/acp_forums.' . $phpEx);

                       //оздаем форум
                       $forums_admin = new acp_forums();
                       $forums_admin->update_forum_data($forum_data);

                       // добавляем права доступа к форуму
                       $connection=Yii::app()->db;
                       $sql="SELECT MAX(forum_id) FROM phpbb_forums";
                       $forum_idMax=$connection->createCommand($sql)->queryRow();
                       $forum_id = $forum_idMax["MAX(forum_id)"];

                       $sql = "INSERT INTO phpbb_acl_groups (group_id, forum_id,
                                        auth_option_id, auth_role_id, auth_setting)
                                   VALUES
                                       (1, '$forum_id', 0, 17, 0),
                                       (2, '$forum_id', 0, 18, 0),
                                       (4, '$forum_id', 0, 14, 0),
                                       (5, '$forum_id', 0, 14, 0),
                                       (6, '$forum_id', 0, 17, 0),
                                       (7, '$forum_id', 0, 18, 0);";

                       $sql_command=$connection->CreateCommand($sql);
                       $sql_command->execute();
                       // очищаем кэш
                       $cache->purge();
                       $auth->acl_clear_prefetch();
                       // забираем id созданной конференции(или форума)
                       $this->forum_id = $forum_id;
        return true;

    } 
Скрипт добавления темы:

Код: Выделить всё

// добавление темы на форум, согласно создаваемому продукту
public function beforeSave()
    {
        global $user, $auth;

        define('IN_PHPBB', true);
        // Set phpBB root folder properly. Change in according to the actual board folder
        define('PHPBB_ROOT_PATH', dirname(Yii::app()->basePath).'/forum/');
        $phpbb_root_path = dirname(Yii::app()->basePath).'/forum/';
        $GLOBALS['phpbb_root_path'] = $phpbb_root_path;
        $phpEx = substr(strrchr(__FILE__, '.'), 1);
        $GLOBALS['phpEx'] = $phpEx;

        include($phpbb_root_path . 'common.' . $phpEx);
        include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);


        // Start session management
        $user->session_begin(false); // no update_session_page
        $user->session_create( 2, false, false, false);
        $auth->acl($user->data);
        $user->setup();

        // variables to hold the parameters for submit_post
        $poll = $uid = $bitfield = $options = '';

        $data = array(
            'forum_id'    => $this->subpart->forum_id, // тут я ссылаюсь на форум,
                                                              //который был создан для 
                                                              //подраздела, в который я 
                                                              //добавляю этот продукт
            'topic_id'  => 0,    // 0 - новая тема, или id темы куда будет помещен пост
            'icon_id'    => false,

            'enable_bbcode'    => true,
            'enable_smilies'    => true,
            'enable_urls'    => true,
            'enable_sig'    => true,

            'message'        => $this->description,
            'message_md5'    => md5($this->description),

            'bbcode_bitfield'    => $bitfield,
            'bbcode_uid'    => $uid,

            'post_edit_locked'    => 0,
            'topic_title'    => $this->title,
            'notify_set'    => false,
            'notify'        => false,
            'post_time'     => 0,
            'forum_name'    => '',
            'enable_indexing'    => true,
        );

        @submit_post('post', $this->title, '', POST_NORMAL, $poll, $data);

        $user->session_kill();
       
        $connection=Yii::app()->db;
        $sql="SELECT MAX(post_id) FROM phpbb_posts";
        $post_idMax=$connection->createCommand($sql)->queryRow();
        // забираем id созданной темы, для сохранения ее в модели
        $this->theme_id = $post_idMax["MAX(post_id)"];

        return true;
    } 
Ответить