2007年04月10日
  1. 为什么用XOOPS来开发
  2. 你也可以开发XOOPS模块
  3. XOOPS模块基本概念
    1. 目录结构
    2. xoops_version.php
    3. 命名约定
    4. 模板系统
    5. 内建评论、通知、
  4. 马上写一个模块
  5. XOOPS的内建类
    1. 数据对象类
      1. 对象关系数据库映射ORM
      2. xoopsObject
      3. xoopsObjectHandler
      4. xoopsPersistableHandler
    2. 表单
    3. 模板
    4. 用户
    5. 群组与权限
  6. 程序一般结构
  7. 常用函数
    1. 跳转
    2. 确认
  8. 区块
  9. 小技巧
  10. 兼容性
  11. PHP基础
  12. 开发工具

为什么用XOOPS来开发?
这要从我认识XOOPS说起.2005年以前我自以为懂些编程,根据面向对象的理论,到处寻找PHP的类库,花了许多时间在PEAR上.认为使用类才能提高开发效率.但因为实践水平低,学习PEAR并不成功,只掌握了少数的类,却花费了大量的时间.于是我开始寻找PHP开发框架.那时候国内的PHP资料还是算比较少.偶然看到XOOPS的介绍,是最流行的CMS,看了一下资料.发现有数据库访问,权限系统等,很适合作为一个框架使用.于是便在XOOPS框架下开始开发了.一开始还是用旧的想法,只是用了XOOPS的一少部分功能.
XOOPS最能吸引我的是大量的模块,论坛,文章这些对于一个网站来说是必备的,没有必要重新来编写.拿来就可以用了.再自己开发主要的功能.就可以实现自己的网络想法了.当初是这样想的,但至今没有实多少个自己的想法.其实要做成一件事是非常难,特别像我这个只会凭一已之力的人.

言归正传.为什么用XOOPS来开发?
大部分人认为XOOPS是一个CMS,内容管理系统.不想在这里谈我对CMS有定义,这个问题另外讨论吧.我认为XOOPS是一个开发框架.是一个功能极齐全的framework:

   1. 用户登录,群组权限,数据库访问,对象数据库映射(ORM),调试与出错信息,模板系统.这些是一个开发框架最基本的.
   2. 开发约定.  过去自己编程的时候,一些小问题总是困扰自己,文件应该放在什么目录,文件名怎样起,这个功能到底放在个文件好还是放在那个文件好,是不是完全不使用全局变量.这些问题总是一会儿学这个程序的写法,一会儿觉得那个程序的方法好,摇摆不定.XOOPS有一套约定,是前人总结下来的好方法,虽然可能有一些不便的地方,但有了统一的规则,上述问题就解决了.
   3. 有大量现成的功能模块,实现了许多常用的功能,不需再重复工作.
   4. 技术支持.技术支持无论对使用者还是开发者来说都十分重要.有许多人喜欢到处找源码,认为有了源码,就可以免费使用了,改头换脸后就可以用来赚钱了.其实有没技术支持的代码是一堆费物,是浪费你的时间和生命的吸血鬼.XoopsChina 社区还是比较活跃的,虽然开发方面的支持较少,xoops.org有更多的支持.
   5. 许多内建的类和函数.经过大量实践检验的函数解决许多细节的问题.省去大量的劳动.
   6. 出色的对象数据库映射.重新提到这一点,因为它非常重要,是XOOPS的核心.一般不需要写SQL语句,就可以方便操纵数据库.当表结构发生改变时,可以很容易修改.这样就可以随心所欲地开发自己的功能,进行循环开发,而不需要事前将所有东西都计划好.
   7. 开源.这是一个优点,否则你就得不到它了.这也是一个缺点,GPL 协议使急于富裕起来的中国程序员又爱又恨.

还有其它一些次要的优点就不一一列举了.我会在后面的章节逐一介绍.

笔记薄翻过了一页,上一页本来还有一些空白.近按照习惯,或者是依我的性格,不会浪费掉剩余的空白.我是一个极度成本效益主义者.换不同的角度描述,是孤寒,极端环保主义.
今天 终于5点前起床了,我决定早上的时间要利用起来.最初有这个想法是看康熙来了访问小马哥,他说每天只睡4个小时.而我经常很早就醒来,无法再入睡.大家未起床的时间是最小干扰的时间.前几天已经试过,可惜仅一次.当然最重要的是中午要睡一下,并且要睡着.

