自定义基类,ThinkPHP学习笔记1

   ThinkPHP 提供了三个 Model 类,供别的的 Model 进行后续。Model 类中是
MVC 中的模型类,它是调用 持久层
的上层类。感觉这样描述难点重重,然而有怎么着艺术吧?但是,这一个 Model
有时不只怕满足大家的部分供给,因而大家必要自定义二个 Model
类出来,可是自定义的 Model 同样要继续 TP 提供的 Model
类,而把大家自定义的 Model 类作为大家项目中的 Model
基类。小编怎么感觉自我在说绕口令,等等…笔者有点晕。

多年来可比绕有趣味地上学PHP,看完了部分基础语法、学会了利用SMALX570Y模版,继而看了ThinkPHP框架,

//TP 恶补ing... 

—恢复生机内容初始—

 

此框架的兵不血刃超出本身的奇怪,它的RO君越真是强,还有内置的CRUD,比JAVA的框架更智能。

一 、定义数据表模型

前言
TP的手册11分多,其实不必再出那样的贴子,论技术,作者也是菜鸟2个,同时也在就学其中。
观看论坛上多了很多新对象,不少在抱怨手册看不懂,那自身就姑且进行试探,尝试与新对象们更简约地、手把手地进去TP的行使中去。讲解进程中有错的地点,我们扶助指正。

百无聊赖的急需

便宜回忆性的求学转发了一些以下文章

1.模型映射

本条类别,先导定下的对象为,从零开始,以TP示例大旨中的Form为例举办教学,以实践为主,理论为辅,
将TP的最宗旨内容逛二遍,至少让我们一起学会怎样实行最简易的对数码进行查、增、改、删操作并出口到模板。

  在应用 Java 的开源项目 JeeSite
时,养成了二个糟糕的习惯,习惯给每张表都增加create_by、create_date、update_by、update_date、remarks 和 del_flag
这么多少个字段。要是每张表都有那多少个字段,那么对每张表进行 insert
时都会对以上的字段进行设置,对每张表进行 update
时都会对内部一些字段进展翻新,对每条记下实行 delete 时都其实是对
del_flag 字段进展
置位。重复操作很多,一些操作方法被涂改。那么,这么些时候就要自定义3个和谐的
Model 来作为项指标 基类 了,那么些 Model 就承受干下边笔者说的那多少个事情了。

CU路虎极光D知识之一 C 创设(create)

要测试数据库是还是不是正规连接,最直白的措施就是在近年来控制器中实例化数据表,然后使用
dump 函数输出,查看数据库的链接状态。代码:

鉴于大家说的是渐进,所以自身用步骤式来验证,只要一步一步跟着做,相信聪明的您在使用进度中就会驾驭TP的使用了。

 

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

public function testdb(){        $obj=M("User");      dump($obj);  }

在意:以下的步子,仅仅是TP灵活的布置情势之中一种,实际开发中能够依照自身的情况去重新设定。
关于怎么那么做,大家会在最终再作总计,笔者觉得先实际操作然后再展开求证相比较便于了然。以下不再另行解释。

自定义叁个 Model

2  模型对象:即数据对象,你项目里每3个Model类文件都会对应着1个数据表(可能视图),模型与数据表存在一种炫耀关系。TP约定了命名要遵从一定的规范,如若不合乎,则供给基于气象展开额外的附和设置。例如Model类的tableName属性

此刻浏览器输出:

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

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

在第四节时,曾略为涉嫌Model类文件命名,现在再回想一下这有的的内容:
大家以前在数据库中,已确立了叁个think_form数据库表,并且在布置文件config.php中,大家定义了数据表的前缀是think_,
模型类(Model)文件的命名规则是:

www.5929.com 1www.5929.com 2

一  高效开端三个类型

  定义代码如下:

不包罗前缀的数据库表表名还要首字母大写+Model.class.php

object(Model)#5 (20) {    ["_extModel:private"] => NULL    ["db:protected"] => object(DbMysql)#7 (18) {      ["dbType:protected"] => string(5) "MYSQL"      ["autoFree:protected"] => bool(false)      ["model:protected"] => string(7) "_think_"      ["pconnect:protected"] => bool(false)      ["queryStr:protected"] => string(28) "SHOW COLUMNS FROM `tpk_user`"      ["modelSql:protected"] => array(1) {        ["user"] => string(28) "SHOW COLUMNS FROM `tpk_user`"      }      ["lastInsID:protected"] => NULL      ["numRows:protected"] => int(2)      ["numCols:protected"] => int(0)      ["transTimes:protected"] => int(0)      ["error:protected"] => string(0) ""      ["linkID:protected"] => array(1) {        [0] => resource(27) of type (mysql link)      }      ["_linkID:protected"] => resource(27) of type (mysql link)      ["queryID:protected"] => resource(28) of type (mysql result)      ["connected:protected"] => bool(true)      ["comparison:protected"] => array(10) {        ["eq"] => string(1) "="        ["neq"] => string(2) "<>"        ["gt"] => string(1) ">"        ["egt"] => string(2) ">="        ["lt"] => string(1) "<"        ["elt"] => string(2) "<="        ["notlike"] => string(8) "NOT LIKE"        ["like"] => string(4) "LIKE"        ["in"] => string(2) "IN"        ["notin"] => string(6) "NOT IN"      }      ["selectSql:protected"] => string(96) "SELECT%DISTINCT% %FIELD% FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%%LIMIT% %UNION%%COMMENT%"      ["bind:protected"] => array(0) {      }    }    ["pk:protected"] => string(2) "id"    ["tablePrefix:protected"] => string(4) "tpk_"    ["name:protected"] => string(4) "user"    ["dbName:protected"] => string(0) ""    ["connection:protected"] => string(0) ""    ["tableName:protected"] => string(0) ""    ["trueTableName:protected"] => string(8) "tpk_user"    ["error:protected"] => string(0) ""    ["fields:protected"] => array(5) {      [0] => string(2) "id"      [1] => string(8) "username"      ["_autoinc"] => bool(true)      ["_pk"] => string(2) "id"      ["_type"] => array(2) {        ["id"] => string(7) "int(11)"        ["username"] => string(11) "varchar(20)"      }    }    ["data:protected"] => array(0) {    }    ["options:protected"] => array(0) {    }    ["_validate:protected"] => array(0) {    }    ["_auto:protected"] => array(0) {    }    ["_map:protected"] => array(0) {    }    ["_scope:protected"] => array(0) {    }    ["autoCheckFields:protected"] => bool(true)    ["patchValidate:protected"] => bool(false)    ["methods:protected"] => array(13) {      [0] => string(5) "table"      [1] => string(5) "order"      [2] => string(5) "alias"      [3] => string(6) "having"      [4] => string(5) "group"      [5] => string(4) "lock"      [6] => string(8) "distinct"      [7] => string(4) "auto"      [8] => string(6) "filter"      [9] => string(8) "validate"      [10] => string(6) "result"      [11] => string(4) "bind"      [12] => string(5) "token"    }  }

