介绍
在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}
<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}" />
<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演示中学到的。 继续阅读下一部分,了解如何使用扩展功能进行更多操作。