0904 TP 变量输出系统变量变量调节器文件包含文件导入遍历if实例化模型CURD操作U方法I方法.docx

上传人:b****8 文档编号:9609602 上传时间:2023-02-05 格式:DOCX 页数:34 大小:1.45MB
下载 相关 举报
0904 TP 变量输出系统变量变量调节器文件包含文件导入遍历if实例化模型CURD操作U方法I方法.docx_第1页
第1页 / 共34页
0904 TP 变量输出系统变量变量调节器文件包含文件导入遍历if实例化模型CURD操作U方法I方法.docx_第2页
第2页 / 共34页
0904 TP 变量输出系统变量变量调节器文件包含文件导入遍历if实例化模型CURD操作U方法I方法.docx_第3页
第3页 / 共34页
0904 TP 变量输出系统变量变量调节器文件包含文件导入遍历if实例化模型CURD操作U方法I方法.docx_第4页
第4页 / 共34页
0904 TP 变量输出系统变量变量调节器文件包含文件导入遍历if实例化模型CURD操作U方法I方法.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

0904 TP 变量输出系统变量变量调节器文件包含文件导入遍历if实例化模型CURD操作U方法I方法.docx

《0904 TP 变量输出系统变量变量调节器文件包含文件导入遍历if实例化模型CURD操作U方法I方法.docx》由会员分享,可在线阅读,更多相关《0904 TP 变量输出系统变量变量调节器文件包含文件导入遍历if实例化模型CURD操作U方法I方法.docx(34页珍藏版)》请在冰豆网上搜索。

0904 TP 变量输出系统变量变量调节器文件包含文件导入遍历if实例化模型CURD操作U方法I方法.docx

0904TP变量输出系统变量变量调节器文件包含文件导入遍历if实例化模型CURD操作U方法I方法

PHP高手之路——ThinkPHP框架

(二)

目录

PHP高手之路——ThinkPHP框架

(二)1

一、视图

(一)2

1、获取内容2

2、模板注释3

3、变量输出3

4、系统变量5

5、使用系统函数(变量调节器)5

6、使用默认值6

7、运算符6

二、视图

(二)6

1、include包含文件7

2、import导入标签9

3、volist标签9

4、foreach标签11

5、if标签11

6、使用php标签12

三、模型13

1、什么是模型(Model)13

2、定义模型13

3、实例化模型类14

1)实例化自定义模型(需要手工创建自定义模型)14

2)实例化系统类模型(不需要创建自定义模型)15

4、CURD操作16

5、定义字段17

6、ThinkPHP第一个bug18

案例:

实现分类管理功能18

7、创建数据20

一、视图

(一)

1、获取内容

基本语法:

$this->fetch(‘模板文件名称’);

主要功能:

获取模板内容

$this->display();1)载入模板2)替换变量3)输出模板内容

$this->fetch();1)载入模板2)替换变量

fetch与display相比,没有输出模板内容的功能,我们在开发中如果想输出模板内容,必须手工编写echo$this->fetch();

ThinkPHP开发步骤小技巧:

1)部署ThinkPHP项目2)先开发控制器3)视图

./Shop/Home/Controller/TestController.class.php

模板文件./Shop/Home/View/Test/index.html

实现效果:

主要可以实现ThinkPHP中的静态化功能。

2、模板注释

单行注释:

{//单行注释}

多行注释:

{/*多行注释*/}

鼠标右键查看源代码效果如下图所示:

由上图可知,ThinkPHP框架中的注释并不会通过http响应到客户端浏览器,所以ThinkPHP中的注释属于服务端注释。

3、变量输出

①普通变量

 

在模板中可以通过如下方式进行引用:

②数组变量

③对象变量

特别说明:

我们在模板中对关联数组的引用中使用了.点号以及对对象的引用使用:

冒号,都是ThinkPHP框架中所特有的功能,原生PHP代码是不支持,谨记!

特别说明:

在ThinkPHP中如果想引用PHP系统类,必须在前面加一个\反斜杠,谨记!

4、系统变量

在以前的项目开发中,如果使用了模板引擎,必须先接收在赋值在引用。

在控制器接收并赋值

$page=$_GET[‘page’];

$this->assign(‘page’,$page);

在模板文件中还需要通过以下形式尽心访问

{$page}

以上方式过于复杂,有没有办法可以简化以上操作呢?

答:

可以使用系统变量(模板中使用)

•$Think.server相当于$_SERVER[];

•$Think.get相当于$_GET[];

•$Think.post相当于$_POST[];

•$Think.request相当于$_REQUEST[];

•$Think.cookie相当于$_COOKIE[];

•$Think.session相当于$_SESSION[];

•$Think.config引入配置文件中的变量信息

说明:

默认情况下如果使用了session信息,在ThinkPHP中可以不需要session_start();因为系统配置默认是自动开启的。

5、系统函数(变量调节器)

功能:

实现对变量的格式化操作

基本语法:

{$变量|系统函数1|系统函数2|…,###}

说明:

在开发过程中,###代表当前变量本身

在实际项目开发中,主要用于时间格式化、无限级分类输出格式

对ckeditor文本编辑器的内容进行转移

{$data['p_detail']|htmlspecialchars_decode=###}

6、使用默认值

在实际项目开发中,可能变量的值为空或不存在,如果使用原生代码会报错,所以在ThinkPHP框架可以使用默认值的形式来解决此问题。

基本语法:

{$变量|default=’默认值’}

7、运算符

•+{$a+$b}

•-{$ab}

•*{$a*$b}

•/{$a/$b}

•%{$a%$b}

•++{$a++}或 {++$a}

•--{$a--} 或{--$a}

在ThinkPHP框架中,模板中的变量是直接可以通过运算符进行数学运算符。

二、视图

(二)

内置标签,在Smarty中内置标签是通过{}进行标识的,在ThinkPHP是通过<>进行标识的,标签基本格式如下:

闭合标签:

<标签>

开放标签:

<标签/>

说明:

在ThinkPHP中,所有标签必须严格遵循语法格式,否则会出现异常。

1、include包含文件

(1)标签语法:

(2)书写方法:

1 通过include标签实现模板(header与footer)包含

注意:

默认路径是基于项目的入口文件(index.php)位置开始,一定要加./从当前目录

2 以上代码可以简写为如下形式:

以上标签的路径是基于View模板文件夹算起的…

(3)特别说明:

在实际项目开发中,include标签还可以传递变量到模板文件

--包含版权信息文件-->

在模板页面中可以通过[变量名称]的形式对其进行引用。

 

(4)项目原理图:

在实际项目开发中,对于项目的公用部分可以单独分离出来,放到单独的模板页面中,然后可以通过include标签进行包含操作。

2、import导入标签

(1)主要功能:

完成对css文件或js文件的导入功能。

(2)基本格式:

file(必须):

资源文件

type(可选):

资源文件类型,css或js,默认为js

起始路径是网站的Public资源目录

采用命名空间方式

3、volist标签

主要功能:

实现对数组元素的遍历

基本语法:

{$vo.id}

{$vo.name}

参数说明:

•name(必须):

要遍历的数组变量

•id(必须):

当前数组元素,每次遍历时系统会将当前遍历结果放入变量id中

•offset:

要输出数据的offset

•length:

输出数据的长度,需要指定offset

•key:

循环索引

 

例1:

一位数组遍历

定义数组

在模板中引用

例2:

二维数组遍历

定义二维数组

在模板中可以通过以下方式遍历:

例3:

附加属性(offset/length/key)

运行结果:

4、foreach标签

主要功能:

实现对数组元素的遍历

基本语法:

{$vo.id}

{$vo.name}

name:

要遍历的数组元素名称

item:

每次遍历时,系统会将遍历结果放入item选项中

例1:

遍历一维数组

例2:

遍历二维数组

说明:

volist标签与foreach标签有何区别?

答:

两者在功能上没有任何区别,唯一不同的是语法上的不同,volist有附加参数,而foreach没有附加参数。

5、if标签

主要功能:

实现php代码中的if…elseif…else分支结构

基本语法:

value1

value2

value3

说明:

在进行条件判断时,如果出现了<或>等特殊标记,系统是无法进行正常解析的,官方推荐使用如下方式替换比较标签:

运行结果:

星期五

6、使用php标签

主要功能:

允许在模板页面中直接使用php源代码(不推荐使用)

ThinkPHP封装的php标签:

echo“hello”;

原生代码:

phpecho“think”;?

>

以上方式虽然可以在模板中集成php代码,但是不建议大家使用,也可以在配置文件中通过以下参数禁用模板中的php代码。

但是以上参数只能禁止原生代码,没有办法禁用系统中的php内置标签。

三、模型

1、什么是模型(Model)

模型表示企业数据和业务规则,主要实现对数据库的增删改查操作。

2、定义模型

模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,然后加上模型类的后缀定义Model.class.php,定义路径如下:

./项目目录(Shop)/模块名称(Home、Admin)/Model/模型类

说明:

在实际项目开发中,一个数据表名对应着一个模型

(1)创建分类模型

(2)在配置文件中定义数据库相关参数

特别说明:

当第一次实例化模型时,系统会弹出如下错误:

如出现以上错误,代表mysql数据库没有连接成功或配置错误,可以通过配置./Shop/Common/Conf/config.php来实现数据库的链接操作

(3)另外请特别注意:

ThinkPHP3.2版本采用了PDO形式实现对数据库的增删改查操作,所以php.ini中必须开启PDO扩展。

 

3、实例化模型类

前言:

无论是实例化自定义模型还是实例化系统模型,只要用到模型类都要引入相应的模型类,

1)实例化自定义模型(需要手工创建自定义模型)

①直接实例化:

·语法:

new自定义类名()如:

newCategoryModel();

·实例化模型要先加载自定义的模型:

useAdmin\Model\CategoryModel;

·或者可以不引用,但在实例化的时候要new完整的路径

publicfunctioncategory(){

//实例化自定义模型

$category=new\Admin\Model\CategoryModel();

}

②隐式实例化自定义模型类(D方法)

·语法:

D(自定义的模型文件去掉Model之后的名字)

=>而模型名得命名规则是:

去前缀的表名+Model.class.php,所以D内的参数相当于是表名

D方法可以不用引用模型类

publicfunctioncategory(){

//实例化自定义模型

//隐式实例化D方法

$category=D('category');

var_dump($category);

}

2)实例化系统类模型(不需要创建自定义模型)

①实例化系统类模型

先引用核心model基类:

useThink\Model;

useThink\Model;

$category=newModel(去掉前缀的数据表名称);

var_dump($category);

=>而模型类命名规则:

去掉表前缀的表名+Model.class.php,所以M内的参数相当于去掉前缀的数据表名称

②隐式创建系统类模型

语法:

M(去Model后的模型名)

=>而模型类命名规则:

去掉表前缀的表名+Model.class.php,所以M内的参数相当于去掉前缀的数据表名称

可不加载核心基类文件

$category=M('category');

var_dump($category);

问题:

M实例化系统类模型与D实例化自定义类模型有何区别?

答:

如果你只需要增删改查等基本功能而没有特殊要求,使用M方法即可满足条件。

如果你需要除增删改查以外的附加功能、字符定义、字段映射、关联模型等特殊功能,就必须使用D方法创建自定义模型。

4、CURD操作

我们实例化模型只有一个目的就是实现对数据库的增删改查(CURD)操作。

注意:

如果默认主键名不是id的话,在add,where,delete,find等方法中不能直接加数字

1)增加操作(CURD——C操作)add