名词解释:

 1 <?php
 2 namespace Admin\Model;
 3 use Think\Model;
 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     }

于是后面我们为think_form数据表在Myapp/Lib/Model目录下创设1个文书FormModel.class.php

品类:你要支付的体系,称之为项目。

  这样,大家的 BaseModel 就定义好了,未来项目中的 Model 就不再接续 TP
的 Model 类了,而是继续我们自定义的 BaseModel 了。

模型类的奇异命名还是能智能识别驼峰式的表命名,借使大家有个是近乎think_new_table那样的表
能够命名为NewTableModel.class.php。私下认可配置便足以智能识别自动对应think_new_table表,因而不用修改配置。

倘若没有提醒错误即为成功。

输入文件:你能够清楚为那么些类型的绝无仅有一道门,以往全数的操作都会通过那道门去履行处理。
无须理会什么意思,你居然能够先把它当作是index.php正是进口文件

 

支付进度中,只要简单地定义好与数据表对应的模型类(xxxModel.class.php),就能够展开对数据操作了。
哪些让这么些模型支撑活动验证,自动填充,自动过滤那么些知识,在上面涉及到时会作相应讲解。

M(“User”) 正是模型映射,M 函数等于 new Model() ,Model
类是模型的基类,也是数据库操作的基类, “User”
是此类的贰个分子属性,表示模型名称,模型名称与数据库中的数据表举办映射。注意:User
“U” 要大写,数据库中此时应有留存一张 user
表,系统会依照铺排文件中的设置给 user 表添加前缀,例如
tpk_user。假如不要求为表添加前缀,将模型名称首字母改为小写,例如
M(“user”)。

TP: ThinkPHP框架的简称

继续大家定义的基类

诚如的话,在表中添加多少都以通过表单来确立,为了更直观地上学CURAV4D中的C,大家接下去建立个表单来展开添加数据的操作。
后面我们已在Myapp/Lib/Model/下树立好FormModel.class.php类—-模型(M)
还要也在Myapp/Lib/Action/下添加了多少个Index应用模块和写下了3个index操作—-控制器(C)
与此同时在Tpl目录下建立了与之对应的沙盘目录Index及index.html模板文件 ——-视图(V)
MVC格局的支出已反映了出来。
tdweb曾简要地包括了TP中那三者的涉及,

 

1 下载TP1.5正式版

  继承的 BaseModel 的措施和继承 Model 的措施是千篇一律的,只是利用 use
引入命名空间到当前效益域时的内需修改为我们的命名空间,而不是再去接纳 TP
提供的命名空间。代码如下:

C的效果,正是从M中取得数据到V,

2.自定义模型

2 拟好你的项目名称,大家那里以 Myapp 为项目名称

1 <?php
2 namespace Admin\Model;
3 use Admin\Model\BaseModel;
4 
5 class TrunkModel extends BaseModel {

应用TP以表单提交数据到库,流程和你所理解的表单提交没有怎么不一致,只是TP简化了多少操作的处理进度。
作者们在实操中体味一下。
先来看望我们所定义的多少表form的字段:

D
函数用于快速实例化自定义模型,能够开始展览复杂的数据库操作,比如数据印证、数据缓存、数据加工等。自定义模型存放在
Lib/Model 目录下,例如为多少表 tpk_article
数据表建立模型映射,则须要创建 ArticleModel.class.php,然后采取 D
函数举行实例化,ArticleModel 模型将与 tpk_article 表举办映射。

3 在www根目录下,将TP框架全部文件全体复制过去,文件夹名称是ThinkPHP

  use 引入的命名空间是 Admin\Model\BaseModel ,因为大家定义的
BaseModel 的命名空间是 Admin\Model,因为此处的 TrunkModel 和 BaseModel
在一个命名空间下,省去 use 也是足以的。

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

例:使用 select() 输出 tpk_article 表的数据 ( select()
方法用于列出具有符合条件的数据 ) :

4 与ThinkPHP同级新建一个文书夹,起名为 Myapp,也正是项目名称

 

复制代码

class IndexAction extends Action {          public function article(){        $obj=D("Article");      $rows=$obj->select();                  dump($rows);     }  }

5 在www根目录下,创设三个PHP文件,起名index.php,那正是进口文件

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

其中的create_time字段是为了记录数据插入的光阴,大家能够动用TP的数额自动填充来处理。

浏览器输出:

自定义基类,ThinkPHP学习笔记1。输入文件index.php代码:

在Model类定义 $_auto
属性,能够形成多少自动处理效果,用来处理暗中同意值和别的 onclick=”tagshow(event)”>系统写入字段。
小心1:该活动填写或许会覆盖表单提交项目。其目标是为了防患表单违法提交字段。
注意2:要选用Model类的create方法创造数量对象的时候才会自动实行表单数据处理。

www.5929.com 3www.5929.com 4

  1. <?php
  2.     // 定义ThinkPHP路径
  3.     define(‘THINK_PATH’,’./ThinkPHP’);
  4.     // 定义项目名称
  5.     define(‘APP_NAME’,’Myapp’);
  6.     // 定义项目路线
  7.     define(‘APP_PATH’,’./Myapp’);
  8.     // 加载入口文件
  9.     require(THINK_PATH.’/ThinkPHP.php’);
    1.     // 实例化那个类型
    1.     $App = new App();
    1.     // 执行初步化
    1.     $App->run();
  10. ?>

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

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    }  }

复制代码

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

就那样简单几行,然后打开浏览器,输入
一个TP项目就这么创设出来了。你会看到

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

 

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

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

例2:让 tpk_article 表的剧情据他们说客户所在的地带展现当地的情报:

复制代码

填充字段:便是内需进行处理的表单字段,那个字段并不一定如果数据库表中的字段,对于表单内的推抢检查和测试字段比如重复密码和验证码也能够拍卖。
填充条件:ADD | UPDATE | ALL(注意,此是1.5版本表明,1.6已改为1 2
3,后续教程有表达)
当为ADD时,会在增加产量多少时自动填充,那是暗许的处理格局
当为UPDATE时,在更新数据的时候会自动填写
当为ALL时,全体情形下都会开始展览自动填写

ArticleModel.class.php:

这行字。并机关为您成立好项目标目录。接下来,我们这些类型添砖加瓦。

