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

   ThinkPHP 提供了一个 Model 类,供其余的 Model 举行后续。Model 类中是
MVC 中的模型类,它是调用 持久层
的上层类。感觉那样描述问题多多,可是有啥措施吧?可是,这几个 Model
有时不能满足大家的局地急需,因此我们要求自定义一个 Model
类出来,然而自定义的 Model 同样要一而再 TP 提供的 Model
类,而把大家自定义的 Model 类作为大家项目中的 Model
基类。我怎么感觉自我在说绕口令,等等…我有点晕。

近年来可比绕有趣味地上学PHP,看完了有的基础语法、学会了动用SMARY模版,继而看了ThinkPHP框架,

//TP 恶补ing... 

—復苏内容发轫—

 

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

一、定义数据表模型

前言
TP的手册非凡多,其实不用再出如此的贴子,论技术,我也是菜鸟一个,同时也在攻读当中。
自定义基类,ThinkPHP学习笔记1。看样子论坛上多了累累新对象,不少在抱怨手册看不懂,那我就姑且一得之见,尝试与新对象们更不难地、手把手地进入TP的使用中去。讲解进度中有错的地方,大家辅助指正。

猥琐的需要

惠及纪念性的就学转发了一部分之下小说

1.模子映射

那几个体系,开始定下的目标为,从零先导,以TP示例中央中的Form为例举行教学,以执行为主,理论为辅,
将TP的最基本内容逛一回,至少让大家一并学会怎么进展最简便易行的对数码进行查、增、改、删操作并出口到模板。

  在选择 Java 的开源项目 JeeSite
时,养成了一个不好的习惯,习惯给每张表都伸张create_by、create_date、update_by、update_date、remarks 和 del_flag
这么多少个字段。假若每张表都有那多少个字段,那么对每张表举办 insert
时都会对上述的字段举行设置,对每张表举行 update
时都会对其中一部分字段进展翻新,对每条记下举行 delete 时都其实是对
del_flag 字段进展
置位。重复操作很多,一些操作方法被涂改。那么,那个时候就要自定义一个温馨的
Model 来作为项目标 基类 了,这一个 Model 就背负干上边我说的那几个事情了。

CURD知识之一 C 创设(create)

要测试数据库是还是不是健康连接,最直接的办法就是在方今控制器中实例化数据表,然后使用
dump 函数输出,查看数据库的链接状态。代码:

鉴于大家说的是稳中求进,所以自己用步骤式来表明,只要一步一步跟着做,相信聪明的你在使用进度中就会清楚TP的应用了。

 

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

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

小心:以下的步骤,仅仅是TP灵活的布置格局之中一种,实际开发中得以按照自己的情景去重新设定。
关于怎么那么做,我们会在最后再作计算,我觉着先实操然后再拓展认证相比易于驾驭。以下不再重复解释。

自定义一个 Model

2  模型对象:即数据对象,你项目里每一个Model类文件都会对应着一个数据表(或者视图),模型与数码表存在一种炫耀关系。TP约定了命名要依照一定的正规化,倘诺不符合,则要求按照事态开展额外的照应设置。例如Model类的tableName属性

那会儿浏览器输出:

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

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

在第一节时,曾略为涉及Model类文件命名,现在再回首一下那有些的始末:
我们事先在数据库中,已创造了一个think_form数据库表,并且在布置文件config.php中,大家定义了数据表的前缀是think_,
模型类(Model)文件的命名规则是:

澳门葡京备用网址 1澳门葡京备用网址 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目录下树立一个文本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框架的简称

一而再大家定义的基类

貌似的话,在表中添加多少都是透过表单来确立,为了更直观地学习CURD中的C,大家接下去建立个表单来拓展添加数据的操作。
事先大家已在Myapp/Lib/Model/下建立好FormModel.class.php类—-模型(M)
同时也在Myapp/Lib/Action/下添加了一个Index应用模块和写下了一个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的数据自动填充来处理。

浏览器输出:

输入文件index.php代码:

在Model类定义 $_auto
属性,能够做到数据自动处理效能,用来处理默许值和其余 onclick=”tagshow(event)”>系统写入字段。
留神1:该机动填写可能会覆盖表单提交项目。其目标是为着以防表单不合规提交字段。
留意2:要采取Model类的create方法创建数量对象的时候才会自动进行表单数据处理。

澳门葡京备用网址 3澳门葡京备用网址 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,field,string
对于field使用任何字段进行填空和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:模块控制器类,你暂时可以精通为一个Action文件表示着一个使用模块,Action文件中的每一个艺术(function)代表着一个操作,操作分为有出口到模板的操作和只具执行不必要输出的操作。对于有出口的操作,则意味着了您的门类中一个显示给用户使用的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作为附加规则时,第三个填充内容就意味着了那几个因子是一个函数名称,该函数的参数就是象征填充字段的值,比如password的值是123456,则上边的代码会先将以此值使用函数md5(‘123456’),那样处理后再插入到数据表中去。
对此function(函数)和callback(回调方法)理论是均等的,只但是一个是象征填充内容所写的是函数名,另一个是代表填充内容是类中的方法名。函数能够是PHP5内置函数或你协调所写的函数。而callback是时下模型类所能调用的一个艺术。 有关数据填充方面的详细资料,请参见官方使用手册
《ThinkPHP数据操作指南》

澳门葡京备用网址 5

Common文件夹:你的类型中要用到的和谐写的函数,可以在那些文件夹下创设一个名为common.php文件,
在那几个文件中书写函数,那个函数可以用在您项目标依次类,同时也足以在模板变量中应用,TP框架会活动加载。

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

总计:自定义模型映射,一个模子对应一个数据表,所有增删改查都在模型类中达成。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>

 

