来源:http://trac.seagullproject.org/wiki/Tutorials/HelloWorld

创建一个用来显示"hello world"字符串的简单模块

  • 要求 >= Seagull 0.6.0

介绍

Seagull包含了一个用来生成模块的工具,你可以在管理面板中的'General'区段中找到它。它会生成创建一个模块所需的所有必要的框架文件。但是,本文将通过手工创建这些文件以让大家更好的理解整个过程。

创建必须的文件夹和文件

Seagull中的所有功能是由模块集合在一起。模块包含很多资源。本文的目的是只创建在一个页面上输出'Hello World'所必须的最少资源。

在modules目录中,创建一个helloworld目录,并在该目录中创建classes,template,data目录。你会得到这样的一个目录结构:

|-- [modules]
|   |-- [helloworld]
|   |   |-- [classes]
|   |   |-- [data]
|   |   `-- [templates]

首先要创建一个处理请求的文件,将其命名为HelloWorldMgr.php。事实上,对一种给定的数据类型的修改或显示处理的一组相似动作的功能是通过一个称为manager的类实现的。如,你可能想添加,编辑,删除FAQs,这样的代码会被组织在一个称为FaqMgr.php的类里面。如果你觉得它好像就是一个控制类,那么你完全是对的,而且在将来的某些时候managers有可能重新被命名为controllers。

在classes文件夹中创建HelloWorldMgr.php,定义HelloWorldMgr类,继承SGL_Manager。

<?php
class HelloWorldMgr extends SGL_Manager
{
    // ...
}
?>

如果你使用的是MySQL数据库,那么在data目录中创建一个data.default.my.sql文件。将下列这些代码放在里面:

INSERT INTO module VALUES ({SGL_NEXT_ID}, 1, 'helloworld', 'Hello World', 'A ''Hello World'' test module.', '', '', 'Alouicious Bird', NULL, 'BSD', 'alpha');

最后,在该模块的根目录中,创建一个conf.ini文件,每一个模块都必须有一个配置文件因为配置文件实现了manager名和URI之间的映射。最后整个目录结构应该是这样的:

|-- [modules]
|   |-- [helloworld]
|   |   |-- [classes]
|   |   |   `-- HelloWorldMgr.php
|   |   |-- [data]
|   |   |   `-- data.default.my.sql
|   |   |-- [templates]
|   |   `-- conf.ini

在ini文件中,输入下列这行代码以实现简单映射:

[HelloWorldMgr]

这样就避免了PHP4中的类名大小写敏感问题。

注册模块

出于安全因素考虑,即使模块的文件存在,如果没有注册前端控制器也不会调用它。要注册一个模块,先有管理员登陆,选择General → Manage Modules菜单项,然后选中显示末安装模块复选框。接着单击Action列下面的+号。要注册一个模块先要将一条记录插到modules表,所有如果有需要的话你可以手工调整一个模块的状态。

现在让我们来注册我们的helloworl模块:

  • 以管理员登陆
  • 选中显示末安装的模块复选框
  • 单击helloworld旁边的‘+’

你将收到下列消息:

The helloworld module was successfully installed

请求你的管理类

下一步是在浏览器中调用管理类,格式如下:

http://your-site.com/seagull/index.php/moduleName/managerName/

所有尝试

http://your-site.com/seagull/index.php/helloworld/HelloWorldMgr/

如果你得到了一个标准的Seagull页面,带有一个header和footer,一引起版块,那么就正常。URI的格式是很灵活的:

http://your-site.com/seagull/index.php/helloworld/HelloWorld/

http://your-site.com/seagull/index.php/helloworld/helloworld/

最后一种格式是最常用的,去掉了Mgr并且使用小写类名。

最后,如果你的模块名是'foo',你的管理类是FooMgr,和上面一样,你可以省略管理类名,下列这些URI都能正常使用:

http://your-site.com/seagull/index.php/helloworld/

现在就试一试吧。这种情况下你可以把HelloWorldMgr作为模块的默认管理类。

添加一些数据

在做了所有准备后,现在应该来输出”Hello World!”字符串。最直接的方式是将下列方法添加到HelloWorldMgr类中:

function display(&$output)
{
    print 'Hello World!';
}

每一个管理类都可以有一个display方法,它会在被请求的行为方法调用完后被调用。我们的目的是在这个方法中直接输出Hello World ,作为将它发送给模板的对比。

刷新浏览器你会看到Hello World笨拙地显示在页面的header中,这是因为我们直接输出到标准输出,我们的下一步是将字符串发送给模板这样它就能在页面中间显示。

  • 注意:由于PHP版本的不同你可能会碰到许多错误'Cannot modify header information'。在最新PHP版本中默认启用输出缓冲,但是你可以通过General → Configuration设置'output buffering'为yes并保存来达到一样的效果。

创建模板

在模板目录中创建一个helloWorld.html文件,这时你的目录结构应该是这样的:

|-- [modules]
|   |-- [helloworld]
|   |   |-- [classes]
|   |   |   `-- HelloWorldMgr.php
|   |   |-- [data]
|   |   |   `-- data.default.my.sql
|   |   |-- [templates]
|   |   |   `-- helloWorld.html
|   |   `-- conf.ini

在文件中添加一个变量,在Flexy中所有的变量必须用大括号包含:

{testVariable}

Putting it all Together

为让解析模板并实现变更的替换,你还需要做:

 1. 告诉管理类要解析哪个模板
 2. 将hello world赋给$output变量 

做完之后你的类应该是这样的:

class HelloWorldMgr extends SGL_Manager
{
    function display(&$output)
    {
        $output->template = 'helloWorld.html';
        $output->testVariable = 'Hello World!';
    }
}

结果应该是这样的:

http://seagullfiles.phpkitchen.com/images/helloWorld.png

下载代码

你可以从这里下载代码

更多资料

接下来我们将涉及到使你的模块更具弹性的更多的技术:

  • 处理多种行为
  • 验证请求数据
  • 身份验证
  • 权限检查
  • 用多种语言显示界面
  • 创建一个自定义层
  • 添加你的版块
  • 将你的模块集成到站点导航栏
  • 使用Data Access层
  • 使用Seagull库
 
tutorials/helloworld.txt · 最后更改: 2010/05/30 00:21 (外部编辑)
 
Except where otherwise noted, content on this wiki is licensed under the following license:GNU Free Documentation License 1.2