zentaoPHP框架手册

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

zentaoPHP框架手册
目录
1、框架介绍 (3)
1.1、关于zentaoPHP框架 (3)
1.1.1、zentaoPHP框架的缘起 (3)
1.1.2、zentaophp框架的特点 (3)
1.2、zentaophp框架的主要功能 (4)
1.2.1、单一入口模式 (4)
1.2.2、MVC模式 (4)
1.2.3、支持GET和PATH_INFO两种方式调用 (5)
1.2.4、内置数据库访问层DAO (5)
1.2.5、支持跨模块之间的调用 (5)
1.2.6、无需路由配置,即可获得简捷的URL (5)
1.2.7、灵活的数据验证机制 (6)
1.2.8、配置和语言可以通过对象方式引用 (6)
1.2.9、方便的全局变量应用 (6)
1.2.10、所见即API (6)
1.2.11、内置多语言支持 (6)
1.2.12、强大的扩展机制 (6)
1.3、zentaophp框架授权协议 (7)
2、框架安装 (7)
2.1、zentaoPHP框架系统要求 (7)
2.2、zentaoPHP框架安装 (8)
2.2.1、安装apache, mysql, php的运行环境 (8)
2.2.2、获取最新的zentaoPHP框架 (8)
2.2.3、安装zentaoPHP框架 (8)
2.2.4、建立demo数据库 (8)
2.2.5、生成配置文件 (8)
2.2.6、访问demo应用 (9)
3、快速入门 (10)
3.1、简单的Hello world! (10)
3.1.1、了解框架目录结构 (10)
3.1.2、创建hello模块 (11)
3.1.3、创建control.php文件 (11)
3.1.4、访问helloworld应用 (11)
3.2、使用MVC实现的hello world! (11)
3.2.1、仅有control.php的hello world. (12)
3.2.2、有model层的hello world. (12)
3.2.3、带有view层的hello world. (13)
3.3、部署框架自带的简单的blog示例 (14)
3.3.1、创建数据库 (14)
3.3.2、创建应用的配置文件 (15)
3.3.3、访问blog应用 (15)
4、框架基础 (16)
4.1、zentaoPHP框架里面的基本概念 (16)
4.1.1、router (16)
4.1.2、app (17)
4.1.3、config, lang, dbh (17)
4.1.4、URI,module,control, model and view (17)
4.2、zentaoPHP框架的两种请求方式 (18)
4.2.1、传统GET方式 (18)
4.2.2、静态友好方式 (18)
4.3、如何生成链接 (19)
4.3.1、$this->createLink()方法 (19)
4.3.2、helper::createLink()方法 (20)
4.3.3、JS版本的createLink()方法 (20)
4.4、框架里面提供的html, js和css类 (20)
4.4.1、html类 (20)
4.4.2、JS类 (21)
4.4.3、css类 (22)
5、深入框架 (22)
5.1、zentaoPHP目录结构 (22)
5.1.1、顶级目录结构 (22)
5.1.2、具体到一个模块的目录结构 (22)
5.2、zentaoPHP框架提供的DAO功能 (23)
5.2.1、关于DAO的说明 (23)
5.2.2、执行方法的区别 (23)
5.2.3、操作符说明 (24)
5.2.4、查询语句: (24)
5.2.5、插入语句 (25)
5.2.6、更新语句 (26)
5.2.7、REPLACE语句 (26)
5.2.8、删除语句 (26)
5.3、zentaoPHP框架的分页解决方案 (27)
5.3.1、browse方法关于分页的三个参数 (27)
5.3.2、model方法中调用pager对象 (27)
5.3.3、control中将pager对象赋值给模板 (28)
5.4、zentaoPHP框架中的数据验证机制 (28)
5.4.1、验证规则放在什么地方? (29)
5.4.2、zentaoPHP框架验证机制说明 (29)
5.4.3、数据修正 (29)
5.4.4、数据检查 (30)
5.4.5、获得错误 (31)
5.4.6、数据修正和数据检查方法附录 (31)
1、框架介绍
1.1、关于zentaoPHP框架
1.1.1、zentaoPHP框架的缘起
2009年我们决定开始启动禅道项目管理软件的开发,编程语言自然选择了一直使用的PHP。