叠加规则:外加规则是针对填充内容而言,表示该内容填充的主意,包蕴function,callback,田野,string
对此田野先生使用此外字段实行填空和string直接标示字符串作为值举办填写很好明白。例如地点

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

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

  1. array(‘status’,’1′,’ADD’),

控制器代码:

二简约认识项目里的依次文件夹

复制代码

IndexAction.class.php:

名词解释:

不怕将气象status字段的值直接以1填充.

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

Action:模块控制器类,你暂且可以领略为3个Action文件表示着1个施用模块,Action文件中的每个形式(function)代表着八个操作,操作分为有出口到模板的操作和只具执行不必要输出的操作。对于有出口的操作,则代表了你的种类中1个出示给用户选用的web页面。(注意:那不是正式的术语解释)

上面重要说说function与callback那七个叠加规则。

而且视图代码:

Model:数据表相对应的Model类,能够明白为贰个Model文件对应着您项目数据库的里边三个表。命名关系请参见这里:

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

TPL/Index/article.html:

在添砖加瓦在此以前,咱们有必不可少认识一下顺序文件夹的用途。

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

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

打开Myapp文件夹,里面TP已让您很便捷地构建了最基本的目录。在那之中:

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

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

Cache文件夹:项目自动生成的模板缓存会油然则生在那里

当使用function作为附加规则时,第2个填充内容就表示了这一个因子是1个函数名称,该函数的参数便是象征填充字段的值,比如password的值是123456,则下边包车型大巴代码会先将以此值使用函数md5(‘123456’),那样处理后再插入到数据表中去。
对此function(函数)和callback(回调方法)理论是相同的,只然而3个是象征填充内容所写的是函数名,另三个是代表填充内容是类中的方法名。函数能够是PHP5内置函数或你本人所写的函数。而callback是当前模型类所能调用的3个格局。 关于数据填充方面包车型客车详细资料,请参见官方使用手册
《ThinkPHP数据操作指南》

www.5929.com 5

Common文件夹:你的品类中要用到的友好写的函数,可以在这么些文件夹下创立一个名为common.php文件,
在那几个文件中书写函数,那一个函数能够用在您项指标顺序类,同时也足以在模板变量中选拔,TP框架会活动加载。

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

小结:自定义模型映射,3个模型对应二个数据表,全部增加和删除改查都在模型类中完毕。M
实例化的参数是数据库的表名,D 实例化的是投机在 model
文件夹下建立的模子文件。

Conf文件夹:项指标周转配置文件config.php将身处那一个文件夹里,(还有路由配置,调节和测试配置等,请先忽略)

  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” ></textarea>
  19.     </p>
  20.     <p><input type=”submit” value=”提交” /></p>
  21. </form>
    </body>
    </html>

 

自定义基类,ThinkPHP学习笔记1。Data文件夹:TP会把品种的数据库表字段生成到那边,此外。。。那二个先不要理会。

在地点代码中,大家简要地建了2个form表单,并将题目统一行使二个模板变量{$title}。
action提交到的拍卖地点是__URL__/add,其中__URL__是一个常量定义,表示近期模块地址,TP模板引擎会活动将那句解释为/index.php/Index/add,常见的模板使用的常量有

3.create 方法

Lang文件夹:项指标言语设置目录,先不要理会。

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

TP 对数据的插入和创新都做了惊人封装:提供了 create()
方法用于成立数量对象。

Lib文件夹:应用类库目录,在这文件夹内还有八个文本夹:Action和Model,Action目录放置命名为xxxAction.class.php的控制器文件,Model目录放置对应数据库表的命名为xxxModel.class.php的类公事。

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

概念:数据对象 ——
数据字段与数据表之间的涉及,数据会被映射为类成员,再与数码表映射,最后达成数据的插入或更新。

Logs文件夹:项目中活动发出的日志文件会存放在此地。暂不必理会。

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

create() 方法是贯通操作、CU帕杰罗D 操作的集合 (
包涵数据创造、数据印证、表单验证、自动完成等 )。

Temp文件夹:数据缓存目录,存放项目中自动生成的种类运维缓存文件等,以及采取文件措施时的缓存文件等

  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 >返
    回</A> ]’);
  16.          }
  17.     }
  18. }//类定义 end
  19. ?>

cerate() 的数据源由 POST 表单提供,比如表单中有 username
表单成分,则该因素会被电动映射为数据表中的 username
字段。数据对象创造成功之后,对象被寄放于内部存款和储蓄器中。

Tpl文件夹:模板文件目录,内有一个default文件夹,也正是私下认可的风骨。
连串变更的目录结构就先简单介绍到此地,下一步大家要容易地对品种展开最中央的配置。

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

例:添加数量

三创建数据表,并对品种展开配置,以便连接到数据库。

笔者们来看看add方法的代码。
$Form = D(“Form”);
那里运用了TP的特点单字母函数D,是操作数据库时最常用的TP函数,表示实例化Form对象,
即$Form = new FormModel();
D函数的切实可行代码能够查看ThinkPHP目录内的common/function.php中的片段,
它会自行引入Model类,并认清从前要是实例化过这几个Model,就不再实例化,若然该Model不存在,就会抛出13分错误,别的,D能够跨体系访问Model,一时半刻忽略。

控制器:IndexAction,动作:add_article,代码:

1
大家这边运用的是Mysql数据库,利用PhpMyadmin新建叁个数据库,名称为myapp。
运用示例大旨中的sql如下:

$Form->create()
使用Model类的Create方法创设二个Form对象,战败会回来false。

IndexAction.class.php:

  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 ;

$Form->add(); //add方法会将表单数据实行写入
$this->redirect(); //执行跳转
就那样简单几行代码,便不假思索了对数码插入的拍卖。

<?php  class IndexAction extends Action {        Public function add_article(){            $this->display();      }  }

复制代码


视图: Tpl/Index/add_article.html:

2
在Conf文件夹内,建立一个config.php文件。那个文件,正是Myapp项指标安顿文件。系统会自动加载
config.php文件中的配置是以数组再次来到格局开始展览定义,会覆盖TP框架中的common目录下convention.php的暗许配置。没有设置的配置,就以私下认可为准。配置安装能够运用C函数动态改变,一时半刻不必理会。
而作者辈连接受数据库的装置也是在那几个文件中书写。

<!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>

config.php代码如下:

__URL__/add 代表近年来控制器的 add 动作。

  1. <?php
  2. if (!defined(‘THINK_PATH’)) exit();
  3. return array(
  4. ‘DB_TYPE’=>’mysql’, // 使用的数据库是mysql
  5. ‘DB_HOST’=>’localhost’,
  6. ‘DB_NAME’=>’myapp’,// 数据库名
  7. ‘DB_USER’=>’root’,
  8. ‘DB_PWD’=>’123456’,// 填写您总是数据库的密码
  9. ‘DB_PORT’=>’3306’,

  10. ‘DB_PREFIX’=>’think_’, // 数据表表名的前缀
    请参见

  11. );

  12. ?>

add 动作代码:

复制代码

<?php  class IndexAction extends Action {        public function add(){            //表单处理          $articleObj = M('Article');          $articleObj->create();          $articleObj->add_time = date("Y-m-d H:i:s",time());          if($articleObj->add()){                $this->success("数据添加成功");          }else{                $this->error("数据添加失败");          }  }

权且正是那般,后边会再依据须求进一步助长和教师。

事例停止。

3
在Lib/Model目录下,创立二个文本,命名为FormModel.class.php。命名规则刚才您已看了五次。
此地就不再多说,我们得以看到,数据表名是think_form,由于我们配备了数据表表名的前缀为think_,
之所以文件的命名直接使用 “不含前缀的数额表表名+Model.class.php”就行了。
在这么些文件中书写代码:

 

  1.  
  2. <?php
  3. class FormModel extends Model {
  4. }
  5. ?>

4.模子属性( Model )

复制代码

 _map 属性:字段映射

就那样定义2个类名就行了。该类继承了Model类。至于自动验证,自动过滤,自动填写那些,暂时不理会。

为了防止前台表单成分与数据库字段名相同而使数据库字段揭发,能够修改前台表单成分的
name,同时在 Model 中央银行使 _map 属性。代码:

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

视图:Tpl/Index/add_article.html:

  1. INSERT INTO `think_form` (`id`, `title`, `www.5929.com,content`,
    `create_time`, `update_time`, `status`, `email`) VALUES
  2. (1, ‘那是测试数据’, ‘dfdf’, 1212724876, 0, 1, ‘dddd@ddd.com’);
<!DOCTYPE html>  <html>  <body>        <form method="post" action="__URL__/add">            <input type="text" name="subject" placeholder="标题"><br><br>          <textarea name="textEdit" id="content" placeholder="内容"></textarea><br><br>           <input type="submit" name="submit" value="提交">        </form>    </body>  </html>

复制代码

模型:ArticleModel.class.php:

接下来大家打开Myapp/Lib/Action/IndexAction.class.php文件,将内部的内容删掉。改成上边那样:

<?php  class ArticleModel extends Model{        //使用_map属性(字段映射)将表单元素映射为相应表字段      protected $_map = array(                    "subject"=>"title",          "textEdit"=>"content"      );    }
  1. <?php
  2. class IndexAction extends Action{
  3.     public function index(){
  4.         $form = D(‘Form’)->findall();
  5.         dump ( $form );
  6.         exit;
  7.     }
  8. }
  9. ?>

控制器:IndexAction.class.php:

复制代码

<?php    class IndexAction extends Action {            $articleObj = D("Article");          $articleObj->create();          $articleObj->add_time = date("Y-m-d H:i:s",time());          if($articleObj->add()){                        $this->success("数据添加成功");          }else{                        $this->error("数据添加失败");          }  }

开拓浏览器,输入

事例截至。

明日先到那里,下一步大家一连稳步前进。让大家联合把这一个Form最终成为贰个有会员功能的留言板。

 

 

贰 、基础模型

 

1.连贯操作

[教程] 一步一步鲁人持竿学习TP二(新手篇)

贯穿方法除了 select() 方法外,别的的贯通方法不区分前后相继。

 

例:

鉴于岁月涉及,此系列联合学习课程更新的快慢会相比慢些,请多包蕴,上一章节的始末请看这里。

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

 

PHP开发,无非是对数据库使用了逻辑控制的增加和删除改查和行使模板输出数据内容。
常见数据的插入都以经过表单来进展添加。表单提交涉及到页面突显,
之所以这一节我们一时放下对数据库的操作讲解,先来大概学习一下TP的模板引擎的变量输出。

2.CURD

第二节不难理解TP的模板输出
上一章节大家提及到,

① 创造数量 add()

TP中的每3个xxxAction.class.php文件表示着3个使用模块,此Action中的每2个办法(function)代表着贰个操作,操作分为有出口到模板的操作和只具执行不要求输出的操作。

<?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->add($data)){                $this->success("数据添加成功");          }else{                $this->error("数据添加失败");          }      }  }

开辟Myapp/Lib/Action/IndexAction.class.php文件,大家看看里面包车型地铁底蕴代码

另三个例子:

  1. class IndexAction extends Action{
  2.     public function index(){
  3.     }
  4. }
<?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("数据添加失败");          }      }  }

复制代码

 

理论知识:

② 更新数据 save()

1
在TP开发中,要追加一个应用模块,就在Action文件夹里建立三个类,类的文件命名格式是模块名称+Action.class.php。例如大家那边的利用模块是Index,所以定义文件名为IndexAction.class.php

<?php    class IndexAction extends Action {      public function post2(){            $articleObj = M("Article");          $data['id'] = 2;          $data['title'] = $_POST['subject'];          $data['content'] = $_POST['textEdit'];          $data['area'] = '河北';          $data['add_time'] = date("Y-m-d H:i:s",time());          if($articleObj->save($data)){                $this->success("数据修改成功");          }else{                $this->error("数据修改失败");          }      }  }

2
应用模块类的概念要一连框架的Action类。要为这些利用模块添加四个操作,则定义三个以此操作为命名的function.例如地点的index操作。

 

经常三个选用模块中,会有好多操作(function)需求有与用户交互的页面,那就须要使用模板输出,
TP本身已停放了一套拥有TP特色的,很有力易扩充但利用尤其有利于兼简单的模板引擎。

 

在相应模块中,即便有个别操作是索要页面突显的,只要对应在Myapp/Tpl/default/里建立2个文本夹,文件夹以利用模块的名称来命名,然后在这几个文件夹下,建立三个以这一个function名称来定名的html文件,就能够在这一个主意中央银行使$this->display()方法来一向调用该模板。(当然也得以调用别的模块下的任何模板或显式钦赐模板文件地方和名称,由于是奉公守法式的读书,就让大家先忽略吧)

③ 读取数据 select 和 getFiled

打探那几个理论后,大家先简单实操一下这几个知识。

getField 例子:

1
在Myapp/Tpl/default/下树立2个文本夹,依照使用模块的称号,大家将以此文件夹命名为Index

<?php    class IndexAction extends Action {        public function post3(){            $articleObj = M("Article");          if($articleObj->where("id=3")->setField("content","{$_POST['subject']}")){                $this->success("数据修改成功");          }else{                $this->error("数据修改失败");          }      }  }

2
在Myapp/Tpl/default/Index/下树立三个html文件,依据操作名称,我们命名该公文为index.html

 

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

④ 删除数据 delete

  1. <?php
  2. class IndexAction extends Action{
  3.     public function index(){
  4.         $value  =   ‘hello,ThinkPHP’;
  5.         $this->assign(‘name’,$value);
  6.         $this->display();
  7.     }
  8. }
  9. ?>
<?php    class IndexAction extends Action {            public function delete(){            $articleObj = M("Article");          if($articleObj->where("id=".$_GET['id'])->delete()){                $this->success("数据删除成功");          }else{                $this->error("数据删除失败");          }      }  }

复制代码

 

代码知识要点(摘自手册:ThinkPHP模板指南,此后的学识要点均源于TP官方手册,不再证明)

3.查询语言

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

例子:

  1. $this->assign(‘name’,$value);
<?php    class IndexAction extends Action {        public function archives(){            $obj = M("Archives");  //      $data['writer'] = array("eq","网络营销中心");  //      $data['title'] = array("like","精诚%");          $data['id'] = array("lt","100");          $rows=$obj->where($data)->select();            $count=$obj->where($data)->count();          $tb=C("DB_PREFIX");            $this->assign("list",$rows);          $this->assign("count",$count);          $this->assign("tb",$tb);          $this->display("Article");      }            public function archives2(){            $obj = M("Archives");          $data['id'] = array(array("lt","1034"),array("GT","1029"),"and");          $rows=$obj->where($data)->select();          $this->assign("list",$rows);          $this->display("Article");      }  }

复制代码

 

// 上边包车型客车写法是均等的

能够在控制器中利用 echo $obj->getLastSql(); 查看转换后的 SQL 语句。

  1. $this->name = $value ;

 

复制代码

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

//
模板变量赋值后就需求调用模板文件来输出相关的变量,模板调用通过display方法来兑现

 

  1. $this->display();

复制代码

4 打开Myapp/Tpl/default/Index/index.html文件,代码为

  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>

复制代码

代码知识要点:
模板变量使用{$变量名称}那种标签进行输出。
不等的沙盘变量类型,使用分歧的竹签,标签能够自动此外定义,暂时不理会。

5
打开浏览器输入地方:
外加补充知识:
1 若是要同时输出八个模板变量,能够运用上边包车型客车办法:

  1. $array = array();
  2. $array[‘name’]    =    ‘thinkphp’;
  3. $array[’email’]   =    ‘liu21st@gmail.com’;
  4. $array[‘phone’]   =    ‘12335678’;
  5. $this->assign($array);

复制代码

诸如此类,就能够在模板文件中还要输出name、email和phone四个变量。
2 大家利用方面包车型地铁变量定义,将总体数组定义为3个模板变量来输出

  1. $array = array();
  2. $array[‘name’]    =    ‘thinkphp’;
  3. $array[’email’]   =    ‘liu21st@gmail.com’;
  4. $array[‘phone’]   =    ‘12335678’;
  5. $this->assign(‘array’,$array);
  6. $this->display();

复制代码

在html中,要输出$array[‘name’]的值,代码是

  1. {$array.name} 或 {$array[‘name’]}

复制代码

3 将以此数组循环输出

3.1 IndexAction.class.php中代码更改如下

  1. <?php
  2. class IndexAction extends Action{
  3.     public function index(){
  4.         $array = array();
  5.         $array[‘name’]    =    ‘thinkphp’;
  6.         $array[’email’]   =    ‘liu21st@gmail.com’;
  7.         $array[‘phone’]   =    ‘12335678’;
  8.         $value  =   ‘hello,ThinkPHP’;
  9.         $this->assign(‘array’,$array);
    1.         $this->assign(‘name’,$value);
    1.         $this->display();
    1.     }
  10. }

  11. ?>

复制代码

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

  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>

复制代码

代码知识要点:
name=’array’是指要循环的沙盘变量是array,id=’vo’是指那几个数量在模板输出时所选拔的名目

对于TP的模版引擎输出先不难精晓到此地。

 

 

 

 

[教程] 一步一步安分守己学习TP三(新手篇)

 

先是节  飞速起初三个门类

第三节 简单认识项目里的逐条文件夹

其三节 配置项目,连接数据库。

第二节 不难询问TP的模板输出

第4节开始明白UTucsonL怎么样访问模块操作

透过前面包车型客车求学,大家已大体地通晓了应用模块中的操作与模板怎么着对应。
而这一节将不难讲解怎样通过UTiggoL来拜访操作。由于我们要绳趋尺步,所以先只介绍下边章节要用到的文化,要想深远学习还请参见官方手册《ULX570L设计和SEO支持》

TP辅助多样USportageL访问方式,暗中同意是智能形式,所以我们就那种形式展开简单表达。

智能形式下的URubiconL基本结构是那样的

你可以清楚为
http:// 服务器地址 / 入口文件地点 / 应用模块名称 /具体操作名称/ GET变量参数

解释一下上面文字中所译的UQashqaiL结构,
为何appname项目名称作者将它译成了入口文件地方:平时景况下,大家的输入文件index.php都是放在根目录中,那时项目名称就会被进口文件index.php所替代。在前几节里,大家已知道,二个Action文件就是二个利用模块,而利用模块中的各类方法(function)便是一个具体操作。由此,假设要拜访大家实例中的Index模块下的index操作。地址应该是

假若输入文件不是在服务器的根目录,而是在myapp目录下,那么入口文件地点就是Myapp/index.php,此时方面的U帕杰罗L访问就相应要换成

那样说应该很通晓了,然而别让这么多index给混乱咯,对应UTucsonL的结构去明白每多少个index的函义,同时注意分寸写

简简单单实际操作:

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

  1. <?php
  2. class IndexAction extends Action{
  3.     public function index(){
  4.         $array = array();
  5.         $array[‘name’]    =    ‘thinkphp’;
  6.         $array[’email’]   =    ‘liu21st@gmail.com’;
  7.         $array[‘phone’]   =    ‘12335678’;
  8.         $value  =   ‘hello,ThinkPHP’;
  9.         $this->assign(‘array’,$array);
    1.         $this->assign(‘name’,$value);
    1.         $this->display();
    1.     }
    1.     public function test(){
    1.         header(“Content-Type:text/html; charset=utf-8”);
    1.         echo ‘哈,访问正确!!’;
    1.     }
  10. } // 类定义end

  11. ?>

复制代码

2
尝试对应U汉兰达L结构,来访问那么些test操作,即使能不负众望看到echo的文字。则那节大家又学会了多或多或少学问。

外加知识点:
    去掉URL里面的index.php
    要去掉UQX56L里的进口文件index.php,使U陆风X8L类似这样的情势 
 
    能够按法定手册所提供的点子举行如下操作。
    1 肯定httpd.conf配置文件中加载了mod_rewrite.so模块
    2 AllowOverride None 将None改为 All
    3 打开Myapp/Conf/config.php文件,在布局的数组中添加一行:
    ‘URL_MODEL’=>2,
    在进口文件所在的同级目录下,新建三个.htaccess文本,内容是

  1.     <IfModule mod_rewrite.c>
  2.     RewriteEngine on
  3.     RewriteCond %{REQUEST_FILENAME} !-d
  4.     RewriteCond %{REQUEST_FILENAME} !-f
  5.     RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
  6.     </IfModule>

复制代码

假诺您的服务器环境援助rewrite,使用
    此后大家的求学中用到的UHavalL,都以只要你选拔了rewrite的情况。

第伍节 CU中华VD知识之一 C 创造(create)

 

.htaccess.rar (248 Bytes)

 

 

 

[教程] 一步一步循途守辙学习TP四(新手篇)

 

首先节  急忙起首三个种类

其次节 不难认识项目里的相继文件夹

其三节 配置项目,连接数据库。

第三节 简单驾驭TP的模版输出

第⑥节 先河摸底U奥迪Q3L怎么样访问模块操作

留意:看到众多留言说操作不成功或出错,请别忘记,此类别教程出来时,TP1.6还没出去,所以一连串6事先所介绍的示范和操作都依然专业版本1.5的,假诺你采纳1.6版,请对应两者差别性。
例如submit不能够有name属性,是因为原本1.5有字段缓存进行过滤处理。1.6不曾了字段缓存。
譬如说数据自动验证和自动填写都有了自然的不一致。

有关1.6的施用能够下载急速入门教程,是此类别新手篇的总体版,并且附有示例源码。

第六节 CU讴歌MDXD知识之一 C 创建(create)

从这一节开始,我们就要涉及到数据库操作,TP对数据库的操作十一分省事,以下是局地基础知识讲解。

名词解析:
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),就足以进行对数码操作了。
哪些让这么些模型支撑自动验证,自动填充,自动过滤那一个知识,在上面涉及到时会作相应讲解。

一般的话,在表中添加多少都以因此表单来确立,为了更直观地球科学习CUENVISIOND中的C,大家接下去建立个表单来举办添加数据的操作。
从前大家已在Myapp/Lib/Model/下建立好FormModel.class.php类—-模型(M)
同时也在Myapp/Lib/Action/下添加了1个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,田野先生,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作为附加规则时,第二个填充内容就象征了那几个因子是2个函数名称,该函数的参数正是象征填充字段的值,比如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>
    1.            <input name=”title” type=”text” id=”title” />
    1.     </p>
    1.     <p>
    1.            <label for=”email”>邮箱:</label>
    1.           <input name=”email” type=”text” id=”email” />
    1.     </p>
    1.     <p><label
      for=”content”>内容:</label></p>
    1.     <p>
    1.         <textarea name=”content” rows=”5″ cols=”25″
      id=”content” class=”textarea” ></textarea>
    1.     </p>
    1.     <p><input type=”submit” value=”提交”
      /></p>
  10. </form>

  11. </body>

  12. </html>

复制代码

在上头代码中,咱们简要地建了一个form表单,并将标题统一行使二个模板变量{$title}。
action提交到的拍卖地点是__URL__/add,其中__URL__是1个常量定义,表示最近模块地址,TP模板引擎会自动将那句解释为/index.php/Index/add,常见的沙盘使用的常量有

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

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

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

  1.  
  2. <?php
  3. class IndexAction extends Action{
  4.     public function index() {
  5.        
       $this->assign(‘title’,’添加数据’);//这里安装了模版变量{$title}
  6.            $this->display();
  7.     }
  8.     // 处理表单数据的法子
  9.     function add()  {
    1.           $Form = D(“Form”);
    1.           if($Form->create()) {
    1.                    $Form->add();
    1.                    $this->redirect();
    1.           }else{
    1.                    header(“Content-Type:text/html;
      charset=utf-8”);
    1.                    exit($Form->getError().’ [ <A
      HREF=”javascript:history.back()”>返 回</A> ]’);
    1.          }
    1.     }
  10. }//类定义 end

  11. ?>

复制代码

代码知识要点:
模板变量赋值前面包车型地铁章节已介绍过。那里就不啰嗦了。

我们来探视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(); //执行跳转
就这样简单几行代码,便形成了对数据插入的处理。
现行大家能够尝试一下在表单中输入数据开始展览付出试试了。
请先随便插入几条数据,以便下一节我们继续攻读CU奇骏D中的中华V

 

 

 

[教程] 一步一步鲁人持竿学TP五(从标准版过渡到1.6版)

很对不起!不得不出这一篇过渡小说。
为了让这一种类教程不致于日后会误导,从那节开端,让大家转型到1.6版的施用格局上。
唯独对于1.6版的选用,笔者也是在探寻个中学习,错误和不足之处肯定会相比较多,
故恳请小运哥哥和tdweb,东至,yhustc等大大能够马上指正和补偿,在此先感谢了。

——————– 基于本学习类别1-4连贯到本节的补给表明

表达1 从那节发轫,TP或dev那多个简称指的都以ThinkPHP 1.6版,
可以到svn下载。

下载后去除原来的ThinkPHP框架文件,将dev同样命名为ThinkPHP,并仍是放置于网站的根目录下。
除此以外,为了便于需求时方可对实例截图而不引起读者你误会,基于自个儿的网站目录结构,现将Myapp的index.php地方变动到Myapp文件夹下(不再是原本的根目录).
步1:将根目录中的原index.php剪切并粘贴到Myapp文件夹下。更改代码为:

  1. <?php
  2.     // 定义ThinkPHP路径
  3.     define(‘THINK_PATH’,’../ThinkPHP’);
  4.     // 定义项目名称
  5.     define(‘APP_NAME’,’Myapp’);
  6.     // 定义项目路线
  7.     define(‘APP_PATH’,’.’);
  8.     // 加载框架入口文件
  9.     require(THINK_PATH.’/ThinkPHP.php’);
    1.     // 实例化这么些类型
    1.     $App = new App();
    1.     // 执行初始化
    1.     $App->run();
  10. ?>

复制代码

代码补充注释:代码中项目名称其实是足以不用定义的,系统会自行依照当下的目录名定义名称。
步2: 将.htaccess文件复制一份粘贴到Myapp目录下。
步3: 将Cache目录,Temp目录,Data目录清空。

表达2 第六节中对于UGL450L访问的暗中认可模式
在dev版暗许配置中,dispatch即UTiggoL调度效能是关门的,所以在暗许格局下,要访问Index模块的index操作,地址应是:index.php?m=index&a=index,m指的是模块变量(Model),a指的是操作变量(Action)。
假设要利用类似第六节中的index.php/moduleName/actionName情势,则要在config.php文件里安装DISPATCH_ON为true;
而且,也唯有敞开了此功用后,U路虎极光L_MODEL的设置才会立竿见影。
(在下边包车型客车章节大家提及过,能够安装U奇骏L_MODEL为2来选用rewrite功用去除呈现index.php)
为此,今后大家的config.php代码是

  1. <?php
  2. if (!defined(‘THINK_PATH’)) exit();
  3. return array(
  4.     ‘DB_TYPE’=>’mysql’, // 使用的数据库是mysql
  5.     ‘DB_HOST’=>’localhost’,
  6.     ‘DB_NAME’=>’myapp’,// 数据库名
  7.     ‘DB_USER’=>’root’,
  8.     ‘DB_PWD’=>’123456’,// 填写您总是数据库的密码
  9.     ‘DB_PORT’=>’3306’,
    1.     ‘DB_PREFIX’=>’think_’, // 数据表表名的前缀
      请参考
    1.     ‘DISPATCH_ON’=> true,
    1.     ‘URL_MODEL’=>2,
    1.     ‘TMPL_VAR_IDENTIFY’=>’array’,// 模板变量识别
      留空自动判断 array 数组 obj 对象
    1.     ‘DEBUG_MODE’=>true,//开启调试方式
  10. );

  11. ?>

复制代码

代码补充注释:此节之后的内容会波及到模板输出及数码操作,所以在那边肯定设置了模版变量为数组,并打开TP的调节和测试情势。

小心3:第4节 CUOdysseyD知识之一 C(创制)中的自动填写
dev版的自发性填写功效已移到AdvModel类中。要选用此成效,我们需求在Myapp/Lib/Model类文件中引入该类.
那正是说再来看看我们所定义的数量表form的字段:

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

复制代码

引用tdweb手记:

要是须求新建数据时自动填写时间戳,只需求设置数据表字段名”create_time”,要是急需修改时自动保存时间戳,那么设置数据表字段名为”update_time”。
假若您的数据表字段名不是暗中同意的,那么要求钦命,例如
protected $autoCreateTimestamps = ‘ctime’;
protected $autoUpdateTimestamps = ‘utime’;

故而,让我们开辟Myapp/Lib/Model/FormModel.class.php文件,将代码更改为如下:

  1. <?php
  2. // 导入AdvModel类
  3. alias_import(‘AdvModel’);
  4. class FormModel extends AdvModel {
  5. /* 假诺数据表的 创立时间
    字段不是create_time,要求其余设置成如下情势*/
  6.     //protected $autoCreateTimestamps = ‘ctime’;
  7.     // 自动填写设置
  8.   protected $_auto  =  array(
  9.   array(‘status’,’1′),//自动填写的概念规则请参考第陆节内容
    填充规则有所不一致,见附注

  10. );

  11. }

  12. ?>

复制代码

代码补充注释:
专注:dev版的填充条件改为1 新增 2 更新 3
包蕴1和2,暗中认可为新增。所以定义更便于了.而选用ADD | UPDATE |
ALL会无效的(TO小运大哥:TP代码还有二个特点就是函数或情势的命名很符合语言使用习惯,原来的add,update,all很直观,易记,可惜没了)
array(‘田野(field)’,’填充内容’,’填充条件’,’附加规则’,[外加参数])

alias_import($alias,$classfile=”)飞快定义和外号导入 

那是骤增的函数,笔者尝试注解一下,不科学请指正。
该函数能够动态设置文件列表导入和一直导入文本,常会用到的文书外号有

‘Page’                  分页类     Page.class.php’,
‘ViewModel’        视图模型类 ViewModel.class.php’,
‘AdvModel’          高级模型类 AdvModel.class.php’,
‘RelationModel’   关联模型类 RelationModel.class.php’,

当要引入已定义外号的文本,我们借使直接在参数中传送外号就行了。
别称能够自动在ThinkPHP/Common/alias.php中扩大。
而外利用已定义的小名外,也得以动用动态钦赐。

  1. alias_import(‘zzg’,APP_PATH.’/Lib/ORG/zzg.php’);

复制代码

或三次引入八个文件

  1. $ailias=array(
  2.     ‘Abc’=>   APP_PATH.’/Lib/ORG/abc.php’,
  3.     ‘Efg’ =>  APP_PATH.’/Lib/Other/efg.php’,
  4. );
  5. alias_import($ailias);

复制代码

注:内定文件或外号不存在时会重返false

接近的函数还有
import($class,$baseUrl = ”,$ext=’.class.php’)

天命四弟语:由于性格难点,这几个点子今后不再帮忙

那是ThinkPHP内建的类库和文件导入的多少个函数,具有缓存和检测机制,相同的文本不会再也导入,争辩时会提醒错误。使用那方式时,系统会自动识别导入类库文件的职位:
Think 代表TP框架基类库 即ThinkPHP/Lib/Think目录
OGL450G 代表第壹方共用类库 即ThinkPHP/Lib/OLacrosseG目录
@ 代表当前项目类库,例如Import(“@.Action.xxxAction”)
—-即Myapp/Lib/Action/xxxAction.class.php
@指的是近年来项目名称,那和利用Import(“Myapp.Action.xxxAction”)是一样的。
TP的预订是Think、O牧马人G等导入的是以体系(TP)基类库为相对起头目录,不然就以为是项目(Myapp)应用类库为开首目录。
留神1 行使时要专注文件名的大小写
注意2
Import会自动将.转换为/,假使文件名中含有.,则要将.改为#才能健康导入。
瞩目3 导入的类公事后缀暗中认可是.class.php

2 第贰方框架类库导入:vendor($class,$baseUrl = ”,$ext=’.php’), 初步目录统一是ThinkPHP/Vendor
暗中同意后缀是.php
注:vendor也利用了Import函数。因此…

证实3,原来的沙盘文件index.html保持不变,因为大家已启用了DISPATCH_ON开关。
仅将Myapp/Lib/Action/IndexAction.class.php代码更改如下

  1. <?php
  2. class IndexAction extends Action{
  3.     public function index()
  4.     {
  5.         $Form = D(“Form”)->select();
    //也可以D(“Form”)->findAll()
  6.         dump ( $Form );// 输出查询结果
  7.         $this->assign(‘title’,’添加数据’);//定义标题标模版变量
  8.         $this->display();// 渲染模板
  9.     }
    1.     // 插入数据
    1.     function add()
    1.     {
    1.         header(“Content-Type:text/html;
      charset=utf-8”);//为了提示时不乱码
    1.         $Form = D(‘Form’);//实例化Form模型
    1.         $vo  =   $Form->create();//创制数量对象
    1.         if(false === $vo) {
    1.                exit($Form->getError().’ [ <a
      htef=”javascript:history.back()”>返 回</a> ]’);
    1.         }
    1.         $rs =  $Form->add();//插入数据
    1.         if ($rs) {
    1.             redirect(‘/Myapp/’,2,’数据拉长成功!’);
    1.         }else{
    1.             exit($Form->getError().’ [ <a
      HREF=”javascript:history.back()”>返 回</a> ]’);
    1.         }
    1.     }
  10. }//类定义 end

  11. ?>

复制代码

代码补充表明:

select($options=array());

为了有利于查看数据,index操作中运用到了1个为主查询格局

tdweb语:select()方法代替了前边比较盛行的findAll(),不传任何参数则是赢得全体多少。

大家仍是循途守辙,具体有关查询的方法会在动用的时候陆续一起学习。

dump($var, $echo=true,$label=null,
$strict=true)
函数。浏览器友好的变量输出。
当唯有二个$var参数时,会一贯打字与印刷那些$var。
dump($Form);会输出接近

  1. array(1) {
  2.   [0] => array(7) {
  3.     [“id”] => string(1) “1”
  4.     [“title”] => string(18) “那是测试数据”
  5.     [“content”] => string(4) “dfdf”
  6.     [“create_time”] => string(10) “1212724876”
  7.     [“update_time”] => string(1) “0”
  8.     [“status”] => string(1) “1”
  9.     [“email”] => string(12) “dddd@ddd.com”
    1.   }
  10. }

复制代码

也得以设置参数
dump($要出口的变量, 是不是直接打字与印刷0或1,变量表明 ,
是还是不是以正规数组情势0,1)
例如:

  1. dump($Form,1,’Form数据’,0);

复制代码

输出接近

  1. Form数据 Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [id] => 1
  6.             [title] => 那是测试数据
  7.             [content] => dfdf
  8.             [create_time] => 1212724876
  9.             [update_time] => 0
    1.             [status] => 1
    1.             [email] => dddd@ddd.com
    1.         )
  10. )