失败的人生!
我是5号,典型的5号,我的人生需要一个8号来驱动.5号是没有行动力的,想了就算做了.其实我深深知道自己的缺点,并且曾经试图改变.还记得起而行吗?我希望将这句话变成坐佑铭,可惜,并没有贯彻始终.日子一天一天过去,刚才醒来的时候,回想一下这段时间许多想做的事情都没有做,很沮丧.也是为什么这几天经常发猫猫脾气.肚不舒服,十天前就说去买红黑丸,它的确是有效的.但是每天说去买却一直没有去.于是认为是孤寒在作怪.其实想来.是因为我的是5号.5号是最没有行动力的人.总不愿跨出舒适圈.
我需要一个8号!只有8号才能驱动我,让我行动起来.但我却很害怕8号,我害怕有侵略性格的人,我逃避他们.因为我不知如何应付.猫猫曾是驱动我的人,昨晚在想我为什么跟猫猫在一起,有许多缺点的猫.一只懒猫.我其实是有很多理想的啊?但她能驱动我,这是为什么我愿意为她做许多事,琐碎无聊的事.但她不是8号,她是7号.7号虽然有一点8号的特性,但她仍然只是一个7号.
我是否要寻觅我的8号??

2007年01月04日

这几天对2007年做了一个计划,想写很多模块.
其实我对写电子商务类的模块不是十分感兴趣.因为同类程序已经很多,我们不是专业做这个,很难做到别人的水平.
不过我还是会参与xcart的.作为一次学习合作开发的机会.
其实对于专业的电子商务站点,使用xoops可能不太适合.xcart适合于一个网站的一部分,而不是核心部分.当然对于xoops来说,这个模块的存在还是有必要的.

2006年07月07日

[url=http://www.pearchina.com]PEAR中文站pearchina.com[/url] 正式启动。

PEAR是PHP的官方开源类库,PEAR将PHP程序开发过程中常用的功能编写成类库,使用PEAR可以大大提高PHP程序的开发效率。

pearchina.com 致力于PEAR在中文世界的应用。目标是介绍各PEAR类,编写、收集和翻译PEAR文档,为phper使用PEAR提供交流的平台。

pearchina.com 采用了“聚译”的概念,是“聚译”系列开源中文站的一个试验站点。目标是将国外更多优秀的开源软件和技术网站中文化,使国人能够冲破语言的障碍,拓宽视野,认识更多优秀的开源软件,参与开源运动中,在开源的浪潮中占得先机。

“聚译”是聚集众人的力量,翻译大家迫切需要的文档。采用类似wiki的多用户编辑功能,让用户花费一些零碎的时间参与翻译工作,聚集成可以共享的资源。采用wiki的思想,用户可以翻译未被翻译的部分,也可以修正别人的翻译。所有修改都被记录,可以恢复到过去的任何版本。这样聚集众人的智慧,得到准确恰当的译文。

希望PEAR中文站为PHPer提供一点帮助,也希望PEAR能对xoops模块开发有所帮助。欢迎各位PHP爱好者参与本站工作。

2005年11月01日

简介

FormBuilder类根据数据库结构(需要DataObject类封装)和表间关系自动生成输入表单。实质上是整合了DataObject和QuickForm。目前是beta版本,但是使用没有什么问题,只是不断有新的功能被加入。

优点与缺点

自动,可定制输出,支持Smarty,应变,自动生成输入数据校验。

由于DataObject每次要读取一次config文件,当数据表比较多,例如有50个以上,它的效率会变差。(Justin
Patrin所说,本人没有测过)而FormBuilder有时会读取比较多的表。如果你的网站非常大型而且有密集的访问量,效率可能会是一个问题。目前主要的开发者
Justin Patrin 提出了一个解决方法

即使不把DataObject作为最终的方案,如果设计的是一个大型系统,把DataObject作为设计原型,在充分确定需求后再用其它法方优化系统,也不失为一个好的选择。

快速开始

假设你已有一些DataObject类,例如DataObject一章中的数据库。

 <?php
//创建员工表hr_employee的DataObject对象。
require_once('DB/DataObject.php');
require_once('hr_employee.php');
$e = new hr_employee;

//创建FormBuider对象
require_once('DB/DataObject/FormBuilder.php');
$fb=FormBuilder::create($e);
/*可在此处加入一些选项设置*/

//创建输入表单
$form=$fb->getForm();
if ($fomr->valid()) {
$form->process(array(&$formBuilder, 'processForm'), false);
$form->freeze(); //冻结表单,可选
}
echo $form->toHtml();//显示表单
 ?>

用这个简单的程序就可得到类似下图的输入表单(图中是已加入了一些选项后的显示结果) image:FormBuilder_QuickStart_display.gif

进阶

设置

共有5种设置方法,可根据你需要和习惯选用,具体的选项内容请看下一节。通常用第2种设置一些全局选项,用第5种设置某个表的全局选项,用第4种设置某个表的临时选项。

通过继承FormBuilder类设置成员变量

 <?php 
class MyFormBuilder extends DB_DataObject_FormBuilder {
var $createSumbit = true; //显示提交按钮

function MyFormBuilder {
//显示多少层的链接表
$this->linkDispayLevel = 2;
//设置什么类型的数据用什么表单元素来显示
$this->elementTypeMap = array('shorttext' => 'text', 'date' => 'myDate');
}
}
 ?>

MyFormBuilder从DB_DataObject_FormBuilder继承后,加入自己的设置$createSumbit,并在构造函数中设置linkDispayLevel和elementTypeMap

用初始化文件DataObject.ini设置

在DataObject.ini中加入一个[DB_DataObject_FormBuilder]段,

 [DB_DataObject]
database = mysql://user:password@server/database
schema_location = /DataObjects
class_location = /DataObjects
require_prefix = /DataObjects/

[DB_DataObject_FormBuilder]
createSubmit=1 ;显示提交按钮
linkDisplayLevel=2 ;显示多少层的链接表
elementTypeMap=shorttext:text,date:myDate ;设置什么类型的数据用什么表单元素来显示

用数组将设置传递给create()方法

 <?php 
$do = DB_DataObject::factory('table');
$options = array('createSubmit' => true,
'linkDisplayLevel' => 2,
'elementTypeMap' => array('shorttext' => 'text',
'date' => 'myDate'));
$fb = DB_DataObject_FormBuilder::create($do);
 ?>


在程序中设置

这是局布设置方法,只在这个程序中生效。

 <?php 
$do = DB_DataObject::factory('table');
$fb = DB_DataObject_FormBuilder::create($do);
$fb->createSubmit = true;
$fb->linkDisplayLevel = 2;
$fb->elementTypeMap = array('shorttext' => 'text', 'date' => 'myDate');
 ?>

在DataObject类中设置

在自动生成的,对应于每个表的DataObject类中加入设置。可以静态设置为成员变量,也可以在成员函数中动态设置。

 <?php 
class DataObject_Table extends DB_DataObject {
###START_AUTOCODE
//... 这里是自动生成的代码
###END_AUTOCODE

var $fb_createSubmit = true;
var $fb_linkDisplayLevel = 2;

function preGenerateForm() {
$this->elementTypeMap = array('shorttext' => 'text', 'date' => 'myDate');
}
}

$do = DB_DataObject::factory('table');
$do->fb_submitText = 'Submit!';
$fb = DB_DataObject_FormBuilder::create($do);
 ?>

选项参数说明


addFormHeader

在表单中添加表头。bool型

clientRules

在客户端校验输入数据。bool型

createSubmit

创建提交按钮。默认为true。在与QuickForm_Controller类一起使用时,设为false禁止显示提交。

crossLinkSeparator

链接元素之间的分间符。默认为’<br/>’。例如用空格设置为水平显示各记录。

dbDateFormat

数据日期格式,目前只支持ISO一种。

dateElementFormat

QuickForm的日期显示格式,例如"Y-m-d",详见QuickForm,合法的字符有d,m,Y,H,i,s。

dateFieldLanguage

日期字段的语言。没有中文的,哪位朋友可以加上。

elementNamePrefix

元素名前缀。和elementNamePostfix一样修改表单元素名,主要用在一个页面有多个表单的情况。例如:

 <?php 
$do = DB_DataObject::factory('table');
$fb = DB_DataObject_FormBuilder::create($do);
$fb->elementNamePrefix = 'formOne';
$form = $fb->getForm();

$do2 = DB_DataObject::factory('table');
$fb2 = DB_DataObject_FormBuilder::create($do2);
$fb->elementNamePrefix = 'formTwo';
$fb->useForm($form);
$form = $fb->getForm();

//normal processing here
 ?>

If you assume that "table" has one field, "name", then the resultant form
will have two elements: "formOnename" and "formTwoname".

Please note: You *cannot* use the or anywhere in the prefix or postfix. Doing
so will cause FormBuilder to not be able to process the form.


elementNamePostfix

元素名后缀。见elementNamePrefix。

formHeaderText 表头文字。默认为DataObject类的类名。

hidePrimaryKey

隐藏主键。默认为不显示主键,通常为表的auto_imcrement字段。例如要显示用户的编号,设为false.

linkDisplayLevel

显示多少层的链接表 If this is set to 1 or above, links will be followed in the display
fields and the display fields of the record linked to will be used for display.
If this is set to 2, links will be followed in the linked record as well. This
can be set to any number of links you wish but could easily slow down your
application if set to more than 1 or 2 (but only if you have links in your
display fields that go that far ;-)). For a more in-depth example, see the docs
for linkDisplayFields.

未完待续…

简介

DB_DataObject将数据表封装成对象,所有对数据库的操作转化为对象的操作。

使用DataObject,完全不用跟SQL打交道。特别在需要修改数据库结构的时候,例如增加或删除表和字段、改名、更改表间关系,在设计一个稍为复杂的系统时,这些情况都会经常出现。使用DataObject,只需修改很少的几个地方,不用去修改讨厌的SQL语句。再配合其它几个类,例如FormBuilder,DataGrid,就能够用很简单的几行代码实现数据输入和输出显示等复杂功能。

很多人使用DB类,因为DB类隐藏了不同数据库的差异。但是你还是要直接使用SQL语句。DataObject在DB的基础上进一步抽象,隐藏了数据库。

  • 依赖关系

需要DB类的支持;DataObject_formBuilder依赖本类。

  • 优点与缺点

面向对象操作数据库,提高开发效率,适应变化,适合于迭代式开发。执行效率略低。

快速开始

注意:由于Zend存在的一个bug,如果使用Zend,必须将DataObject.php文件中第121行

define(‘DB_DATAOBJECT_NO_OVERLOAD’,true);

的注释符去掉;或在每个用到DataObject的文件的前面加上这句。原文还漏了“;”,记得加上。如果初次运行浏览器死锁或出现找不到页面,多半是这个问题。

在mysql中建立数据库

例如

 CREATE TABLE IF NOT EXISTS `hr_employee` (
`id` smallint(5) unsigned NOT NULL auto_increment,
`name` varchar(20) NOT NULL default ,
`section_id` tinyint(3) unsigned NOT NULL default '0',
PRIMARY KEY (`id`),
) TYPE=MyISAM COMMENT='员工表';
CREATE TABLE IF NOT EXISTS `hr_section` (
`id` tinyint(3) unsigned NOT NULL auto_increment,
`name` varchar(20) NOT NULL default ,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) TYPE=MyISAM COMMENT='部门表' ;

CREATE TABLE IF NOT EXISTS `hr_project` (
`id` smallint(5) unsigned NOT NULL auto_increment,
`name` varchar(60) NOT NULL default ,
`date` date NOT NULL default '0000-00-00',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) TYPE=MyISAM COMMENT='项目表' ;

CREATE TABLE IF NOT EXISTS `hr_employee_project` (
`id` int(11) unsigned NOT NULL auto_increment,
`employee_id` smallint(5) unsigned NOT NULL default '0',
`project_id` smallint(5) unsigned NOT NULL default '0',
PRIMARY KEY (`id`),
UNIQUE KEY `employee_id` (`employee_id`,`project_id`)
) TYPE=MyISAM COMMENT='员工-项目表';

创建DataObject.ini

 [DB_DataObject]
database = mysql://user:password@server/database
schema_location = /DataObjects
class_location = /DataObjects
require_prefix = /DataObjects/

创建CreateDataObjectClasses.php

 <?
//注意设置好你的pear包含路径
require_once 'd:/www/Pear/DB/DataObject/Generator.php';
$config = parse_ini_file("D:\www\hr\DataObjects\DataObject.ini", true);
$options = &PEAR::getStaticProperty('DB_DataObject','options');
$options = $config['DB_DataObject'];
if (!$options) {
PEAR::raiseError("\n错误:无法读取ini文件\n\n", null, PEAR_ERROR_DIE);
exit;
}
set_time_limit(0);
DB_DataObject::debugLevel(1);
$generator = new DB_DataObject_Generator;
$generator->start();
 ?>

运行CreateDataObjectClasses.php

  • 在DataObjects目录中自动为数据库中每个表生一个DataObject的子类,存为相应的php文件。
  • 自动生成一个db.ini配置文件,db是你的数据库的名字。这个文件保存了每个表中各字段类型信息,用数字表示,是自动生成的,请不要修改这个表。

创建db.link.ini

 [hr_employee]
section_id = hr_section:id
[hr_employee_project]
employee_id = hr_employee:id
project_id = hr_training_project:id
[hr_project]
id = hr_employee:id


上述步骤看起来复杂,做好了一切就简单了。这可以我摸索了近半个月才搞清楚的。

现在可以开始了。

 <?
//取单个表的数据
$employee = new Hr_employee;
$employee->name = '张三';
$employee->find(ture);
echo '员工'.$employee->name.'的职务是'.$employee->position.',';

//取多对一关系的数据
$employee->getLinks();
echo '工作部门是'.$employee->_section_id->name.',';

//取多对多关系的数据
echo '参加的项目包括';
$e_p = new Hr_employee_project;
$e_p->employee_id = $employee->id;
$e_p->find();
while ($e_p->fetch()) {
$project = $e_p->getLink('project_id');
echo $project->name.'、';
}
echo '。';
 ?>

进阶

配置选项

共有三个ini文件存放各种信息,

  • DataObject.ini (或config.ini)名字由用户自己定义。设置数据库、路径等信息
  • db.ini 执行CreateDataObjectClasses.php自动创建,保存数据库各字段的类型
  • db.links.ini 保存表间关系,不同表通过什么字段来联系。

其中db用你的数据库名称替换。

DataObject.ini

信息放在[DB_DataObject]段内

 [DB_DataObject]
database = mysql://user:password@server/database
schema_location = /DataObjects
class_location = /DataObjects
require_prefix = /DataObjects/

database:数据库访问信息,与DB的格式一样

schema_location:存放表间关系的ini文件

class_location:自动生成的DataObject类放置的路径

require_prefix:派生类放置的路径,最后为“/”。与include路径的相对路径。
staticGet()和getLinks()方法自动载入类时要搜索到相应的类。

一个linux下的例子:

[DB_DataObject]

database = mysql://user:password@localhost/vending
schema_location = /home/me/Projects/myapplication/DataObjects
class_location = /home/me/Projects/myapplication/DataObjects
require_prefix = DataObjects/
class_prefix = DataObjects_

也可以不使用ini文件的方式,而使用$options组件:

$config = parse_ini_file('example.ini',TRUE);
foreach($config as $class=>$values) {
$options = &PEAR::getStaticProperty($class,'options');
$options = $values;
}

// or you can do without an ini file, and configure it in PHP..

$options = &PEAR::getStaticProperty('DB_DataObject','options');
$options = array(
'database' => 'mysql://user:password@localhost/vending',
'schema_location' => '/home/me/Projects/myapplication/DataObjects',
'class_location' => '/home/me/Projects/myapplication/DataObjects',
'require_prefix' => 'DataObjects/',
'class_prefix' => 'DataObjects_',
);

上述四个是必先项,以下为可选项:

sequence_{table}
string:强行设置次序键(autoincrement/nextval类型)。当主键不能被正确识别而运行不正确,可以强行设置次序键

例如:sequence_person = login 将person表的次序键设为login字段。


ignore_sequence_keys string 忽略顺序键

If you do not want to use pear’s nextval(), for automatically filling in
sequences, this can disable it for "ALL", or a list of tables
"person,cart,group"

debug integer 调试级别。这个选项非常有用,调试时可以看到运行的情况。不过我一般会用->debug()
方法在一个公共文件中设置。默认为关闭 (default 0=off), 1= basic sql logging,2=result logging,
3=everything

debug_ignore_updates boolean default FALSE, if set, then updates on the
database are disabled.

dont_die boolean default FALSE, The standard behaviour of dataobjects is to
issue a PEAR_ERROR_DIE (eg. exiting PHP), when a fatal error occurs, like
database connection failure or sending an invalid object type to a method.
However if you need to run it on a live server you will probably want to set
this to TRUE and define a PEAR error handler to catch these errors and show a
nice friendly ’sorry we are down for maintenence’ message page.

Configuration Options – Multiple Databases (optional)

database_* string When you have multiple databases you can use the database_*
to specify the DSN for each database

Example 20-4. using multiple databases – database passwords

database_authentication = mysql://user:password@localhost/authentication
database_sales = mysql://user:password@localhost/sales



table_* string When you have multiple databases you can use the table_*
configuration variables to map individual tables to different databases, for
example

Example 20-5. using multiple databases – table settings

table_users = authentication table_saleslog = sales table_stock = sales


Configuration Options – Builder

class_location directory The Directory where your DataObject extended Classes
are.

Used by the Class Auto Builder when updating/writing to your class
definitions.

extends string The Name of your Base Class (usually DB_DataObject) is
located.

If you wish to add a common layer of useful methods for all classes, you can
set the extends_location and extends settings to a different class. the default
is ‘DB_DataObject’

extends_location directory The Directory where your Base Class (usually
DB_DataObject) is located.

If you wish to add a common layer of useful methods for all classes, you can
set the extends_location and extends settings to a different class. the default
is ‘DB/DataObject.php’

generator_class_rewrite directory

定义表间关系 db.links.ini

…待续

结构


表间关系

1:1(一对一关系)

n:1(一对多关系,或者是多对一关系)通常表示一个对象的属性也是一个对象。

n:m(多对多关系)使用一个十字链表(crossLink table)表示它们之间的关系。


对数据表的要求

每个表的主键(primaryKey)必须是一个以唯一数字标识的字段(sequenceKey),在mysql中就是auto_increment的字段。不可以使用非整型的字段作为主键,即使是设为unique;也不可以用多字段做主键。这与数据库设计的理论有些不同。例如以username作为主键,会出现找不到键的错误。虽然可以用keys()方法强行设置主键,但我建议不要这样做。

简介

Auth类是一个登录系统,只需简单的语句就可以实现用户登录的功能。并且封装了session操作,可以不直接使用PHP的session函数,传递变量。

优点与缺点

可用不同的密码储存方式,包括数据库、文件、POP3、SOAP等。

没有分组权限功能。

快速开始

假设你已有一个叫user的数据库表储存用户名和密码。

 CREATE TABLE auth (
username VARCHAR(50) default NOT NULL,
password VARCHAR(32) default NOT NULL,
PRIMARY KEY (username),
KEY (password)
);

例1

 $dsn = "mysql://user:password@localhost/database"; //数据库访问设置
require_once 'Auth/Auth.php';
$a = new Auth('DB',$dsn);
$a->start();
if ($a->getAuth()) {
echo '登录用户的显示信息';
}else{
echo '您还未登录。';
}

就这么简单。

进阶

许多有用的函数在Pear手册中没有介绍。

定制数据库

设置一个参数数组

 $auth_options = array( 
"dsn" => "mysql://user:password@localhost/database";
"table" => "hr_user", //用户表名
"usernamecol" => "username",//用户字段名
"passwordcol" => "password" //密码字段名
);

构造函数Auth的参数1:密码储存的方式;参数2:数据库选项;参数3:登录界面回调函数名。

 $a = new Auth('DB',$auth_options,'loginFunction');

定制登录界面

 /**
* HTML的登录界面
*/
function loginFunction(){
echo "<form method=\"post\" action=\"" .$_SERVER['PHP_SELF'] . "\">";
echo "<input type=\"text\" name=\"username\">";
echo "<input type=\"password\" name=\"password\">";
echo "<input type=\"submit\">";
echo "</form>";
}

