6.phpBB Extension Modules

技术百科 admin 发布时间:2024-03-19 浏览:16 次

介绍

在phpBB中,您可以为用户,版主和管理控制面板创建自己的模块。 这种模块化方法比从头创建设置页面有许多优点:

您可以管理ACP中的模块。

您不必直接处理授权。

您将获得内置于系统的导航树。

模块模板已经包含分页,导航痕迹和确认消息等功能。

本教程解释:

创建控制面板模块

安装控制面板模块

注意

本教程介绍如何创建ACP模块。 要创建MCP或UCP模块,通常只需要将所有出现的“acp”替换为“mcp”或“ucp”。

创建控制面板模块

一个模块需要三个文件:

模块信息

模块类

模块模板

模块信息

模块信息类只包含一个返回描述模块的信息数组的方法。 信息,如模块的名称,可用的模式和所需的权限。

该文件必须始终以* _info.php结尾,并应存储在扩展名的acp /文件夹中。 对于本教程,我们将使用ext / acme / demo / acp / main_info.php:

<?php namespace acme\demo\acp; class main_info { public function module() { return array( filename => \acme\demo\acp\main_module, title => ACP_DEMO_TITLE, modes => array( settings => array( title => ACP_DEMO, auth => ext_acme/demo && acl_a_board, cat => array(ACP_DEMO_TITLE), ), ), ); } }

main_info类只有一个方法module()返回一个包含以下信息的数组:

文件名 为模块类的完全名称间隔的路径,以前导斜杠开头。

title ACP模块管理部分显示的模块标题的语言密钥。

模式 包含模块的一系列模式。 有关详细信息,请参阅下表。

请注意,我们已经使用以下信息定义了一个名为settings的模式:

itle ACP模块管理部分显示的模式标题的语言密钥。

auth 用于控制访问模式的授权密钥。 扩展供应商/名称acme / demo是必需的,以确保扩展启用。 我们也可以指定用户在这种情况下必须具有a_board权限。

cat 引用模式所属的父类。 通常应包含父类别的语言密钥。

模块类

模块类包含模块的实际代码。 该文件也将存储在扩展名的acp /文件夹中。 对于本教程,我们将使用ext / acme / demo / acp / main_module.php:

<?php namespace acme\demo\acp; class main_module { public $u_action; public $tpl_name; public $page_title; public function main($id, $mode) { global $language, $template, $request, $config; $this->tpl_name = acp_demo_body; $this->page_title = $language->lang(ACP_DEMO_TITLE); add_form_key(acme_demo_settings); if ($request->is_set_post(submit)) { if (!check_form_key(acme_demo_settings)) { trigger_error(FORM_INVALID); } $config->set(acme_demo_goodbye, $request->variable(acme_demo_goodbye, 0)); trigger_error($language->lang(ACP_DEMO_SETTING_SAVED) . adm_back_link($this->u_action)); } $template->assign_vars(array( ACME_DEMO_GOODBYE => $config[acme_demo_goodbye], U_ACTION => $this->u_action, )); } }

模块本身必须包含一个main($ id,$ mode)方法,它将数据库中的模块的id和模式称为参数。

在main方法的代码中,我们首先设置用于渲染模块的Module模板文件的名称,并为页面标题分配一个语言密钥。

为了加强对安全漏洞的形式,我们使用表单密钥检查来验证提交的表单是否有效。 这可以通过在显示表单时调用add_form_key(acme_demo_settings),然后在提交表单时检查表单键:

if (!check_form_key(acme_demo_settings)) { trigger_error(FORM_INVALID); }

警告

表单键对于每个表单应该是唯一的。 密钥可以是任何字符串值,但扩展名应包括其供应商和扩展名。

如果表单键通过,我们将配置值设置为提交的值,并向用户显示成功消息:

$config->set(acme_demo_goodbye, $request->variable(acme_demo_goodbye, 0));

trigger_error($language->lang(ACP_DEMO_SETTING_SAVED) . adm_back_link($this->u_action));

在方法结束时,我们分配两个模板变量。 第一个包含配置值的当前值。 第二个包含保存当前窗体操作的URL的u_action类属性。

模块模板

