Yii + phpBB = костыль

Внедрение некоторой автоматизации в связку сайт Yii + форум phpBB.

Решение задачи программного создания конференций, форумов, тем из сторонних скриптов (скриптов сайта) на форуме, работающем на известном движке phpBB.





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

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

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

class user extends session
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;
    }

ОБСУЖДЕНИЕ: