9.3. 模块创建,公共部分

我们继续使用第 9.2 节中的 Topolino 示例,创建一个非常简单的模块,显示 Topolino 的 GIF 图片以及用户可编辑的 3 个预定义名称列表。这是一个无意义的模块,但它足够简单,每个人都能理解。我们将使用的数据库是 MySQL,但通过更改一些细节,该示例适用于所有数据库。首先,让我们看看我们将构建的每个模块的骨架

<?php
if (!eregi("modules.php", $PHP_SELF)) {
die ("You can't access this file directly...");
}
$index = 1;
require_once("mainfile.php");
$module_name = basename(dirname(__FILE__));
get_lang($module_name);
include("header.php");
include("footer.php");
?> 

Important

在进行任何操作之前,必须创建一个名为 "modules/Topolino" 的文件夹,我们刚刚创建的文件(以及其他内容)必须命名为 index.php,并且必须放在该文件夹中。

我们在数据库中创建一个名为 nuke_topolino 的表,其结构如下

我们手动插入(使用 PHPMyAdmin - 参见第 11.3 节 - 或等效的界面)我们感兴趣的 3 个人的姓名,参见图 9-1(为了简单起见,该模块不允许您添加或取消人员,而只允许编辑已存在的人员)。

图 9-1. PHPMyAdmin:插入值

PHPMyAdmin:插入值

Note

可以在每个函数的末尾包含页脚。这是一个稍微复杂的解决方案,因为我们必须编写更多的行,但我必须强调有多少模块使用它。

一旦 DB 表准备就绪,我们就可以开始享受创建代码的乐趣,这些代码将返回我们的输出。我们的输出将是一个简单的查询,其中包含一个循环,该循环将返回数据库中插入的值(世界上最简单的事情,天哪!)。

Caution注意!!!
 

为了保持 DB 的抽象性,使其能够在各种数据库中独立工作,我们不能使用通常被 MySQL 爱好者使用的经典 PHP 语法 ;-),相反,我们必须使用 include/sql_layer.php 文件中所示的语法

我们将编译的查询结构如下

$resultpersons = sql_query("SELECT idperson, nameperson FROM "$prefix."_topolino", $dbi);
for ($m=0; $m < sql_num_rows($resultpersons, $dbi); $m++)
{
list($idperson, $nameperson) = sql_fetch_row($resultpersons, $dbi);
echo "$idperson - $nameperson < br >";
}

非常简单,不是吗?好的!在进入此模块的管理员界面之前,我们将开始修改它,目的是赋予它最起码的风格尊严。

我建议

我们可以通过渲染所有与 PHP-Nuke 多语言系统兼容的模块来做到这一点:我们定义将组成我们需要的两个短语的抽象,在 lang-english.php 文件中,我们必须插入

<?php
define("_BENVETOPOMOD", "Topolino Module, Welcome!");
define("_DESCRITOPOMOD", "This is an example module that serves to illustrate how a PHP-Nuke module is created");
>

记住在我们的语言文件夹中插入一个名为 index.htm 的文件!我们需要它来保护该文件夹内部免受不必要的导航。我们几乎到了前端部分的末尾,现在我们必须将样式部分插入到我们创建的代码中,并将所有内容组装起来。我们取出之前构建的两个代码片段(初始代码片段和我们创建的代码片段),并将样式修改连接起来

<?php if (!eregi("modules.php", $PHP_SELF)) 
{ die ("You can't access this rows directly..."); } 
$index = 1; require_once("mainfile.php"); 
$module_name = basename(dirname(__FILE__)); 
get_lang($module_name); 
include("header.php"); 
echo "<br>"; 
echo""._BENVETOPOMOD.""; 
echo "<br><br>"; 
opentable();
echo "<br>"; 
echo""._DESCRITOPOMOD.""; 
echo "<br><br>"; 
$resultpersons = sql_query("SELECT idperson, nameperson FROM ".$prefix."_topolino", $dbi);
for ($m=0; $m < sql_num_rows($resultpersons, $dbi); 
$m++) { list($idperson, $nameperson) = sql_fetch_row($resultpersons, $dbi); echo "$idperson - $nameperson <br>";
} 
closetable();
include("footer.php");
?>

我们只添加了文本、一些用于标题的换行符以及 "Opentable();" 和 "Closetable();" 来包含文本。结果可以在图 9-2中看到

图 9-2. 示例模块

示例模块