最好是采用HTML_QuickForm类:

 function loginFunction(){
require_once('HTML/QuickForm.php');
$form = new HTML_QuickForm('login','post');
$form->addElement("header",'login',"用户登录");
$form->addElement("text","username","用户名",array('size'=>16,'maxlength'=>16));
$form->addElement('password','password','密码',array('size'=>16,'maxlength'=>16));
$form->addElement("submit",'submit',"确定");
$form->applyFilter('__ALL__','trim');
$form->display();
}


登录以后的信息处理

setLoginCallback(array(‘__CLASS__’,'_loginCallback’);//设置登录后执行的函数;

其中第一个参数是回调函所在的文件或类,这里有超级常量__CLASS__,不管文件名怎样变量都不影响。<-有否问题请高手指点!

/**
* 登录后执行的内容
* $username传入用户名;
* $auth传入$auth对象,有时会很有用,例如传递数据
*/
function _loginCallBack($username,$auth){

require_once("hr_user.php"); $user = new hr_user; $user->username =
$username; $user->find(); if($user->fetch()){ $this->sessionData=array(
"user_id" => $user->id, "nickname" => $user->nickname, "icon" =>
$user->icon, ); $auth->setAuthData("sessionData",$this->sessionData);
}else{ //$auth->raiseError("sessionData出错"); die("sessionData出错"); } }

登录失败

setFailLoginCallback():设置登录失败后执行的函数;

登出

setLogoutCallback($logoutCallback):设置登出后执行的函数;

logout():退出登录;

传递变量

setAuthData($name, $value, $overwrite = true):利用session传递变量;

getAuthData($name = null):从session中取出变量;

用户管理

addUser():        添加用户

removeUser(): 删除用户

listUser():         列出用户

PEAR的网站是:http://pear.php.net

可以从Pear的网站下载手册。不过,除了中文版什么语言都有。(可见中国的PHPer参与国际化合作极少)下载版的手册内容似乎很少更新,一成不变,而且许多类没有。有说明的类也会有一些方法可能因为比较新而没有加进手册。在线版本的手册估计比较齐全,我想是用phpDocumentor做的,因此从代码的注释就可以看到。

可以从 http://pear.php.net/support/lists.php
订阅PEAR的邮件列表。不要用163等国内的邮箱订阅,它们都被加入垃圾邮件黑名单了。最好用hotmail,yahoo,google,msn等邮箱。(中国被妖魔化了)

这个邮件列表有个归档方式的页面:http://marc.theaimsgroup.com/?l=pear-general
虽然是黑底白字,看起来不大舒服,但是有搜索功能,非常方便。可以搜索到其它用户的例子。

由于中文资料不多,需要大家更多的交流,参加Pear手册翻译计划(未启动,可先参加PHP研究室的计划)。每人花一点力,大家共享成果。

怎样安装PEAR

新版本的PHP的安装包带了PEAR,不过只有一些基本库。按照手册里的说明,我从来没有成功地安装过。手册的着力点是在Linux系统下,我相信大部分人会喜欢在windows下开发,在linux下发布。
其实根本不用什么安装过程,直接把你要用的类下载解压到相应的目录就可以了。例如你的web根目录是www,可以将目录结构做成:

www
|-phpMyAdmin
|-application_1
|-application_2
|-Pear
|-Pear.php
|-System.php
|-HTML
|-QuckForm.php
|-QuickForm
|-Controller.php
|-Controller

这种一定有效,但根据pear的安装说明认为有安全问题,因为pear可以被用户访问。将pear目录设成是不可访问应该就可以了。一些使用PEARpear的系统例如Seagull就是这样做的。安装说明建议放在www目录外面,但我的试验不成功。希望大家在此加上自己的经验。

有两点要注意:

  • 1、类的依赖关系。一些类要使用另一些类。不过一般它们都自带了。所有的类都

依赖pear类,所以必须安装pear类。

  • 2、类的目录结构。类的名称是按照目录结构来命名的。

例如HTML_QuickForm_controller类应放在 pear根目录\HTML\QuickForm的目录下。


怎样添加包(package)

添加包非常简单,下载你要的包,解压到相应的目录中就行了,关键是你要懂得PEAR的目录结构。