方法一:

$category->data($data)->add();

方法二:

$category->add($data);

publicfunctionadd(){

//①实例化自定义模型

$category=D('category');

//②定义要增加的数据对象

$data=array(

'c_id'=>null,

'c_name'=>'LED灯',

'c_parent_id'=>1,

'c_sort'=>20

);

//③通过add方法实现增加操作

//方法一:

//$category->data($data)->add();

//方法二:

$category->add($data);

}

2)删除操作(CURD——D操作)delete

方法一:

$category->where('c_id=8')->delete();

方法二:

$category->delete(9);//数据表主键名为id才有效

//删除操作

publicfunctiondelete(){

//①实例化模型

$category=D('category');

//②通过delete方法实现删除操作

//方法一:

//$category->where('c_id=8')->delete();

//方法二:

$category->delete(9);

}

3)修改操作(CURD——U操作)

方法一:

使用where方法作为检索条件

//修改操作

publicfunctionedit(){

//①实例化模型

$category=D('category');

//②设置对象数据

$data['c_sort']=30;

$data['c_name']="白炽灯1代";

//③使用save方法保存

$category->where("c_name='白炽灯'")->save($data);

}

方法二:

此方法值能用主键作为检索的条件

//②设置对象数据

$data=array(

"c_sort"=>50,

"c_id"=>"5"

);

//③使用save方法保存

$category->save($data);

4)查询操作(CURD——R操作)

find()方法:

读取指定某条相关信息,返回一维数组

select()方法:

读取指定的多条相关信息,如不添加任何参数,默认读取所有信息,返回二维数组。

//查询操作

publicfunctionindex(){

//①实例化模型

$category=D('category');

//②使用find查询一条数据

$row=$category->where("c_id=5")->find();

//③使用select方法查询表中的所有数据

$rows=$category->select();

var_dump($rows);

}

5、定义字段

问题:

观察以下代码,分析模型是如何读取数据表并进行相关操作的。

运行结果如下:

通过以上程序结果分析可知:

当我们每次实例化模型时,系统都会自动解析数据表表结构,在实际项目开发中,这样事非常耗时的,那么有没有办法解决以上问题呢?

答:

可以通过字段缓存来解决以上问题。

1)只要关闭调试模式就会生成字段缓存(字段缓存可以单独设置关闭)。

2)字段缓存保存在Runtime/Data/_fields/目录下面,命名规则:

数据库名称.数据表名称.php,序列化后的表结构如下:

说明:

在实际项目开发中,当第一次实例化模型时,系统会自动解析表结构,如果没有开启调试,系统会自动缓存表的结构信息,当下次实例化模型时,系统会首先读取缓存文件中的表结构信息,而不会再次解析表结构。

3)可以通过设置DB_FIELDS_CACHE参数来关闭字段自动缓存

在开发环境下,由于数据表结构并不稳定,经常会发生变化,所以在开发环境下建议关闭字段缓存,项目上线后,进入生产环境,由于表结构已经固定,基本不会发生变化,建议开启字段缓存来减少数据库读取。

字段缓存虽然可以解决数据库表中的解析问题,也可以采用数据库的读取,但是由于缓存文件是存储在php文件中的,所以每次实例化时,系统依然会读取php文档,会造成服务的I/O开销,如何解决以上问题呢?

答:

可以通过如下方式解决以上问题:

4)可以在模型类里面手动定义数据表字段的名称,可以避免IO加载的效率开销,在模型类里面添加fields属性即可。

//自定义模型设定了字段定义,那么系统在实例化自定义模型时会自动通过$fields来实现对数据表操作,这样就可以解决缓存文件中的I/O开销问题

protected$fields=array(

"c_id",

"c_name",

"c_parent_id",

"c_sort",

"_pk"=>"c_id"

);

说明:

如果在自定义模型设定了字段定义,那么系统在实例化自定义模型时会自动通过$fields来实现对数据表操作,这样就可以解决缓存文件中的I/O开销问题。

6、ThinkPHP第一个bug

在创建自定义模型时,如果你的数据表主键不是id字段,而是u_id,c_id,必须要设置$pk属性,否则在操作数据时(CURD操作)可能会产生异常。

//自定义类

classCategoryModelextendsModel{

//如果主键不是id,必须设置一下属性

protected$pk="c_id";

}

7、U方法的定义规则如下(方括号内参数根据实际应用决定)

在php文件中也可以使用,但是要去掉{}括号

定义格式:

{:

U(‘模块/控制器/操作?

参数’)}

U方法的定义规则如下(方括号内参数根据实际应用决定):

U('地址表达式',['参数'],['伪静态后缀'],['显示域名'])

地址表达式

地址表达式的格式定义如下:

[模块/控制器/操作#锚点@域名]?

参数1=值1&参数2=值2...

例:

{:

U('Admin/Category/add')生成Admin模块下的Category控制器下的add方法

U('Blog/read?

id=1')//生成Blog控制器的read操作并且id为1的URL地址U('Admin/User/select')//生成Admin模块的User控制器的select操作的URL地址

案例:

实现分类管理功能

分类管理中存在4个操作(增加、修改、删除、查询)

在开发过程中,应该先开发哪个方法呢?

记住一个原则:

数据表中的数据从哪里来,我们就首先开发哪个方法。

首先开发增加功能列表功能(查询功能)修改功能删除功能

栏目开发步骤:

1)在./Shop/Admin/Controller文件夹下创建CategoryController.class.php控制器,代码如下:

//增加操作

publicfunctionadd(){

//实例化自定义模型

$category=D('category');

//查询所有分类信息供下拉列表选择:

当前仅查询顶级分类

$data=$category->where("c_parent_id=0")->select();

//把变量分配到模板文件中

$this->assign("data",$data);

//调用显示模板文件

$this->display();

}

2)复制add.html模板到./Shop/Admin/View/Category文件夹中,获取所有分类信息

3)更改add.html页面中的所有路径信息

4)更改./Shop/Admin/View/Index/left.html模板文件中的链接信息

要使用到的知识点:

U方法

5)更改form表单中的action参数

6)在addOk方法中接收表单中发送的数据

7)实例化自定义模型

在./Shop/Admin/Model/CategoryModel.class.php模型类

8)实现增加操作

8、创建数据

问题:

以上案例可以完成数据分类的添加功能,但是如果表单数据非常多,那么如何解决呢?

答:

ThinkPHP可以帮助你快速地创建数据对象,最典型的应用就是自动根据表单数据创建数据对象,这个优势在一个数据表的字段非常之多的情况下尤其明显。

以上案例中的添加功能可以进一步简化,代码如下:

以上create方法就是创建数据对象:

可以理解为create方法自动接收表单数据,并组装数据对象,当调用add方法时自动完成添加功能。

分析create函数源代码:

要用到的知识点:

I方法

I方法是ThinkPHP众多单字母函数中的新成员,其命名来自于英文Input(输入),主要用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:

I('变量类型.变量名',['默认值'],['过滤方法'],['额外数据源'])

变量类型是指请求方式或者输入类型,包括:

例:

接收get请求中的page参数

I(‘get.page’);相当于$_GET[‘page’];

系统是如何完成add添加操作的呢?

当add方法中参数为空时,系统会自动查询当前对象下的data属性,如果不为空则直接复制给$data变量,然后对当前data属性进行重置操作。

经过一系列过程中添加data数据到数据库中,到此结束整个流程。

案例:

实现分类管理中的列表显示

1)在./Shop/Admin/Controller/CategoryController.class.php控制器中创建index方法实现数据的查询操作

2)复制list.html模板到./Shop/Admin/View/Category文件夹中

3)更改list.html文件中路径信息

4)更改./Sh

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1