最近比较绕有兴趣地学习PHP,看完了一些基础语法、学会了使用SMARY模版,继而看了ThinkPHP框架,

此框架的强大超出我的意外,它的ROR真是强,还有内置的CRUD,比JAVA的框架更智能。

方便记忆性的学习转载了一些以下文章

CURD知识之一 C 创建(create)


名词解析:
1  CURD:代表数据库四个基本操作:创建:create,更新:update,读取:read,删除:delete

2  模型对象:即数据对象,你项目里每一个Model类文件都会对应着一个数据表(或者视图),模型与数据表存在一种映射关系。TP约定了命名要遵循一定的规范,如果不符合,则需要根据情况进行额外的相应设置。例如Model类的tableName属性

在第三节时,曾略为提到Model类文件命名,现在再回顾一下这部分的内容:
我们之前在数据库中,已建立了一个think_form数据库表,并且在配置文件config.php中,我们定义了数据表的前缀是think_,
模型类(Model)文件的命名规则是:

不包括前缀的数据库表表名并且首字母大写+Model.class.php

所以之前我们为think_form数据表在Myapp/Lib/Model目录下建立一个文件FormModel.class.php

模型类的特殊命名还可以智能识别驼峰式的表命名,假设我们有个是类似think_new_table这样的表
可以命名为NewTableModel.class.php。默认配置便可以智能识别自动对应think_new_table表,因此不必修改配置。


开发过程中,只要简单地定义好与数据表对应的模型类(xxxModel.class.php),就可以进行对数据操作了。
如何让这个模型支持自动验证,自动填充,自动过滤这些知识,在下面涉及到时会作相应讲解。

一般来说,在表中添加数据都是通过表单来建立,为了更直观地学习CURD中的C,我们接下来建立个表单来进行添加数据的操作。
之前我们已在Myapp/Lib/Model/下建立好FormModel.class.php类----模型(M)
同时也在Myapp/Lib/Action/下添加了一个Index应用模块和写下了一个index操作----控制器(C)
并且在Tpl目录下建立了与之对应的模板目录Index及index.html模板文件 -------视图(V)
MVC模式的开发已体现了出来。
tdweb曾简明扼要地概括了TP中这三者的关系,

C的作用,就是从M中取得数据到V,

使用TP以表单提交数据到库,流程和你所了解的表单提交没有什么区别,只是TP简化了数据操作的处理过程。
我们在实际操作中体会一下。
先来看看我们所定义的数据表form的字段:

  1. 'id',//自动编号
  2. 'title',//标题
  3. 'content',//内容
  4. 'create_time',//创建时间
  5. 'update_time'//更新时间
  6. 'email',//邮箱
  7. 'status',//状态
复制代码

其中的create_time字段是为了记录数据插入的时间,我们可以利用TP的数据自动填充来处理。

在Model类定义 $_auto 属性,可以完成数据自动处理功能,用来处理默认值和其他系统写入字段。
注意1:该自动填充可能会覆盖表单提交项目。其目的是为了防止表单非法提交字段。
注意2:要使用Model类的create方法创建数据对象的时候才会自动进行表单数据处理。

1 打开Myapp/Lib/Model/FormModel.class.php文件,更改代码为

  1. <?php
  2. class FormModel extends Model {
  3. // 自动填充设置
  4. protected $_auto  =  array(
  5.   array('status','1','ADD'),
  6.         array('create_time','time','ADD','function'),
  7. );
  8. }
  9. ?>

代码知识要点:
Model类的$_auto属性由多个填充因子组成的数组,填充因子定义格式:

array(填充字段,填充内容,填充条件,附加规则)

填充字段就是需要进行处理的表单字段,这个字段并不一定要是数据库表中的字段,对于表单内的辅助检测字段比如重复密码和验证码也可以处理。
填充条件ADD | UPDATE | ALL(注意,此是1.5版本说明,1.6已改为1 2 3,后续教程有说明)
当为ADD时,会在新增数据时自动填充,这是默认的处理方式
当为UPDATE时,在更新数据的时候会自动填充
当为ALL时,所有情况下都会进行自动填充

附加规则:附加规则是针对填充内容而言,表示该内容填充的方式,包括function,callback,field,string
对于field使用其它字段进行填充和string直接标示字符串作为值进行填充很好理解。例如上面

  1. array('status','1','ADD'),
