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

2024-01-12

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

因此,我试图做的是将父论坛(公开的)的权限复制到我创建的论坛。然而,该论坛似乎仍然没有出现在面向公众的一侧。

这是我的代码(请注意 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;
    }
}

phpbb /questions/tagged/phpbbphpbb3 /questions/tagged/phpbb3phpbb3.0.10 /questions/tagged/phpbb3.0.10php /questions/tagged/php

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 PHP 和设置权限在 phpBB3 中创建论坛 的相关文章

  • 日期函数的奇怪行为

    我今天在 StackOverflow 上遇到了这个问题 但没有得到答案 我的问题是 echo date Y m d strtotime 2012 september 09 output 2012 09 01 echo date Y m d
  • php paypal 服务器端 REST 集成失败

    我无法发布代码 错误等 因为 你需要至少 10 个声誉才能发布 2 个以上的链接 并且所有内容都包含很多链接 只是花了几个小时写了一篇完整详细的帖子 我在这里 和其他地方 读过类似的帖子 但它们没有帮助 我基本上遵循 https devel
  • 如何上传图像代码并将路径保存到mysql数据库中

    如何编写代码上传图像并将路径保存到mysql数据库中 我已经尝试过 但没有一个有效 一种方法是上传图像并将其存储在服务器上的文件夹中 并将名称保存到 mysql 数据库中 这是一个例子 首先我们将创建一个用于上传的表单 文件 html Up
  • laravel Blade 模板不渲染

    进入 Laravel 后 我尝试使用 Blade 模板 但它没有渲染 我的所有示例都来自 Laravel 文档 UPDATE 所以这是我的master blade php 文件位于资源 gt 视图 gt master blade php y
  • 如何捕获 Symfony2/Silex 中的错误和异常?

    我想在我的 Silex 应用程序中捕获错误和异常 将它们包装在始终返回给客户端的自定义 JSON 响应中 我发现了三种基本方法 app gt error Symfony Component Debug ErrorHandler regist
  • PHP:如何获取
    中的名称值

    有没有办法获取form标签中name属性的值 我正在使用 PHP 但在 中没有看到它 POST 有没有办法获取form标签中name属性的值 我正在使用 PHP 但在 POST 中没有看到它 不 表单的名称属性永远不会设置为作为 POST
  • dompdf 在文档末尾插入空白页

    我正在使用 dompdf 0 6 0 生成 pdf 文档 并且遇到一个奇怪的问题 即最后创建了一个空白页面 我的 简化的 html
  • 撇号 php 问题

    我正在做一项涉及喊话箱的学校作业 一个很棒的教程 它使用 jquery ajax mysql 和 php 现在我遇到了以下句子的一个小问题 result li strong row user strong img src alt row m
  • PHP 中的 GOTO 命令?

    我听说 PHP 计划引入 goto 命令的传言 它应该做什么 我尝试搜索了一下 但没有找到任何具有描述性的内容 我明白这不会是 GOTO 10 类似命令 They are not adding a real GOTO but extendi
  • Woocommerce 预订中每人和每件商品的动态结账自定义字段

    对于预订网站 我正在尝试创建一个功能 可以根据人数添加与会者列表 感谢 LoicTheAztec 我已经获得了单次预订的代码 那部分工作正常 我还需要相同的功能来进行多次预订 我怎样才能实现这个目标 这是代码 Add a new check
  • 使用 PHP 比较两个字符串的相似度

    嘿伙计们 我想寻求一些解决方案 现在我有字典了单词 txt 这里有一些例子 happy laugh sad 我有俚语字符串 hppy 我想要搜索和匹配那个俚语字符串我的字典这意味着它将返回 happy 因为这些字符串参考 快乐 in 字典
  • PHP使用正则表达式查找字符串

    我已经阅读了多个有关正则表达式的教程 但它只是不会留在我的脑海中 我永远无法让我的模式发挥作用 希望有人能帮忙 我有一个 php 变量 content 我需要在其中找到如下所示的特定模式 图库 名称 文件夹 我想搜索 starting wi
  • facebook og:image 不会从与 URL 相呼应的 php 文件中获取图像

    facebook OG 从回显 URL 获取图像 这可能吗 因为我包含了一个 php 文件 它将回显图像 URL 但是当我签入共享调试器时 内容为空 我的元标签 gt 和 php 文件
  • 在 PHP 中设置通知的 FCM 通道 ID

    我正在尝试使用 PHP 向 Android 设备发送 FCM 通知 我的代码适用于 Android O 之前的设备 在Android O中 我们还需要在请求中设置通道ID来接收通知 我不知道该怎么做 我已在应用程序中完成了必要的设置 并使用
  • 如何测试“If-Modified-Since”HTTP 标头支持

    使用 PHP 如何准确测试远程网站supports If Modified Since HTTP 标头 据我所知 如果您获取的远程文件自标头请求中指定的日期以来已被修改 它应该返回 200 OK 状态 如果尚未修改 则应返回 304 Not
  • 尝试在本地主机上测试我的 php 文件,但只出现一个空白页面,没有错误消息

    我正在运行 Apache 和 mySQL 因为我检查了所有日志 似乎没有任何错误 我的目标是每当有新的表单条目时就向特定地址发送电子邮件 我对后端和 PHP 缺乏经验 所以我不太确定哪里出了问题 任何帮助将不胜感激
  • 如何使用 php 创建谷歌双因素身份验证?

    我想在我的 PHP 项目中使用 Google 2FA 用户登录时需要输入6位2fa代码 您可以画出一些关于该朝哪个方向走的提示吗 步骤 1 创建长度为 16 个字符的唯一密码 PHPGangsta 为 Google Authenticato
  • PHPExcel输出乱码

    我正在尝试 PHPExcel 附带的简单示例 01simple xls 我得到乱码输出 它 LibreOffice 想要导入文件 它认为字符集是西欧 DOS OS2 861 icelandic 输出是这样的
  • Mysqli 准备好的语句从数组动态构建 INSERT 查询

    我正在尝试用 PHP 而不是 OOP 开发我的函数 以创建 CRUD 目标是对任何表使用相同的函数 但我已经陷入了第一个表中 不知道该怎么做 我现在拥有的 function to avoid injections function vali
  • html 下钻下拉所选值未插入 MYSQL

    我有两个下拉列表 首先从数据库下拉填充 根据第一个下拉列表的选定值从数据库填充第二个下拉列表 document ready function c change function var c1 c selected text if c1 aj