Data文件夹:TP会把项目标数据库表字段生成到此处,其它。。。那些先不用理会。

在地点代码中,大家大致地建了一个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() 方法是贯通操作、CURD 操作的集合 (
包罗数据创制、数据印证、表单验证、自动完结等 )。

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不存在,就会抛出相当错误,其余,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 属性:字段映射

如同此定义一个类名就行了。该类继承了Model类。至于自动验证,自动过滤,自动填写那一个,暂且不理睬。

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

4 提前先爽一下啊。再度行使PhpMyAdmin,在该表中插入一些数码
sql如下:

视图:Tpl/Index/add_article.html:

  1. INSERT INTO `think_form` (`id`, `title`, `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中的每一个xxxAction.class.php文件表示着一个采纳模块,此Action中的每一个方法(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/里创设一个文本夹,文件夹以利用模块的名号来定名,然后在这一个文件夹下,建立一个以这几个function名称来命名的html文件,就足以在这几个法子中应用$this->display()方法来直接调用该模板。(当然也得以调用此外模块下的其他模板或显式指定模板文件地方和名称,由于是循途守辙式的上学,就让大家先忽略吧)

③ 读取数据 select 和 getFiled

询问这几个理论后,我们先不难实操一下这几个文化。

getField 例子:

1
在Myapp/Tpl/default/下树立一个文本夹,根据使用模块的称号,大家将那个文件夹命名为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 大家利用方面的变量定义,将全方位数组定义为一个模板变量来输出

  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的模板输出

第五节初阶精晓URL如何访问模块操作

通过前边的学习,大家已大体地领悟了利用模块中的操作与模板怎么着对应。
而这一节将简单讲解怎么着通过URL来拜访操作。由于大家要稳中求进,所以先只介绍上面章节要用到的知识,要想深切学习还请参考官方手册《URL设计和SEO扶助》

TP扶助四种URL访问情势,默许是智能形式,所以大家就那种情势进行简要表达。

智能情势下的URL基本构造是如此的

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

解释一下下面文字中所译的URL结构,
怎么appname项目名称我将它译成了入口文件位置:日常状态下,大家的输入文件index.php都是坐落根目录中,那时项目名称就会被进口文件index.php所替代。在前几节里,我们已领略,一个Action文件就是一个使用模块,而选拔模块中的每个方法(function)就是一个具体操作。由此,假使要访问我们实例中的Index模块下的index操作。地址应该是

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

诸如此类说应该很清楚了,不过别让如此多index给混乱咯,对应URL的构造去领会每一个index的函义,同时注意分寸写

简不难单实操:

1
打开Myapp/Lib/Action/IndexAction.class.php文件,在index这一个function下再添加一个操作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
尝试对应URL结构,来访问这些test操作,如若能成功看到echo的文字。则那节我们又学会了多或多或少知识。

外加知识点:
    去掉URL里面的index.php
    要去掉URL里的进口文件index.php,使URL类似那样的格局 
 
    可以按法定手册所提供的点子举行如下操作。
    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,使用
    此后我们的就学中用到的URL,都是倘使你接纳了rewrite的动静。

第六节 CURD知识之一 C 创建(create)

 

.htaccess.rar (248 Bytes)

 

 

 

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

 

首先节  火速初阶一个体系

第一节 不难认识项目里的相继文件夹

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

第三节 不难通晓TP的沙盘输出

第五节 起先询问URL如何访问模块操作

瞩目:看到众多留言说操作不成事或出错,请别忘记,此种类教程出来时,TP1.6还没出来,所以一体系6事先所介绍的以身作则和操作都如故正式版本1.5的,假诺你利用1.6版,请对应两者差别性。
比如说submit不可以有name属性,是因为原先1.5有字段缓存实行过滤处理。1.6没有了字段缓存。
譬如数据自动验证和机关填写都有了一定的界别。

关于1.6的行使能够下载快捷入门教程,是此种类新手篇的共同体版,并且附有示例源码。

第六节 CURD知识之一 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),就可以进行对数据操作了。
什么让那些模型支撑活动验证,自动填充,自动过滤这几个文化,在底下涉及到时会作相应讲解。

貌似的话,在表中添加多少都是透过表单来确立,为了更直观地学习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>
    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__是一个常量定义,表示目前模块地址,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(); //执行跳转
就这么简单几行代码,便形成了对数据插入的拍卖。
今昔大家可以尝试一下在表单中输入数据开展付出试试了。
请先随便插入几条数据,以便下一节大家继承学习CURD中的R

 

 

 

[教程] 一步一步安份守己学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 第五节中对此URL访问的默认情势
在dev版默许配置中,dispatch即URL调度作用是关门的,所以在默许方式下,要访问Index模块的index操作,地址应是:index.php?m=index&a=index,m指的是模块变量(Model),a指的是操作变量(Action)。
设若要拔取类似第五节中的index.php/moduleName/actionName情势,则要在config.php文件里安装DISPATCH_ON为true;
与此同时,也只有敞开了此功效后,URL_MODEL的设置才会立见成效。
(在上头的章节我们提及过,可以安装URL_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:第六节 CURD知识之一 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目录
ORG 代表第三方共用类库 即ThinkPHP/Lib/ORG目录
@ 代表当前项目类库,例如Import(“@.Action.xxxAction”)
—-即Myapp/Lib/Action/xxxAction.class.php
@指的是当下项目名称,那和使用Import(“Myapp.Action.xxxAction”)是一致的。
TP的预订是Think、ORG等导入的是以连串(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操作中动用到了一个主导查询格局

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 节数据查询(CURD之R)
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倒序的法门体现在模板上。

—復苏内容为止—

相关文章

发表评论

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

*
*
Website