17个流行的JavaScript库来拉长你的Web体验

  这样,在我们用 D 方法实例化 TrunkModel 的对象后,使用 add
方法插入数据时,就会先调用 BaseModel 中的 add
方法了,这样我们每张表都有的 create_by 等一系列字段就都会自动得到了。

例子:

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

就这样定义一个类名就行了。该类继承了Model类。至于自动验证,自动过滤,自动填充这些,暂且不理会。

 

连贯方法除了 select() 方法外,其他的连贯方法不区分前后顺序。

  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. ?>

入口文件index.php代码:

  这样,我们的 BaseModel 就定义好了,以后项目中的 Model 就不再继承 TP
的 Model 类了,而是继承我们自定义的 BaseModel 了。

二、基础模型

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

TP支持四种URL访问方式,默认是智能模式,所以我们就这种模式进行简要说明。

  继承的 BaseModel 的方法和继承 Model 的方法是一样的,只是使用 use
引入命名空间到当前作用域时的需要修改为我们的命名空间,而不是再去使用 TP
提供的命名空间。代码如下:

IndexAction.class.php:

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


 

ArticleModel.class.php:

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

1 下载TP1.5正式版

   ThinkPHP 提供了一个 Model 类,供其他的 Model 进行继承。Model 类中是
MVC 中的模型类,它是调用 持久层
的上层类。感觉这么描述问题很多,但是有什么办法呢?但是,这个 Model
有时无法满足我们的一些需求,因此我们需要自定义一个 Model
类出来,不过自定义的 Model 同样要继承 TP 提供的 Model
类,而把我们自定义的 Model 类作为我们项目中的 Model
基类。我怎么感觉我在说绕口令,等等…我有点晕。

array(6) {    [0] => array(7) {      ["id"] => string(1) "1"      ["title"] => string(4) "test"      ["content"] => string(12) "test_content"      ["category"] => string(13) "test_category"      ["area"] => string(6) "北京"      ["add_user"] => string(5) "admin"      ["add_time"] => string(19) "2014-11-20 23:03:44"    }    [1] => array(7) {      ["id"] => string(1) "2"      ["title"] => string(12) "吼吼吼吼"      ["content"] => string(18) "任溶溶柔然人"      ["category"] => string(14) "test_category2"      ["area"] => string(6) "河北"      ["add_user"] => string(5) "admin"      ["add_time"] => string(19) "2014-11-22 15:16:12"    }    [2] => array(7) {      ["id"] => string(1) "4"      ["title"] => string(7) "test2_m"      ["content"] => string(4) "haha"      ["category"] => string(0) ""      ["area"] => string(6) "福建"      ["add_user"] => NULL      ["add_time"] => string(19) "2014-11-22 11:44:26"    }    [3] => array(7) {      ["id"] => string(1) "5"      ["title"] => string(2) "22"      ["content"] => NULL      ["category"] => string(0) ""      ["area"] => string(6) "福建"      ["add_user"] => NULL      ["add_time"] => string(19) "2014-11-22 12:40:58"    }    [4] => array(7) {      ["id"] => string(1) "6"      ["title"] => string(1) "1"      ["content"] => string(1) "2"      ["category"] => string(0) ""      ["area"] => string(6) "福建"      ["add_user"] => NULL      ["add_time"] => NULL    }    [5] => array(7) {      ["id"] => string(1) "7"      ["title"] => string(6) "lalala"      ["content"] => string(6) "hohoho"      ["category"] => string(0) ""      ["area"] => string(6) "北京"      ["add_user"] => NULL      ["add_time"] => NULL    }  }

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

项目:你要开发的系统,称之为项目。

 

D
函数用于快速实例化自定义模型,可以进行复杂的数据库操作,比如数据检验、数据缓存、数据加工等。自定义模型存放在
Lib/Model 目录下,例如为数据表 tpk_article
数据表建立模型映射,则需要创建 ArticleModel.class.php,然后使用 D
函数进行实例化,ArticleModel 模型将与 tpk_article 表进行映射。

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

今天先到这里,下一步我们继续循序渐进。让我们一起把这个Form最后变成一个有会员功能的留言板。