随机推荐

  • 图像未调整大小(仅限默认 Bootstrap 类)

    我正在使用 Bootstrap 3 0 dist 现在正在学习一些 Bootstrap 教程 试图了解它是如何工作的 我所做的一切都完全按照教程中的方式进行 适用于 v2 所以我将类更改为 v3 并且我不使用任何自定义 CSS 或任何内容
  • 包含非 Mavenized 依赖项,以便与 maven-shade-plugin 一起使用

    我想包括G数据客户端 http code google com p gdata java client 它不使用 Maven 作为我的 Maven 项目的依赖项 它以一堆 JAR 文件的形式提供 另外 我用Maven 阴影插件 http m
  • 如何将数据框列转换为序列

    我有一个数据框如下 LABEL TERM 4 inhibitori effect 4 novel therapeut 4 antiinflammator 4 promis approach 4 cell function 4 cell li
  • 使用 Capistrano 3 部署 Rails 应用程序时跳过数据库迁移

    当我们跑步时cap deploy 它在部署期间运行所有迁移 我们必须将应用程序指向现有数据库 并且不想修改现有数据库 有人可以建议我们如何在部署应用程序时跳过迁移步骤吗 我想你正在使用卡皮斯特拉诺 Rails https github co
  • 使用 Node 或 Express 返回 JSON 的正确方法

    因此 我们可以尝试获取以下 JSON 对象 curl i X GET http echo jsontest com key value anotherKey anotherValue HTTP 1 1 200 OK Access Contr
  • Vue 3:为什么我的可组合项不是响应式的?

    我想在另一个可组合项中使用一个可组合项 我的第一个可组合项基本上是 Vuex 的超轻量级版本 import reactive readonly from vue const state reactive settings loading t
  • 在Python中使用“for”计算索引

    我需要在Python中做同样的事情 for i 0 i lt 5 i cout lt lt i 但我不知道如何在Python中使用FOR来获取列表中元素的索引 如果您有一些给定的列表 并且想要迭代其项目and索引 您可以使用enumerat
  • 捕获与量词正则表达式匹配的组

    我是正则表达式世界的新手 我需要捕获一些不同类型的字符串 顺便说一下 请建议更优雅的方式来捕获此类字符串 n 任意正数 不相同 n 0 0 0 0 n n 0 0 0 n n n 0 0 n n n n 0 n n n n n 我尝试使用这
  • 从剪贴板上传图片到服务器

    我寻找解决方案很长时间 但找不到任何解决方案 是否有可能将图片从剪贴板上传到服务器上的文件 通过按 ctrl v 它可以适用于 Chrome 使用 PHP Javascript jquery 或者其他什么 一些 Chrome 的外部扩展 多
  • cucumber.js 并且不是一个函数

    我正在练习使用 cucumber js 通过 BDD 编写一些单元测试 当我尝试使用 And 语句时 该错误表明 TypeError And is not a function 这是我的代码 feature Feature dataTabl
  • 从 XML 文件获取子节点

    我有一个如下所示的 XML 文件
  • 将多个 csv 文件合并为一个 csv 文件

    我正在尝试将多个 csv 文件合并为一个 并尝试了多种方法 但我很挣扎 我从多个 csv 文件导入数据 当我将它们一起编译成一个 csv 文件时 似乎前几行填充得很好 但随后它开始在行之间随机输入可变数量的空格 并且它永远不会填写完合并的
  • 如何为ant任务创建嵌套元素?

    是否可以为任何 ant 任务创建嵌套元素 例如
  • 解析来自远程网站的 xml 数据

    我想解析来自远程网站的xml数据http services faa gov airport status IAD format xml http services faa gov airport status IAD format xml
  • Visual Studio 2019打开解决方案文件不兼容

    我想我正在使用 Visual Studio 2017 并编写了一个 SSIS 包 现在我安装了Visual Studio 2019 但无法打开解决方案文件 错误 不支持 此版本的 Visual Studio 无法打开 以下项目 项目类型可能
  • Azure Functions 的身份验证

    我花了 24 小时阅读有关如何创建 Azure Functions 的所有内容 并成功将 MVC WebApi 转换为具有多个功能的新 Function App 我的问题是 我没有找到任何关于如何使用它们进行最基本的身份验证的明确文档或教程
  • 为什么没有与 new/delete 系列等价的 realloc?

    正如标题所说 我知道没有与 C 相当的东西realloc in the new delete经营者家族 我已经找到了this https stackoverflow com questions 67225388 implementing c
  • 使用 Tkinter 实现密码对话框

    我正在尝试实现一个获取用户密码的对话框 我已经创建了班级PasswordDiaglog继承自tk Toplevel但这会导致其执行不阻塞父框架的问题 import Tkinter as tk class PasswordDialog tk
  • 启动 TaskHost.exe 失败,尝试运行 Windows Phone 8 应用程序?

    我的 VS 2013 设置已经运行良好几个月了 今天我尝试更新到 Visual Studio 2013 Update 2 RC 就像上次我更新到 Update 1 时一样 安装程序严重失败 并出现大量标有 哈希值不正确 错误的软件包 不幸的
  • 从 PHP 和设置权限在 phpBB3 中创建论坛

    我正在尝试在现有论坛上创建一个新论坛 我可以非常轻松地创建新论坛并从管理控制台查看它 问题是我也需要它向用户显示在前端 这是通过权限完成的 因此 我试图做的是将父论坛 公开的 的权限复制到我创建的论坛 然而 该论坛似乎仍然没有出现在面向公众