复制代码

$vo = $Form->create();

创造数量对象 但不保留到数据库
模型类的create方法,假诺没有设值,则暗中同意是因此表单提交的数据$_POST实行创办。
再就是Create方法也支撑从其余格局例如数据对象或许数组等来创设,
对那方式与tdweb的传教有个别不一致,望指正。

鉴于简洁版并不自动生成数据表data缓存,所以一旦你用create()而不给她传递任何值,仅仅凭借$_POST拿到值,那么不论是您的表单POST什么,程序都会以为是数据库的字段拼入QL,所以,假使您POST过来的数码而数据表里没有这么些字段,则会并发增进失利。

但自己来看代码里就像已自行过滤不相符的数目,并测试过添加数量表里没有的字段没有出现增加失败。
redirect(‘/Myapp/’,2,’数据增加成功!’); 跳转函数。
函数原型:redirect($url,$time=0,$msg=”)
看参数就早已很明亮了。

连通篇就先到此地,提出大家多点入手实操和看望源代码。

下一节我们再持续,请各位务必多多指教。

 

 

[教程] 一步一步安分守己学习TP六(新手篇/1.6版)

在上一节实际操作中,大家已成功插入了多条测试的数目,然而很分明,大家发现里面包车型客车邮箱地址一项不合乎格式也足以交给,那本来不是我们所梦想观察的,那时大家能够采纳TP的多寡自动验证作用去控制用户输入。
而以前已交付的多少,也得以经过编写制定数据将原本错误格式的邮箱地址重新改变为正确的email,这一个处理让大家都位居下一节的数量编辑中一起读书。