但在开发框架的选择上,颇费了一番功夫。

09年的时候,php5.2系列的版本oop的功能已经比较强大,市面上也出现了一大批的框架。

比如cakephp, symfony, zend framework, codeignightor等等。

仔细的研究这些框架之后,最符合我们要求的是codeignightor这个框架,概念简单,文档丰富。

但遗憾的是这个框架是基于php4面向过程的语法实现的,导致它的很多实现并不是很合理。

考虑到我们后续产品的发展,我们决定自己来开发一款框架。

于是2009年3月1日,发布了第一个版本。

1.1.2、zentaophp框架的特点
zentaophp框架的定位主要是b/s架构的应用开发,它不是一款全能型的框架,主要的目的还是服务我们团队自己的产品研发。

因此和其他的框架相比,它有很强的特点:
(1)代码简单
框架的核心只有四个文件,分别为调度类router.class.php,control类
control.class.php,model类model.class.php和工具类helper.class.php。

代码的实现也比较简单,有能力的开发者可以很容易在框架基础上进行扩展,增加自己的功能。

(2)性能良好
zentaoPHP框架在实现过程中,十分重视性能。

在保证功能的前提下面,尽可能的提升程序执行效率。

(3)结构清晰
使用ZenTaoPHP框架来开发应用,其目录结构简单清晰,维护起来非常的方便。

(4)开发友好
框架,首先是一个框,把你框在了里面。

所以很多框架会有很多的约定,你要怎样,你要怎样。

还有很多隐形的约定,比如你要在你的代码里面写很多的xxxx之类的东东。

我觉得一个好的框架在实现功能的前提下,应当尽量兼顾开发人员之前的开发习惯,所以zentaoPHP框架在这方面花了大量的力气:
(5)中性命名:框架实现时,没有出现什么zentao之类的命名,完全是中性的命名:router, control, model, config, lang。

(6)配置对象化:配置项可以通过对象的方式来引用,$config->db->user,要比$config['db']['user']简洁顺畅的多。

(7)相对路径包含:所有的路径都可以用相对路径来进行包含,这样可以很清晰的知道目录结构和代码之间的关系。

1.2、zentaophp框架的主要功能
zentaoPHP框架的主要功能如下:
1.2.1、单一入口模式
单一入口是现在比较流行的开发方式。

好处在于可以有一个集中的控制。

或者讲框架一个比较基本的东西也是单一入口吧。

现在ZenTaoPHP框架支持web方式和命令行方式的两种入口文件。

具体的例子大家可以查看app目录下面的demo/www/index.php和cli/call这两个文件。

1.2.2、MVC模式
ZenTaoPHP支持MVC方式的开发。

不过相比较于其他框架的多种模板实现来讲,ZenTaoPHP并没有尝试去开发一套新的模板系统,而是采用PHP作为模板语言。

这是最快的一种解决方案,而且也是最简洁的一种方案。

1.2.3、支持GET和PATH_INFO两种方式调用
支持 index.php?m=user&f=info&id=123这种GET方式的调用,也支持
/user/info/123.html 这种方式的调用。

如果你能控制你的运行环境,可以使用PATH_INFO 的方式,这样生成的URL地址更加简捷,而且对搜索引擎十分友好。

1.2.4、内置数据库访问层DAO
禅道框架内置了DAO数据库访问层,在PDO的基础上,提供了完整的SQL拼装功能,可以非常方便的书写SQL查询语句,获取数据。

而且我们在实现DAO的时候,花了很大的力气在兼容之前大家手写SQL的习惯,所以大家在使用禅道框架的DAO的时候,会发现很亲切,因为和手写SQL基本上是相同的。

1.2.5、支持跨模块之间的调用
在ZenTaoPHP框架中,一个模块的control或者model都可以直接调用另外一个模块的model,这样就可以将一个应用进行模块化,然后通过采用不同模块的功能,来实现比较复杂的功能。

