从PHP和设置权限在phpBB3中创建论坛

我正在尝试在现有论坛上创建一个新论坛.我可以非常轻松地创建新论坛,并从管理控制台查看它.问题是我需要它出现在前端以及用户.这是通过权限完成的.

我试图做的是将父论坛(公共)的权限复制到我创建的论坛.然而,论坛仍然没有出现在公众面前.

这是我的代码(请注意先前已经加载了phpBB包含文件):

// $forum_name = name of the new forum
// $parent_id  = the forum which this is a child of

function create_forum($forum_name, $parent_id)
{   
    global $phpbb_root_path, $phpEx, $user, $auth, $cache, $db, $config, $template, $table_prefix;

    $response = array();
    $data = array(
       'forum_name' => $forum_name,
    );

    // Forum info
    $sql = 'SELECT forum_id
          FROM ' . FORUMS_TABLE . '
          WHERE ' . $db->sql_build_array('SELECT', $data);
    $result = $db->sql_query($sql);

    $forum_id = (int) $db->sql_fetchfield('forum_id');
    $db->sql_freeresult($result);

    if ($forum_id) 
    {
       $response['error'] = TRUE;
       $response['error_msg'] = 'FORUM_EXISTS';
       $response['forum_id'] = $forum_id;
    } 
    else 
    {
       $forum_data = array(
          'parent_id'   =>   $parent_id,
          'left_id'   =>   0,
          'right_id'   =>   0,
          'forum_parents'   =>   '',
          'forum_name'   =>   $data['forum_name'],
          'forum_desc'  =>   '',
          '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'   =>   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,
       );

       $sql = 'SELECT MAX(right_id) AS right_id
                FROM ' . FORUMS_TABLE;
       $result = $db->sql_query($sql);
       $row = $db->sql_fetchrow($result);
       $db->sql_freeresult($result);

       $forum_data['left_id'] = $row['right_id'] + 1;
       $forum_data['right_id'] = $row['right_id'] + 2;

       // And as last, a insert query
       $sql = 'INSERT INTO ' . FORUMS_TABLE . ' ' . $db->sql_build_array('INSERT', $forum_data);
       $db->sql_query($sql);

       $forum_data['forum_id'] = $db->sql_nextid();


       // successful result
       $response['error'] = FALSE;
       $response['error_msg'] = '';
       $response['forum_id'] = $forum_data['forum_id'];


       /* PERMISSIONS ----------------------------------------------- */

       // copy permissions from parent forum
       $forum_perm_from = $parent_id;

       ///////////////////////////
       // COPY USER PERMISSIONS //
       ///////////////////////////

       // Copy permisisons from/to the acl users table (only forum_id gets changed)
       $sql = 'SELECT user_id, auth_option_id, auth_role_id, auth_setting
          FROM ' . ACL_USERS_TABLE . '
          WHERE forum_id = ' . $forum_perm_from;
       $result = $db->sql_query($sql);

       $users_sql_ary = array();
       while ($row = $db->sql_fetchrow($result))
       {
          $users_sql_ary[] = array(
             'user_id'         => (int) $row['user_id'],
             'forum_id'         => $forum_data['forum_id'],
             'auth_option_id'   => (int) $row['auth_option_id'],
             'auth_role_id'      => (int) $row['auth_role_id'],
             'auth_setting'      => (int) $row['auth_setting']
          );
       }
       $db->sql_freeresult($result);

       ////////////////////////////
       // COPY GROUP PERMISSIONS //
       ////////////////////////////

       // Copy permisisons from/to the acl groups table (only forum_id gets changed)
       $sql = 'SELECT group_id, auth_option_id, auth_role_id, auth_setting
          FROM ' . ACL_GROUPS_TABLE . '
          WHERE forum_id = ' . $forum_perm_from;
       $result = $db->sql_query($sql);

       $groups_sql_ary = array();
       while ($row = $db->sql_fetchrow($result))
       {
          $groups_sql_ary[] = array(
             'group_id'         => (int) $row['group_id'],
             'forum_id'         => $forum_data['forum_id'],
             'auth_option_id'   => (int) $row['auth_option_id'],
             'auth_role_id'      => (int) $row['auth_role_id'],
             'auth_setting'      => (int) $row['auth_setting']
          );
       }
       $db->sql_freeresult($result);

       //////////////////////////////////
       // INSERT NEW FORUM PERMISSIONS //
       //////////////////////////////////

       $db->sql_multi_insert(ACL_USERS_TABLE, $users_sql_ary);
       $db->sql_multi_insert(ACL_GROUPS_TABLE, $groups_sql_ary);

       $auth->acl_clear_prefetch(); 

       return $response;
    }
}

解决方法:

function create_forum($forum_name, $parent_id)
{   
    global $phpbb_root_path, $phpEx, $user, $auth, $cache, $db, $config, $template, $table_prefix;

    $response = array();
    $data = array(
       'forum_name' => $forum_name,
    );

    // Forum info
    $sql = 'SELECT forum_id
          FROM ' . FORUMS_TABLE . '
          WHERE ' . $db->sql_build_array('SELECT', $data);
    $result = $db->sql_query($sql);

    $forum_id = (int) $db->sql_fetchfield('forum_id');
    $db->sql_freeresult($result);

    if ($forum_id) 
    {
       $response['error'] = TRUE;
       $response['error_msg'] = 'FORUM_EXISTS';
       $response['forum_id'] = $forum_id;
    } 
    else 
    {
       $forum_data = array(
          'parent_id'   =>   $parent_id,
          'left_id'   =>   0,
          'right_id'   =>   0,
          'forum_parents'   =>   '',
          'forum_name'   =>   $data['forum_name'],
          'forum_desc'  =>   '',
          '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'   =>   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,
       );
            /**
            /*Changed the code from here    
            /*Pulled straight from acl_forums.php from line 973 to line 1002        
            /*Removed lines 980 -> 989
            /*Changed $forum_data_sql['parent_id']; line 975 to $parent_id
            /*Changed $forum_data_sql on lines 1001, 1002 to $forum_data    
            **/

            $sql = 'SELECT left_id, right_id, forum_type
                FROM ' . FORUMS_TABLE . '
                WHERE forum_id = ' . $parent_id;
            $result = $db->sql_query($sql);
            $row = $db->sql_fetchrow($result);
            $db->sql_freeresult($result);

            $sql = 'UPDATE ' . FORUMS_TABLE . '
                SET left_id = left_id + 2, right_id = right_id + 2
                WHERE left_id > ' . $row['right_id'];
            $db->sql_query($sql);

            $sql = 'UPDATE ' . FORUMS_TABLE . '
                SET right_id = right_id + 2
                WHERE ' . $row['left_id'] . ' BETWEEN left_id AND right_id';
            $db->sql_query($sql);

            $forum_data['left_id'] = $row['right_id'];
            $forum_data['right_id'] = $row['right_id'] + 1;

       // And as last, a insert query
       $sql = 'INSERT INTO ' . FORUMS_TABLE . ' ' . $db->sql_build_array('INSERT', $forum_data);
       $db->sql_query($sql);

       $forum_data['forum_id'] = $db->sql_nextid();


       // successful result
       $response['error'] = FALSE;
       $response['error_msg'] = '';
       $response['forum_id'] = $forum_data['forum_id'];


       /* PERMISSIONS ----------------------------------------------- */

       // copy permissions from parent forum
       $forum_perm_from = $parent_id;

       ///////////////////////////
       // COPY USER PERMISSIONS //
       ///////////////////////////

       // Copy permisisons from/to the acl users table (only forum_id gets changed)
       $sql = 'SELECT user_id, auth_option_id, auth_role_id, auth_setting
          FROM ' . ACL_USERS_TABLE . '
          WHERE forum_id = ' . $forum_perm_from;
       $result = $db->sql_query($sql);

       $users_sql_ary = array();
       while ($row = $db->sql_fetchrow($result))
       {
          $users_sql_ary[] = array(
             'user_id'         => (int) $row['user_id'],
             'forum_id'         => $forum_data['forum_id'],
             'auth_option_id'   => (int) $row['auth_option_id'],
             'auth_role_id'      => (int) $row['auth_role_id'],
             'auth_setting'      => (int) $row['auth_setting']
          );
       }
       $db->sql_freeresult($result);

       ////////////////////////////
       // COPY GROUP PERMISSIONS //
       ////////////////////////////

       // Copy permisisons from/to the acl groups table (only forum_id gets changed)
       $sql = 'SELECT group_id, auth_option_id, auth_role_id, auth_setting
          FROM ' . ACL_GROUPS_TABLE . '
          WHERE forum_id = ' . $forum_perm_from;
       $result = $db->sql_query($sql);

       $groups_sql_ary = array();
       while ($row = $db->sql_fetchrow($result))
       {
          $groups_sql_ary[] = array(
             'group_id'         => (int) $row['group_id'],
             'forum_id'         => $forum_data['forum_id'],
             'auth_option_id'   => (int) $row['auth_option_id'],
             'auth_role_id'      => (int) $row['auth_role_id'],
             'auth_setting'      => (int) $row['auth_setting']
          );
       }
       $db->sql_freeresult($result);

       //////////////////////////////////
       // INSERT NEW FORUM PERMISSIONS //
       //////////////////////////////////

       $db->sql_multi_insert(ACL_USERS_TABLE, $users_sql_ary);
       $db->sql_multi_insert(ACL_GROUPS_TABLE, $groups_sql_ary);

       $auth->acl_clear_prefetch(); 
        print_r($response);
       return $response;
    }
}

上一篇:Discuz 取各排行榜数据


下一篇:如果查询参数存在于nginx上,则重定向