在此以前,先来探望TP最宗旨的多寡查询。

8 节数据查询(CULANDD之宝马X5)
TP的查询很人性化地分成单数据重临或多数据重回,视乎自身项目进度中的实际须要,根据这多重视教育程的求学习惯,大家仍是在实操中去打听,以代码来学习,一起入手吧。

1
先将Myapp/Lib/Action/indexAction.class.php代码稍作修改,以有益更直观地翻看查询结果。

  1.     public function index()
  2.     {
  3.         $Form = D(“Form”);
  4.         $data   =   $Form->order(‘id desc’)->select();
  5.         $this->assign(‘data’,$data);
  6.         $this->assign(‘title’,’添加数据’);
  7.         $this->display();
  8.     }

复制代码

2
在第二节时,我们询问过模板变量的轮回输出,今后利用那知识点将相应的模版文件Myapp/Tpl/default/Index/index.html修改如下

  1. <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
    “;
  2. <html xmlns=”;
  3. <head>
  4. <meta http-equiv=”Content-Type” content=”text/html;
    charset=utf-8″ />
  5. <title>{$title}</title>
  6. <style type=”text/css”>
  7. h3{color:green;}
  8. .box{width:600px;margin:10px auto;border:1px dashed
    #e8e8e8;padding:5px;}
  9. .submit{height:2em;padding:0 5px;cursor:pointer;}

  10. </style>

  11. </head>

  12. <body>

  13. <form action=”__URL__/add” method=”post” name=”formname”
    id=”formname” class=”box”>

    1.     <p><label
      for=”title”>标题:</label><input name=”title”
      type=”text” id=”title” /></p>
    1.     <p><label
      for=”email”>邮箱:</label><input name=”email”
      type=”text” id=”email” /></p>
    1.     <p><label
      for=”content”>内容:</label></p>
  14. <p>

    1.         <textarea name=”content” rows=”6″ cols=”50″
      id=”content” class=”textarea” ></textarea>
    1.     </p>
  15. <p><input name=”submit” type=”submit” value=” 提交 ”
    class=”submit” /></p>

  16. </form>

  17. {//Form表数据循环输出}

  18. <iterate name=”data” id=”vo”>

  19. <div class=”box”>

  20. <h3>NO.{$vo.id}:{$vo.title}</h3>

  21. <p>———–由 {$vo.email} 发表于:
    <em>{$vo.create_time|date=’Y-m-d’,###}</em></p>

  22. <p>内容:</p>

  23. <p>{$vo.content}</p>

  24. </div>

  25. </iterate>

  26. </body>

  27. </html>

复制代码

在浏览器中输入

 

此时大家假使每输入一条数据音讯,就会根据id倒序的法门体以后模板上。

—复苏内容甘休—

Leave a Comment.