1 <?php
2 namespace AdminModel;
3 use AdminModelBaseModel;
4 
5 class TrunkModel extends BaseModel {

2.自定义模型

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

 

  自定义一个 Model,Model 中至少重新 TP 提供的 Model 中的
add、save、delete 和 select 方法。

<!DOCTYPE html>  <html>  <body>        <form method="post" action="__URL__/add">            <input type="text" name="title" placeholder="标题"><br><br>          <textarea name="content" id="content" placeholder="内容"></textarea><br><br>          <input type="submit" name="submit" value="提交">        </form>    </body>  </html>

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

3 将这个数组循环输出

无聊的需求

TP 对数据的插入和更新都做了高度封装:提供了 create()
方法用于创建数据对象。

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

然后我们打开Myapp/Lib/Action/IndexAction.class.php文件,将里面的内容删掉。改成下面这样:

  定义代码如下:

一、定义数据表模型

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

5 在www根目录下,创建一个PHP文件,起名index.php,这就是入口文件

  在使用 Java 的开源项目 JeeSite
时,养成了一个不好的习惯,习惯给每张表都增加
create_by、create_date、update_by、update_date、remarks 和 del_flag
这么几个字段。如果每张表都有这几个字段,那么对每张表进行 insert
时都会对以上的字段进行设置,对每张表进行 update
时都会对其中部分字段进行更新,对每条记录进行 delete 时都其实是对
del_flag 字段进行
置位。重复操作很多,一些操作方法被修改。那么,这个时候就要自定义一个自己的
Model 来作为项目的 基类 了,这个 Model 就负责干上面我说的那些事情了。

2.CURD

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

三创建数据表,并对项目进行配置,以便连接到数据库。

 1 <?php
 2 namespace AdminModel;
 3 use ThinkModel;
 4 
 5 /**
 6  * 项目中其他 Model 类的基类
 7  * 该类继承自 TP 提供的基类 Model
 8  */
 9 class BaseModel extends Model {
10     
11     /**
12      * 继承基类 Model 的 add 方法
13      * 自动插入 id create_by create_date update_by update_date del_flag
14      */
15     public function add($data='',$options=array(),$replace=false) {
16         
17         $data["id"]          = $this->getUuid();
18         $data["create_by"]   = "";
19         $data["create_date"] = date("Y-m-d H:i:s");
20         $data["update_by"]   = "";
21         $data["update_date"] = date("Y-m-d H:i:s");
22         $data["del_flag"]    = '0';
23         
24         return parent::add($data, $options, $replace);
25     }
26     
27     /**
28      * 获得 未删除 的所有数据
29      * 记录是否被删除通过 del_flag 字段来进行确定
30      */
31     public function select($options=array()) {
32         $map["del_flag"] = 0;
33         $this->where($map);
34         
35         return parent::select($options);
36     }
37     
38     /**
39      * 获取 全部 的所有数据
40      */
41     public function selectAll($options=array()) {
42         return parent::select($options);
43     }
44     
45     /**
46      * 更新数据
47      * 更新数据时,要更新 update_by update_date 两个字段
48      */
49     public function save($data='',$options=array()) {
50         $data["update_by"]   = "";
51         $data["update_date"] = date("Y-m-d H:i:s");
52         
53         return parent::save($data, $options);
54     }
55     
56     /**
57      * 删除也是更新
58      * 设置 删除 标志位即可
59      */
60     public function delete($data='',$options=array()) {
61         $data["del_flag"] = 1;
62         
63         return parent::save($data, $options);
64     }

同时视图代码:


Temp文件夹:数据缓存目录,存放项目中自动生成的项目运行缓存文件等,以及使用文件方式时的缓存文件等

自定义一个 Model

<?php  class ArticleModel extends Model{            public function article(){                $rows=$this->where("area='{$this->checkUserArea()}'")->select();          return $rows;      }        protected function checkUserArea(){                return "北京";          }

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

复制代码

  use 引入的命名空间是 AdminModelBaseModel ,因为我们定义的
BaseModel 的命名空间是 AdminModel,因为这里的 TrunkModel 和 BaseModel
在一个命名空间下,省去 use 也是可以的。

例:

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

简单实操:

 

<!DOCTYPE html>  <html>  <body>    <volist name="list" id="vo">      <li><{$vo.title}> - <{$vo.area}> - <{$vo.content}></li>  </volist>    </body>  </html>

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

这个系列,初步定下的目标为,从零开始,以TP示例中心中的Form为例进行讲解,以实践为主,理论为辅,
将TP的最基本内容逛一遍,至少让我们一起学会如何进行最简单的对数据进行查、增、改、删操作并输出到模板。

继承我们定义的基类

 

CURD知识之一 C 创建(create)

解释一下上面文字中所译的URL结构,
为什么appname项目名称我将它译成了入口文件位置:通常情况下,我们的入口文件index.php都是放在根目录中,这时项目名称就会被入口文件index.php所替代。在前几节里,我们已知道,一个Action文件就是一个应用模块,而应用模块中的每个方法(function)就是一个具体操作。因此,假如要访问我们实例中的Index模块下的index操作。地址应该是

例子结束。

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

4 提前先爽一下吧。再次利用PhpMyAdmin,在该表中插入一些数据
sql如下:

 

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

在Action类里面使用
assign方法对模板变量赋值,无论何种变量类型都统一使用assign赋值。

 

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

第四节 简单了解TP的模板输出

<?php    class IndexAction extends Action {            public function post(){            $articleObj = D("Article");          $data['title'] = $_POST['subject'];          $data['content'] = $_POST['textEdit'];          $data['add_time'] = date("Y-m-d H:i:s",time());            if($articleObj->data($data)->add()){                $this->success("数据添加成功");          }else{                $this->error("数据添加失败");          }      }  }

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

通常一个应用模块中,会有若干操作(function)需要有与用户交互的页面,这就需要用到模板输出,
TP本身已内置了一套具有TP特色的,很强大易扩展但应用非常方便兼简单的模板引擎。

 

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

  1. <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>
  2. <html>
  3. <head>
  4. <title>{$name}</title>
  5. </head>
  6. <body>
  7. 测试输出: {$name}
  8. </body>
  9. </html>
class IndexAction extends Action {          public function article(){        $obj=D("Article");      $rows=$obj->select();                  dump($rows);     }  }

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

  1. CREATE TABLE `think_form` (
  2.   `id` smallint(4) unsigned NOT NULL auto_increment,
  3.   `title` varchar(255) NOT NULL,
  4.   `content` varchar(255) NOT NULL,
  5.   `create_time` int(11) unsigned NOT NULL,
  6.   `update_time` int(11) unsigned NOT NULL,
  7.   `status` tinyint(1) unsigned NOT NULL,
  8.   `email` varchar(50) NOT NULL,
  9.   PRIMARY KEY  (`id`)

  10. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;

<?php  class IndexAction extends Action {        $obj=D("Article");      $rows=$obj->article();      $this->assign("list",$rows);      $this->display();

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

1
打开Myapp/Lib/Action/IndexAction.class.php文件,在index这个function下再添加一个操作test

 

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

在添砖加瓦之前,我们有必要认识一下各个文件夹的用途。

$rows=$obj->where("add_user='dee'")->order("add_time desc")->limit(10)->select();

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

打开Myapp文件夹,里面TP已让你很省心地构建了最基本的目录。其中:


  1. protected $_auto  =  array(
  2. array(‘create_time’,’time’,’ADD’,’function’),
  3. );
  1. <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>
  2. <html>
  3. <head>
  4. <title>{$name}</title>
  5. </head>
  6. <body>
  7. <iterate name=”array” id=”vo”>
  8. {$vo}<br />
  9. </iterate>

  10. </body>

  11. </html>

3.查询语言

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

对于TP的模板引擎输出先简单了解到这里。

如果没有提示错误即为成功。

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

名词解释:

 

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

这样,就可以在模板文件中同时输出name、email和phone三个变量。
2 我们使用上面的变量定义,将整个数组定义为一个模板变量来输出

参考资料:《PHP MVC 开发实战》

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

 

另一个例子:

复制代码

============================================

1.模型映射

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

Model:数据表相对应的Model类,可以理解为一个Model文件对应着你项目数据库的其中一个表。命名关系请参看这里:

附:数据表 tpk_article 的表结构为:

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

复制代码

create() 方法是连贯操作、CURD 操作的集合 (
包括数据创建、数据检验、表单验证、自动完成等 )。

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

  1. ^_^ Hello,欢迎使用ThinkPHP!

4.模型属性( Model )

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

 

例:添加数据

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

 

为了避免前台表单元素与数据库字段名相同而使数据库字段暴露,可以修改前台表单元素的
name,同时在 Model 中使用 _map 属性。代码:

  1. array(‘status’,’1′,’ADD’),
  1. INSERT INTO `think_form` (`id`, `title`, `content`,
    `create_time`, `update_time`, `status`, `email`) VALUES
  2. (1, ‘这是测试数据’, ‘dfdf’, 1212724876, 0, 1, ‘dddd@ddd.com’);

M(“User”) 就是模型映射,M 函数等于 new Model() ,Model
类是模型的基类,也是数据库操作的基类, “User”
是该类的一个成员属性,表示模型名称,模型名称与数据库中的数据表进行映射。注意:User
“U” 要大写,数据库中此时应该存在一张 user
表,系统会根据配置文件中的设置给 user 表添加前缀,例如
tpk_user。如果不需要为表添加前缀,将模型名称首字母改为小写,例如
M(“user”)。

复制代码

3.2 将Myapp/Tpl/default/Index/index.html代码更改如下:

发表评论

电子邮件地址不会被公开。 必填项已用*标注