我们的ACP模块现在需要我们在Module类中分配给它的模板文件。 我们将使用ext / acme / demo / adm / style / acp_demo_body.html。

注意

ACP与MCP和UCP不同之处在于它有自己的风格。 MCP和UCP使用主板风格,即凶手。 因此,ACP模板文件必须存储在./adm/style/中,而MCP和UCP模板文件存储在./styles/prosilver/template/中。

<!-- INCLUDE overall_header.html --> <h1>{L_SETTINGS}</h1> <form id="acp_board" method="post" action="{U_ACTION}"> <fieldset> <dl> <dt><label for="acme_demo_goodbye">{L_ACP_DEMO_GOODBYE}</label></dt> <dd><input type="radio" class="radio" name="acme_demo_goodbye" value="1" <!-- IF ACME_DEMO_GOODBYE -->checked="checked" <!-- ENDIF -->/> {L_YES} &nbsp; <input type="radio" class="radio" name="acme_demo_goodbye" value="0" <!-- IF not ACME_DEMO_GOODBYE -->checked="checked" <!-- ENDIF -->/> {L_NO}</dd> </dl> <p class="submit-buttons"> <input class="button1" type="submit" id="submit" name="submit" value="{L_SUBMIT}" />&nbsp; <input class="button2" type="reset" id="reset" name="reset" value="{L_RESET}" /> </p> {S_FORM_TOKEN} </fieldset> </form> <!-- INCLUDE overall_footer.html -->

此模板通过两个单选按钮和两个输入按钮提交或重置表单,单个选项可以切换acme_demo_goodbye设置。 请注意,作为表单密钥安全检查的一部分,需要{S_FORM_TOKEN}模板变量。

模块语言键

在我们的模块类和模板文件之间,我们添加了一些新的语言键。 我们可以在acme / demo / language / en / demo.php中将它们添加到我们的语言数组中:

ACP_DEMO_TITLE => Demo Module, ACP_DEMO => Settings, ACP_DEMO_GOODBYE => Should say goodbye?, ACP_DEMO_SETTING_SAVED => Settings have been saved successfully!,

注意

回想一下,我们通过在事件监听器中的core.user_setup事件在phpBB中加载我们的语言文件。 由于我们不建议这样做,所以在ACP中自动加载语言文件的另一种方法是使用info_acp _ *。php为模块语言键或许可语言密钥的权限_ *。php前缀文件名。

安装控制面板模块

该模块现在完成,但它不会显示在ACP中。 要在启用分机时将模块安装到数据库,我们需要一个迁移。

迁移文件必须存储在扩展名的迁移/文件夹中。 对于Acme演示,我们需要一个将安装以下数据的迁移:

名称为acme_demo_goodbye的配置值,可由管理员设置。

ACP模块数据。

<?php namespace acme\demo\migrations; class add_module extends \phpbb\db\migration\migration { /** * If our config variable already exists in the db * skip this migration. */ public function effectively_installed() { return isset($this->config[acme_demo_goodbye]); } /** * This migration depends on phpBBs v314 migration * already being installed. */ static public function depends_on() { return array(\phpbb\db\migration\data\v31x\v314); } public function update_data() { return array( // Add the config variable we want to be able to set array(config.add, array(acme_demo_goodbye, 0)), // Add a parent module (ACP_DEMO_TITLE) to the Extensions tab (ACP_CAT_DOT_MODS) array(module.add, array( acp, ACP_CAT_DOT_MODS, ACP_DEMO_TITLE )), // Add our main_module to the parent module (ACP_DEMO_TITLE) array(module.add, array( acp, ACP_DEMO_TITLE, array( module_basename => \acme\demo\acp\main_module, modes => array(settings), ), )), ); } }

也可以看看

要了解有关迁移的更多信息,请参阅Migrations文档。

此时我们完成了Acme演示扩展! 然而,有更多的扩展可以做,而不是我们从Acme演示中学到的。 继续阅读下一部分,了解如何使用扩展功能进行更多操作。

在线咨询

点击这里给我发消息售前咨询专员

点击这里给我发消息售后服务专员

在线咨询

免费通话

24h咨询:400-888-8888


如您有问题,可以咨询我们的24H咨询电话!

免费通话

微信扫一扫

微信联系
返回顶部