复制代码

就是将状态status字段的值直接以1填充.

下面主要说说function与callback这两个附加规则。

  1. protected $_auto  =  array(
  2. array('create_time','time','ADD','function'),
  3. );

上面create_time代表了要处理的字段,填充内容是time,附加规则是function使用函数,填充条件是ADD新增时处理,那么整行代码表示对create_time字段在新增的时候使time函数作为该字段的值进行自动填充。
再看一个function作为附加规则的例子

  1. protected $_auto  =  array(
  2. array('password','md5','ADD','function'),
  3. );

当使用function作为附加规则时,第二个填充内容就代表了这个因子是一个函数名称,该函数的参数就是代表填充字段的值,比如password的值是123456,则上面的代码会先将这个值使用函数md5('123456'),这样处理后再插入到数据表中去。
对于function(函数)和callback(回调方法)理论是一样的,只不过一个是表示填充内容所写的是函数名,另一个是表示填充内容是类中的方法名。函数可以是PHP5内置函数或你自己所写的函数。而callback是当前模型类所能调用的一个方法。
有关数据填充方面的详细资料,请参看官方使用手册 《ThinkPHP数据操作指南》

2 打开Myapp/Tpl/default/Index/index.html文件,我们修改代码将form写进去

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <html>
  3. <head>
  4. <title>{$title}</title>
  5. </head>
  6. <body>
  7. <form action="__URL__/add" method="post" name="formname" id="formname">
  8.     <p>
  9.            <label for="title">标题:</label>
  10.            <input name="title" type="text" id="title" />
  11.     </p>
  12.     <p>
  13.            <label for="email">邮箱:</label>
  14.           <input name="email" type="text" id="email" />
  15.     </p>
  16.     <p><label for="content">内容:</label></p>
  17.     <p>
  18.         <textarea name="content" rows="5" cols="25" id="content" class="textarea" ></textarea>
  19.     </p>
  20.     <p><input type="submit" value="提交" /></p>
  21. </form>
    </body>
    </html>

在上面代码中,我们简单地建了一个form表单,并将标题统一使用一个模板变量{$title}。
action提交到的处理地址是__URL__/add,其中__URL__是一个常量定义,表示当前模块地址,TP模板引擎会自动将这句解释为/index.php/Index/add,常见的模板使用的常量有

__ROOT__    网站根目录地址
__APP__         当前项目(入口文件)地址
__URL__         当前模块地址
__ACTION__   当前操作地址
__SELF__       当前 URL 地址

3 设置模板变量 {$title} ,增加add操作方法

打开Myapp/Lib/Action/IndexAction.class.php文件,修改代码如下


  1. <?php
  2. class IndexAction extends Action{
  3.     public function index() {
  4.            $this->assign('title','添加数据');//这里设置了模板变量{$title}
  5.            $this->display();
  6.     }
  7.     // 处理表单数据的方法
  8.     function add()  {
  9.           $Form = D("Form");
  10.           if($Form->create()) {
  11.                    $Form->add();
  12.                    $this->redirect();
  13.           }else{
  14.                    header("Content-Type:text/html; charset=utf-8");
  15.                    exit($Form->getError().' [ <A HREF="javascript:history.back()">返 回</A> ]');
  16.          }
  17.     }
  18. }//类定义 end
  19. ?>

代码知识要点:
模板变量赋值前面的章节已介绍过。这里就不啰嗦了。

我们来看看add方法的代码。
$Form = D("Form");
这里使用了TP的特色单字母函数D,是操作数据库时最常用的TP函数,表示实例化Form对象,
即$Form = new FormModel();
D函数的具体代码可以查看ThinkPHP目录内的common/function.php中的片段,
它会自动引入Model类,并判断之前如果实例化过这个Model,就不再实例化,若然该Model不存在,就会抛出异常错误,另外,D可以跨项目访问Model,暂且忽略。

$Form->create()
使用Model类的Create方法创建一个Form对象,失败会返回false。

$Form->add(); //add方法会将表单数据进行写入
$this->redirect(); //执行跳转
就这么简单几行代码,便完成了对数据插入的处理。

posted on 2009-07-09 08:46  冷傲残痕  阅读(4860)  评论(0编辑  收藏  举报