除了model的调用之外,一个模块的control还可以fetch另外一个模块的control
方法,这种一般用于一些共用的页面元素,比如打印一个搜索表单,或者打印菜单等等。

通过control之间的互相调用,实现代码的共享。

1.2.6、无需路由配置,即可获得简捷的URL
ZenTaoPHP框架提供了简洁的参数传递方式。

比如user模块有一个read方法,需要id 和name两个参数,通常的PATH_INFO为user/read/id/1/name/wwccss.html,而zentaoPHP 支持user/read/1/wwccss.html的形式,这样就省略了参数名的传递。

这一切,都不需要配置任何的路由,直接通过框架的功能就可以获得。

1.2.7、灵活的数据验证机制
禅道PHP框架内置了灵活的数据验证机制,可以实现对数据的修正和检查,代码极其紧凑,简洁。

1.2.8、配置和语言可以通过对象方式引用
zentaoPHP框架的配置没有用什么ini文件,也没有用什么yaml文件,也没有用php 的数组,而是直接用PHP对象的形式。

这样配置文件不需要解析,就可以直接使用,而且引用起来十分的方便。

形如$config->db->host的这种方式,而不是$config['db']['host']的这种方式。

书写起来会非常的流畅!
1.2.9、方便的全局变量应用
在zentaoPHP框架中,引用GET,POST, SERVER这样的全局变量,可以通过这样的方式:$this->get->userName, $this->post->userName, $this->server->remote_addr。

1.2.10、所见即API
在现在开放平台的潮流下面,有一个非常好的api机制是比较重要的。

在zentaoPHP 框架中,每一个接口都可以成为api。

至于api的方式,是通过其访问的扩展名来加以区分。

比如如果你访问的是user/read/id/123.html,那么返回的是正常的网页。

如果访问的是user/read/id/123.json,那么返回的就是json格式的数据。

1.2.11、内置多语言支持
zentaoPHP框架支持多种语言功能,会自动根据当前用户客户端的信息来判断使用何种语言,这样可以方便大家开发多语言的应用。

1.2.12、强大的扩展机制
zentaoPHP框架实现了强大的扩展机制。

通过这套扩展机制,做定制开发可以说是轻而易举,再也不用担心维护多个分支带来的痛苦了。

1.3、zentaophp框架授权协议
zentaoPHP框架最开始的授权协议是LGPL。

LGPL协议对大家的使用还是有一些限制的,尤其是对一些商用。

所以我们做了一个决定,从2.1版本开始,彻底将zentaoPHP代码的版权捐献出来,以public domain协议发布!简单来讲,任何人或者任何单位可以用ZenTaoPHP 框架做任何的使用,而没有任何的限制。

包括重新发布,改名,商用,等等。

/**
* The control class file of zentaoPHP framework.
*
* The author disclaims copyright to this source code. In place of
* a legal notice, here is a blessing:
*
* May you do good and not evil.
* May you find forgiveness for yourself and forgive others.
* May you share freely, never taking more than you give.
*/
2、框架安装
2.1、zentaoPHP框架系统要求
zentaoPHP框架是基于php5版本的oop特性开发的,不兼容php4版本。

所以在您使用zentaoPHP框架之前,请确认您的环境满足下面的要求:
(1)web server最好是apache。

因为它和php集成使用是最稳定,功能也是最齐全的一套组合;
(2) PHP最低版本是5.2版本。

(3)数据库目前只支持MySQL,版本4.x以上。

现在amp组合的安装比以前已经简单多了。

windows下面的用户可以考虑使用xammp。

linux下面的用户直接使用包管理进行安装就好了。

比如debian下面的apt,红帽下面的rpm, yum。

FreeBSD的用户可以直接使用ports安装,也是非常方便的。

2.2、zentaoPHP框架安装
2.2.1、安装apache, mysql, php的运行环境
首先要确认你的机器上面已经安装好了apache, mysql, php的运行环境。

而且符合zentaoPHP框架的系统要求。

2.2.2、获取最新的zentaoPHP框架
从下载最新的zentaoPHP框架。

目前是以zip格式提供的。

2.2.3、安装zentaoPHP框架
将下载下来的zip文件解压缩到一个目录,比如/var/www/zentaophp。

解压之后,里面有一个framework, module, lib的目录。

其中你要开发的应用程序要放在module目录下面。

2.2.4、建立demo数据库
在体验框架之前,需要先创建一个demo数据库。

可以使用phpmyadmin或者mysql的命令行来创建这个数据库。

然后到db目录,找到blog.sql文件,生成blog表。

2.2.5、生成配置文件
到config目录下面,把my.example.php复制一份,复制成my.php,修改里面的数据库的访问参数。

<?php
$config->installed = true;
$config->debug = true;
$config->requestType = 'PATH_INFO'; // PATH_INFO or GET.
$config->requestFix = '-'; $config->webRoot = '/';
$config->db->host = 'localhost';
$config->db->port = '3306';
$config->db->name = 'demo';
$config->db->user = 'root';
$config->db->password = '';
主要要修改host, port, name, user, password这些参数。

2.2.6、访问demo应用
通过浏览器访问:http://localhost/zentaophp/,就可以看到框架运行的欢迎界面了。

备注:访问路径根据你实际的部署目录来加以修改。

localhost也根据需要换成实际的ip地址或者域名。

3、快速入门
3.1、简单的Hello world!
安装好框架之后,让我们来用框架来实现helloworld! 我们以框架代码部署在
/var/www/zentaophp为例:
3.1.1、了解框架目录结构
最新版本的框架对目录结构进行了简化。

解压缩zentaoPHP框架之后,你可以看到这个目录下面有如下文件:
其中config目录存储配置文件。

db目录存储的是demo演示所用的blog表的定义。

favicon.ico是网站小图标文件。

framework则是框架的核心目录,里面包含了router, control, model和helper的定义文件。

index.php是入口程序,所有的请求都经由index.php来进行转发。

js目录用来存放js脚本文件。

lib目录用来存放常用的类文件。

module则是模块目录,所有的功能模块都放在这个目录下面。

theme则用来放样式表和图片文件。

3.1.2、创建hello模块
下面我们在module目录创建hello模块。

cd module
mkdir hello
3.1.3、创建control.php文件
在hello目录下面生成一个control.php文件,里面写入下面的代码:
<?php
class hello extends control
{
public function world()
{
echo 'Hello, world!';
}
}
?>
3.1.4、访问helloworld应用
这时用浏览器访问:http://localhost/zentaophp/hello-world,就可以看到hellworld了。

如果config/my.php配置的访问方式是GET方式,访问路径是
http://localhost/zentaophp/?m=hello&f=world.
3.2、使用MVC实现的hello world!
在上一章中,我们实现了最简单的Hello world输出,在这一章里面,我们将向你展示如何利用mvc的结构来实现Hello world.
3.2.1、仅有control.php的hello world.
在上一个章节中,我们所实现的代码,实际上是在control里面直接输出了Hello world.
<?php
class hello extends control
{
public function world()
{
echo 'Hello world';
}
}
3.2.2、有model层的hello world.
现在稍微复杂一点,引入model。

我们来创建model文件:model.php。

<?php
class helloModel extends model
{
public function world()
{
return 'Hello world!';
}
}
现在control需要做一些改动:
public function world()
{
echo $this->hello->world();
}
框架会自动加载当前模块所对应的model类,并生成model对象,然后在control就可以通过$this->hello(也就是模块名)这样的形式来引用model中的各个方法了。

现在再来访问下http://localhost/zentaophp/hello-world,是不是同样可以显示出hello world!?
3.2.3、带有view层的hello world.
zentaoPHP框架对模板的命名约定如下:
(1)视图文件都存放在各个模块的view目录下面。

(2)视图文件的命名规则是方法名+模板名+.php。

比如我们要访问的index.html,那么对应的模板文件是index.html.php。

首先我们来修改下control文件。

public function world()
{
$this->view->helloworld = $this->hello->world();
$this->display();
}
然后我们来创建view/world.html.php,内容如下
<?php
echo $helloworld;
?>
control将model返回的变量赋值到视图文件。

然后调用display方法展示模板文件就可以了。

ok,这时再重新刷新访问,是不是可以呢?
走到这一步,恭喜你,你已经接触到了ZenTaoPHP框架最基础,最核心的东西了。

3.3、部署框架自带的简单的blog示例
zentaoPHP框架中自带了一个简单的blog示例,下面让我们来部署这个示例应用。

如果安装的时候已经初始化了数据库,跳过这一步。

3.3.1、创建数据库
在db目录下面,有一个blog.sql。

这是一个非常简单的表结构,使用phpmyadmin,或者是命令行的mysql工具,创建一个数据库,叫做blog,然后把这个sql文件里面的建表工具导入。

$> mysql -u root -p
$> create database blog;
3.3.2、创建应用的配置文件
在我们的代码中,已经内置了一个config.php文件,可以直接修改这个配置文件,但是我们建议的方式是创建一个my.php,将当前应用相关的配置在这个my.php文件中重新定义。

这样可以解决代码冲突的问题。

将config/my.example.php文件,复制为my.php,然后修改其中的数据库访问参数。

$config->debug = true; // 开发环境,可以将debug打开。

$config->requestType = 'PATH_INFO'; // 如果apache打开了mod_rewrite,可以用这个选项。

如果不行,则改用GET
$config->requestFix = '-'; // 路径分隔符。

$config->webRoot = '/zentaophp/'; // 当前应用的web访问路径。

$config->db->port = '3306';
$config->db->name = 'blog';
$config->db->user = 'root';
$config->db->password = '';
3.3.3、访问blog应用
http://localhost/zentaophp/blog/,即可看到界面了。

4、框架基础
4.1、zentaoPHP框架里面的基本概念
zentaoPHP框架的所有请求都是通过index.php来进行的。

它的基本原理是通过设置apache或者其他webserver,将所有的请求都转交给index.php。

index.php加载框架文件,初始化应用,然后分析请求,得到请求对应对模块名、方法和参数,然后加载相应模块的control方法,model方法,最后渲染模板,展示给用户。

基本的模型如下:
4.1.1、router
router在zentaoPHP框架中通常表现为index.php。

通过apache的配置文件,将某一个域名下面所有的请求解析到这个index.php文件。

然后由这个index.php来负责调度。

4.1.2、app
router会根据当前的请求来实例化一个具体的应用。

比如demo应用的index.php代码如下:
include './framework/router.class.php';
include './framework/control.class.php';
include './framework/model.class.php';
include './framework/helper.class.php';
$app = router::createApp('demo');
4.1.3、config, lang, dbh
当应用实例化之后,它会加载该应用的配置文件,生成$config对象。

然后会连接到数据库,生成$dbh对象。

然后会加载common模块的语言文件,生成$lang对象。

4.1.4、URI,module,control, model and view
当应用加载完配置文件和语言文件之后,它会解析当前的请求,也就是URI,得出要调用的模块及其方法、参数。

module就是应用的一个模块。

模块由control, model, view和lang文件组成。

control是module的控制文件,由它来负责组织各种业务逻辑(model),然后展示相应的视图(view)文件。

比如demo应用里面的blog模块的control类,分别定义了index, view, del, edit, add等几个方法。

相应的model类则定义了getList, getInfo, delArticle, add等几个方法。

4.2、zentaoPHP框架的两种请求方式
zentaoPHP框架共支持两种方式,一种是传统的GET方式,一种是静态友好的方式。

4.2.1、传统GET方式
可以在config/my.php里面设置requestType为GET来启用GET方式。

当打开GET方式之后,访问地址格式如下:
index.php?m=$moduleName&f=$methodName&$param1=$value1&param2=valur2&t=html
m: 代表模块名称,比如m=blog,则代表访问blog模块。

f: 代表要访问的模块control里面的方法名,比如f=edit,代表访问
blog/control.php里面定义的edit方法。

t: 代表模板类型,默认是html,比如f=edit&t=html,对应的模板文件是
blog/view/edit.html.php。

其他的都是参数,也就是变量中指定的方法的参数。

比如id=1,则代表最终调用
blog/control.php里面的edit方法,并向其传id=1的参数。

4.2.2、静态友好方式
静态友好方式需要webserver的url重写支持。

如果是使用apache作为webserver的话,框架已经自带了.htaccess文件,里面已经包含了url重写规则。

如果是nginx,需要配置下面的参数:
location /
{
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$
{
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $request_uri;
include modules-enabled/fastcgi.conf;
}
与此同时还需要修改config/my.php,把requestType设置成PATH_INFO。

还有一个变量分隔符,需要设置。

框架默认的是短横线:-。

比如访问http://localhost/zentaophp/blog/view/179.html:blog为模块名,view是方法名,179是参数,.html则代表了模板的类型。

4.3、如何生成链接
因为zentaoPHP框架有两种运行方式,所以在生成链接的时候,尽量不要手工拼写链接代码,通过调用系统提供的createLink方法,来生成链接。

4.3.1、$this->createLink()方法
比如,我们要生成一个blog模块的view方法的链接,需要传递参数为id=17,这样来调用:
echo $this->createLink('blog', 'view', 'id=17&cat=123')
第一个参数是模块名称,第二个参数是方法名,第三个参数是参数,使用
key1=value1&key2=value2这种方式来进行传参。

如果运行方式为PATH_INFO,这样会生成 blog-view-17-123.html这样的链接。

如果运行方式为GET,则生成?m=blog&f=view&id=17&cat=123&t=html的链接。

4.3.2、helper::createLink()方法
$this->createLink()方法,是可以在control和view里面直接调用的。

如果需要在其他地方调用,则可以使用helper::createLink(),参数是一样的。

4.3.3、JS版本的createLink()方法
另外,我们还提供了一个js版本的createLink()函数,用来在js交互中生成一些链接。

具体的代码,可以参考app/demo/www/js/my.js里面的定义。

不过在调用js版本的createLink()之前,需要调用下js::exportVars()方法,来输出下当前系统的配置参数。

4.4、框架里面提供的html, js和css类
禅道框架里面提供了一个front.class.php,里面内置了三个类,分别为html, js和css,用来生成一些html标签,创建简单的js交互。

4.4.1、html类
∙html::title($title) 生成$title标签。

∙html::meta($name, $value) 生成html的meta标签。

∙html::icon($url) 生成icon文件的调用代码。

∙html::rss($url, $title) 输出rss。

∙html::a($href, $title, $target, $misc),生成超链接。

∙html::mailto($mailto, $title) 生成mailto 链接。

∙html::select($name, $options, $selected, $attr),生成标签。

∙html::radio($name, $options, $selected, $attr), 生成单选按钮。

∙html::checkbox($name, $options, $selected, $attr),生成复选按钮。

∙html::input($name, $value, $attr) 生成文本框。

∙html::hidden($name, $value, $attr)生成隐藏变量。

∙html::password($name, $value, $attr)生成密码框。

∙html::textarea($name, $value, $attr)生成textarea
∙html::file($name, $attr)生成文件选择框。

∙html::submitButton($label, $attr) 生成提交按钮。

∙html::resetButton(),生成重置按钮。

∙html::commonButton($label, $attr) 生成一个普通的按钮。

∙html::linkButton($label, $link, $attr),生成一个带有链接的按钮。

4.4.2、JS类
∙js::import($url, $version) 生成一个js文件的调用。

version用来区分不同的版本,以避免客户端js文件不刷新的问题。

∙js::alert($message),生成一个警告框
∙js::error($errors),错误警告,$errors可以是数组。

∙js::confirm($message, $okURL, $cancelURL, $okTarget, $cancelTarget),选择提示。

∙js::locate($url, $target),跳转页面,target是要跳转的窗口。

∙js::closeWindow(), 关闭窗口。

∙js::refresh($url, $target, $timeout),刷新页面。

∙js::reload($window), 自动重载某一个窗口。

∙js::exportConfigVars(),将$config里面框架运行的必需信息输出到js中。

∙js::execute($code),执行某一段js代码。

4.4.3、css类
∙css:import($url, $version), 导入某一个css文件。

∙css::internal($css),生成code
5、深入框架
5.1、zentaoPHP目录结构
目录结构对于一个框架来讲是比较重要的。

我们一起来看一下ZenTaoPHP的目录结构。

5.1.1、顶级目录结构
config:配置文件所在的目录。

包含了config.php和my.php
db: demo应用所需要的blog.sql
framework:包含了框架的核心文件。

js:包含了js脚本文件。

lib:包含了常用的类文件。

module:模块目录,每个模块一个目录,存放在module目录下面。

theme:主题文件,包含了css文件和图片文件。

.htaccess: apache下面使用的url重写规则文件。

favicon.ico:小图标文件。

index.php:入口程序。

5.1.2、具体到一个模块的目录结构
config.php: 这个模块的配置文件,可以用来存放专门针对这个模块的配置,也可以覆盖全局性的配置。

lang: 存放各个语言的文件。

比如中文存为zh-cn.php,英语存为en.php,繁体存为zh-tw.php。

control.php 为这个模块对应的控制器类文件。

model.php 为这个模块对应的业务逻辑类文件。

view:存放的各个方法的视图文件。

比如index.html.php是index方法的模板文件
common模块需要特殊说明一下: common模块里面存储的是当前这个应用公用的语言文件、模板文件、model文件等。

比如lang/zh-ch.php将存储一些公用的语言文件。

header.html.php是模板公用的头文件。

footer.html.php是模板公用的页脚文件。

error.html.php则是公用的出错信息提示的模板文件。

5.2、zentaoPHP框架提供的DAO功能
5.2.1、关于DAO的说明
zentaoPHP并没有试着去实现ORM或者ActiveRecord这样的概念。

因为我们相信,框架要留给开发人员足够的自由发挥的空间,而不是所有的都要包办。

所以框架里面提供了一个简单方便的数据库访问对象类DAO。

并且我们在封装DAO的时候尽可能的兼容标准的sql 写法。

DAO类的定义在lib下面的dao.class.php中。

框架在加载的时候,会自动生成$this->dao对象,可以在control, model或者view层的代码中直接使用$this->dao来执行各种方法。

5.2.2、执行方法的区别
如果是查询类的语句,需要使用fetch系列的方法来返回数据。

更新,删除,替换这些方法可以使用exec()方法。

DAO在最后执行的时候,有下面的方法:
fetch(): 获得满足条件的第一次记录,返回的是对象格式。

fetch($filed):获得满足条件的第一个记录的字段$field对应的值。

fetchAll():获得满足条件的所有记录,以数组格式返回,索引为0-n
fetchAll($key): 获得满足条件的所有记录,并使用字段$key作为索引值。

fetchPairs($key, $value):返回键值对的列表。

如果不指定参数,则取返回记录中的第一个字段作为key,第二个字段作为value。

fetchGroup($group, $key):把满足条件的记录按照$group字段进行分组。

比如把所有$status=active的放在一起。

5.2.3、操作符说明
为了书写的方便,DAO类里面封装了若干操作符:
eq: equal,等于
ne: not equal,不等于
gt: great than, 大于
lt: llittle than, 小于
in: 介于一个列表中。

between: 在一个区间中。

notin:不在一个列表中。

like: 模糊匹配。

5.2.4、查询语句:
普通的查询:查询account=wwccss的记录。

$this->dao->select('*')
->from('user')
->where('account')
->eq('wwccss')
->fetch();
再复杂一点,加入andWhere (或者orWhere)
$this->dao->select('*')->from('user')
->where('id')->gt(10)
->andWhere('age')->lt(20)
->orderBy('id desc')
->limit('1,10')
->fetchAll()
左连接查询
$this->dao->select('t1.*,
t2.*')->from('user')->alias('t1')->leftJoin('userGroup')->alias('t2')->on('t1.a ccount = t2.account')->fetchAll();
其他便利的方法:
$this->dao->findByAccount($account)->from('user')->fetch(); // 魔术方法,按照account进行查询。

$this->dao->select('*')->from('user')->fetchAll('account'); // 返回的结果中,以account为key。

$this->dao->select('account, realname')->from('user')->fetchPairs(); // 返回account=>realname的键值对。

$this->dao->select('class, account,
realname')->from('user')->fetchGroup('class'); // 按照所属的class进行分组根据条件拼装SQL:beginIF, FI()
$this->dao->select('*')->from('user')->where('id')->gt(10)->beginIF($class == 'online')->andWhere('status')->eq('online')->fi()->fetchAll();
5.2.5、插入语句
使用一个data对象来更新。

data对象的key对应到数据表中字段名。

$user->account = 'wwccss';
$user->password = '123456';
$this->dao->insert('user')->data($user)->exec();
或者一个字段一个字段更新:
$this->dao->insert('user')
->set('account')->eq($account)
->set('password')->eq($password)
->exec();
获得最后插入的记录id
echo $this->dao->lastInsertID();
5.2.6、更新语句
更新语句和insert基本类似,可以使用一个data对象或者单个字段进行更新。

$user->name = 'wwccss';
$user->age = 10;
$this->dao->update('user')->data($user)->where('id')->eq($userid)->limit(1) ->exec();
$this->dao->update('user')
->set('account')->eq($account)
->set('password')->eq($password)
->exec()
5.2.7、REPLACE语句
replace也是需要定义一个data对象,然后调用replace方法。

需要注意的事replace 要保证表有主键或者唯一索引。

$this->dao->replace('user')->data($user)->exec();
5.2.8、删除语句
$this->dao->delete()->from('user')->where('id')->eq($userid)->exec();
5.3、zentaoPHP框架的分页解决方案
分页对于基于数据库的应用来讲,是很常见的一个问题。

最新的zentaoPHP框架中,提供了内置的分页功能。

使用如下:
我们以查询用户列表为例,在应用中建立一个user的模块,在其中的control文件中,定义一个browse方法,来完成分页的功能:
5.3.1、browse方法关于分页的三个参数
browse方法需要定义三个参数:recTotal, recPerPage, pageID,变量名是固定的。

public function browse($recTotal, $recPerPage, $pageID)
{
/* 加载分页类,并生成pager对象。

*/
$this->app->loadClass('pager', $static = true);
$pager = new pager($recTotal, $recPerPage, $pageID);
/* 将分页类传给model,进行分页。

*/
$users = $this->user->getList($pager);
}
5.3.2、model方法中调用pager对象
model中定义一个getList方法,接收pager对象,并在dao查询的时候,调用pager($pager)方法来生成分页语句。

public function getList($pager)
{
return $this->dao->select(*)->from('user')->page($pager)->fetchAll();
}
5.3.3、control中将pager对象赋值给模板
再回到control的browse方法中,将pager对象赋值给模板。

public function browse($recTotal, $recPerPage, $pageID)
{
/* 加载分页类,并生成pager对象。

*/
$this->app->loadClass('pager', $static = true);
$pager = new pager($recTotal, $recPerPage, $pageID);
/* 将分页类传给model,进行分页。

*/
$users = $this->user->getList($pager);
/* 赋值到模板。

*/
$this->view->users = $users;
$this->view->pager = $pager;
}
模板中显示分类链接:show()方法有两个参数,$align: left, center, right,默认是居右对齐。

$type: full|short|shortest
<?php $pager->show();?>
5.4、zentaoPHP框架中的数据验证机制
数据验证在web应用中尤其显得重要。

下面来给大家介绍下禅道框架的数据验证机制。

相关文档
最新文档