<!doctype html>
<html>
<head>
<title></title>
<style>
body{
font-size:20px;
}
strong,b{
color:red;
}
*{
margin:0;
padding:0;
}
</style>
</head>
<body>
<pre>
<xmp>
<!--apache主配置文件,AllowOverride All是允许使用.htaccess这个文件-->
<VirtualHost *:80>
ServerName www.tpshop.com
ServerAlias tpshop.com
DocumentRoot "d:/php/tpshop"
DirectoryIndex index.php
<Directory "d:/php/tpshop">
Options Indexes FollowSymLinks
AllowOverride All
Order Deny,Allow
Allow from All
</Directory>
</VirtualHost>
<!--打开apache配置文件httpd.conf里面的mod_rewrite.so的扩展(删除最前面的#号即可)-->
什么是路由:
答:系统从URL参数中分析出当前请求的分组、控制器和操作的过程就是“路由”。
tp框架路由共有4种形式:
①基本get形式
http://网址/index.php?m=分组&c=控制器&a=操作方法
该方式是最底层的get形式、传统的参数传递方式,不时尚、不安全。
②pathinfo路径形式[默认方式]
http://网址/index.php/分组/控制器/操作方法
http://网址/index.php/Home/Index/advert
③rewrite重写形式(伪静态技术)省略index.php入口文件
http://网址/分组/控制器/操作方法
http://网址/Home/Index/index
④兼容形式
http://网址/index.php?s=/分组/控制器/操作方法
http://网址/index.php?s=/Home/Index/advert
以上四种模式除了第③种,其他的url模式都可以使用
</xmp>
<strong>
在框架中使用注释,注释不管用,所有对于不需要的直接删除
而起对于导入文件的内容要加个/,说明结束是结束标签
U函数动态生成url
TP框架提供了一个自定义的函数U(),用来动态生成url
注意事项:第一个参数模块名称前面不要加斜杠
U第一个模版名称不要加/,第二个参数可以是字符串或者是数组,第三个数是true.html后缀也可以自己定义,第四个填写true代表的是加域名</strong>
1.简单模板view调用
$this -> display(); //模板名称与当前控制器、当前操作方法的名称一致
$this -> display(模板名称); //调用当前控制器对应目录指定名称的模板
$this -> display(控制器/模板名称); //调用其他控制器下的具体模板文件
2.tp框架有两种模式:开发(调试)、生产[默认]
生产模式:错误提示模糊
开发模式:错误提示友好
define(‘APP_DEBUG’,true); //开发
define(‘APP_DEBUG’,false); //生产
3.获得当前请求的全部常量信息:
dump(get_defined_constants(true));
4.TP框架中定义好的一些模版字符串,可以用来代替一些网站地址(目录地址)
__ROOT__:会替代当前网站的地址(等于什么都没有)
__APP__:会替代当前应用的URL地址
__MODULE__: 路由地址分组信息 (http://网址/index.php/分组)
__CONTROLLER__: 路由地址控制器信息 (http://网址/index.php/分组/控制器)
__ACTION__:路由地址操作方法信息 (http://网址/index.php/分组/控制器/操作方法
)
__SELF__: 路由地址的全部信息 (http://网址/index.php/分组/控制器/操作方法/名称/值/名称/值)
MODULE_NAME: 分组名称
CONTROLLER_NAME:控制器名称
ACTION_NAME: 操作方法名称
__PUBLIC__ 替换的是/Public ,后面没有斜杠了,手册上有误
使用__PUBLIC__ 替换模板文件中的/Public
5.将已有前台模板与框架做结合(重点)
①在项目根目录新建一个Public目录,把所有的css,js,images等静态资源移动过来,Home分组的静态资源放在/Public/Home目录下
②针对每一个页面,定一个请求地址,分组(Home),控制器,方法。
前台首页index.html Home分组 Index控制器 index方法
③把页面移动到Application/Home(当前分组)/View/控制器名文件夹下
④修改html模板页面中的静态资源引入路径
6、内置标签之文件导入
TP框架内置了一些模板标签。其中就有一个import用来导入文件的。
<xmp>
<import type='css' file='home.css.style#min'/>
<import type="js" file="home.js.#min">
如果js文件是压缩的后面的min前面用#来使用,后缀.js可以省略
</xmp>
说明:type是文件类型,css或者js,默认是js.
file是要导入的文件路径,路径从Public下的目录名开始,其中的目录分隔符用点号代替,文件名后缀.css或者.js省略,如果文件名中还有点号,需要用#号代替
这种文件导入方式和html中link标签和script标签导入文件是等效的。
TP框架中的模板标签实现原理,使用xml的语法,所以需要严格遵循xml的语法。
7、内置标签之文件包含
通常在很多页面都有相同的代码部分,比如公共的头部和尾部,这些代码可以
提取出来单独存放到一个文件中,方便以后的维护,只需要一个公共的文件中,方便以后的维护,只需要维护这一个公共的文件。在原来的页面上通过一个文件包含标签来引入这一部分公共的代码。
<xmp>
<include file="Common/header"/>
</xmp>
File属性,要包含的文件路径,直接在当前分组下的View目录去找,从View下的子目录开始写路径,文件名称不需要带后缀。
示例:
前台首页和商品详情页都有公共的头部代码,可以提取到View/Common/header.html文件中
<b>ThinkPHP框架中的代码调试</b>
1.dump函数
TP框架封装了一个dump函数来调试数组变量
2.代码追踪--页面trace功能
在配置文件中来设置开启页面trace功能:
"SHOW_PAGE_TRACE"=>true
<b>细节处理</b>
1. 配置文件介绍
① ThinkPHP/Conf/convention.php 系统主要配置文件
② shop/Common/Conf/config.php 当前shop项目的配置文件
③ shop/Home/Conf/config.php 当前shop项目Home分组的配置文件
以上三个配置文件,如果存在同名的配置变量,后者会覆盖前者。
系统里边并不是全部的配置变量都有在convention.php里边定义
A. 大部分在convention.php有定义
B. 在Behavior行为文件里边有定义一部分(例如:SHOW_PAGE_TRACE)
C. 在框架的代码角落里边有零星的一点配置变量(例如:MODULE_ALLOW_LIST)
2.Smarty模版引擎
smarty模板{}标记有冲突
{}与css或js有冲突解决:
① 在{}与内容中间设置空格
② 使得{}左右标记换行
③ 设置{literal}{/literal}
④ 变换smarty的标记符号
<b>ThinkPHP框架中的模型</b>
①使用D函数:在自定义模型AdviceModel中,使用$trueTableName指定真实表名
②在控制器中实例化Advice模型,关联advice表
object(Admin\Model\AdviceModel)是视线里Advice模型
SHOW COLUMNS FROM 'admin'是关联advice表
③使用M函数:
M函数第二个参数可以设置表前缀,null表示没有前缀,也可以直接指定前缀
<b>数据的查询操作</b>
1、两种查询方法select和find
Select方法,查询多条数据,返回值成功时是一个二维数组,失败时false
①实例模型,调用查询的方法$model -> select(),查看数据表中的所有数据
②$model -> select(1),可以传递参数,参数是数据表中的一个主键值
查询结果是一个二维数组,但是只有对应的一条数据
③$model -> select('2,3,4'),可以传递一个字符串参数,参数是多个主键值以英文逗号连接,
查询结果,是二维数组,里面有对应着传递的主键值的多条数据
find方法
①$model -> find(),查询结果是一个一维数组,是数据表的第一条数据
②$model -> find(3),可以传递参数,参数是一个主键值,查询结果还是一个一维数组
2、六种辅助方法
Where方法:
$model -> where('id=1') -> select();
表达式条件
['id'=>['GT',1]]这是一种以php数组的方式使用where
表达式 含义
EQ 等于(=)
NEW 不等于(<>)
GT 大于(>)
EGT 大于等于(>=)
LT 小于(<)
ELT 小于等于(<=)
LIKE 模型查询
[NOT] BETWEEN (不在)区间查询
[NOT] IN (不在)IN查询
其他辅助方法:
$model -> field('id,name') -> select(); 指定要查询的字段 默认是查询所有字段 *
$model -> order('id desc,goods_price desc') -> select(); 按照条件进行排序 desc倒叙 asc升序
$model -> limit(3) -> select();
$model -> limit(0,3) -> select();
$model -> limit('0,3') -> select(); 限制查询条数
$model -> group('cate_id') -> select(); 分组 ,对应与原生sql的group by
$model -> having('id>3') -> select(); 查询条件
Having和where的区别:
Where 后面的字段必须是数据表中的字段,
Having 必须是结果中的字段, 是原生sql中select 后指定的字段名
在查询使用赋值方法,可以连在一起调用,叫做连贯操作。
辅助方法放在最终查询方法select之前
原理:中间的辅助方法 返回值是当前这个对象本身,所以可以继续调用该对象的其他方法。
4、统计查询
方法 说明
Count 统计数量,参数是要统计的字段名(可选)
Max 获取最大值,参数是要统计的字段名(必须)
Min 获取最小值,参数是要统计的字段名(必须)
Avg 获取平均值,参数是要统计的字段名(必须)
Sum 获取总分,参数是要统计的字段名(必须)
以上统计查询在原生sql中都是在select之后使用对应的mysql函数,TP中直接封装了这些方法,返回值为一个数字。这些方法都是最终的查询方法,和select一样放在最后执行。
5、连表查询
连表查询比如inner join 、 left join 等方式,在TP的模型中,也有对应的join方法
实例:
$adviceModel=D('Avice');//这是第一个表
$data=$adviceModel->alias('t1')->field('t1.*',t2.username)->join('left join tpshop_user t2 on t1.user_id=t2.id')->select();
参数中的连接方式left join 可以省略,默认是inner join .其中alias方法用来设置别名。
<b>模版在模版中的变量输出</b>
$this->assign(‘模板文件中的变量名称’,变量值),来作一个变量赋值操作。
在模板中需要做变量的输出:
{$变量名称}
2、模板分隔符
模板分隔符默认是一对大括号,可以通过配置来修改
'TMPL_L_DELIM'=>'{', :左分隔符
'TMPL_R_DELIM'=>'}', :右分隔符
3、默认值
{$变量|default="默认值"}//如果没去取到变量值,则使用默认值
4、内置标签之volist遍历数组
对于数组变量的输出,需要在模板中进行遍历操作:
TP提供了一个内置标签volist用来在模板中遍历数组:
<volist name=’users’ key=’k’ id=’user’ offset=’’ length=’’></volist>
Name:要遍历的数组名,没有$符号
Key:当前遍历的是第几个,从1开始计数,如果不设置,默认key=”i”
Id:当前遍历的元素
Offset:指定从第几个开始遍历,从0开始计数
Length:指定遍历多少个元素就结束。
注意:这几个元素的值必须有单、双引号
5、内置标签之foreach遍历数组
<foreach name=’users’ key=’k’ item=’user’></foreach>
Name:要遍历的数组名
Key:当前遍历的元素的索引,从0开始计数
Item:当前遍历的元素
6、内置标签之if判断
<if condition=’’>
处理语句...
<elseif condition=’’/>
...
<else/>
...
</if>
提示:condition 属性值结束时,第二个引号之前保留一个空格。以免有的时候会发生错误。
7、使用函数
在模板中对输出的变量可以使用函数做处理:
{$变量名称|fn1|fn2=arg1,arg2,###}
{:函数名称(参数)}如果是数组请用['变量名']来获取
8、系统变量
$Think.server :相当于$_SERVER[‘’]
$Think.get :相当于$_GET[‘’]
$Think.post :相当于$_POST[‘’]
$Think.request :相当于$_REQUEST[‘’]
$Think.cookie :$_COOKIE[‘’]
$Think.session :$_SESSION[‘’]
$Think.config :$Think.config.参数形式调用config.php中的内容
扩展:在TP框架中,自定义了一个C函数,用来读取或者设置配置项。
9、使用运算符
运算符可以直接在模板文件中输出变量时使用。
+ {$a+$b}
- {$a-$b}
* {$a*$b}
/ {$a/$b}
% {$a%$b}
++ {$a++}
-- {$a--}
<b>数据的添加操作</b>
1、数组方式添加
数组方式
$model -> add(一维数组);
返回值,成功时是添加成功的主键id值,失败是false
$model -> addAll(二维数组);批量的添加操作
返回值,成功时是添加成功的主键id值之一,失败是false
2、AR(Active Record)方式添加
AR模式的核心:
① 表映射到类(一个数据表对应一个模型类)
② 字段映射到属性(数据表中的每个字段都是模型类对象的一个属性)
③ 记录映射到对象(一个对象就是一条记录)
就是把利用模型给数据表的字段赋值,来进行添加
大写的I是来接收post获取get传过来的值
实例
$data=I('post.')或者是I('get.')把从传递过来的数据赋值给一个变量
TP中的添加成功或者是失败函数
第一个参数是提示信息,第二个是跳转地址,第三个是跳转时间
$this->success('添加成功',U('Admin/Goods/index'),3)//表示添加成功
第一个参数是提示信息,第二个是跳转地址,第三个是跳转时间
$this->error("添加失败")
<b>功能</b>
1.系统常量
IS_GET 判断是否是GET方式提交
IS_POST 判断是否是POST方式提交
IS_AJAX 判断是否是AJAX提交
2、数据接收I()方法
I('变量类型.变量名',['默认值'],['过滤方法或正则'])
I(‘post.goods_name’,’test goods’,’htmlspecialchars’)
I(‘post.goods_name’) 相当于 $_POST[‘goods_name’]
I(‘post.’) 相当于 $_POST
Htmlspecialchars函数:把输入的符号转为表达式
3、页面跳转与重定向
$this->success(‘提示信息’,’跳转地址’,’等待时间’);
等待时间默认是1秒。
$this->error(‘提示信息’,’跳转地址’,’等待时间’);
跳转地址:默认返回上一个页面
等待时间默认是3秒
$this->redirect(‘跳转地址’,’url参数’,’等待时间’,’提示信息’);
跳转地址:直接传递 分组名/控制器名/方法名。这个方法内部会自己使用U函数生成url。
<b>修改操作</b>
1、数组方式
$model -> save(数组); //数组里面必须要包含主键id TP框架中不允许没有条件的修改
$model -> where(条件) -> save(数组) //使用连贯操作在where中声明条件
返回值 成功时是受影响的数据条数,失败false
2、AR方式
$model -> 字段 = 值;
….
$model -> save(); //如果上面的属性对里面包含了主键字段,则这里不需要写条件
$model -> where() -> save() //如果上面的属性对里没有包含主键字段,则需要使用where辅助方法
<b>数据的删除操作</b>
1、真假删除
删除要达到的效果是在页面不显示数据。
物理删除:真删除
直接从数据表删除数据
逻辑删除:假删除(本质是修改操作)
并不是直接从数据表删除数据,给数据表添加一个状态字段is_show,
0表示不显示 1表示显示
在列表查询数据时可以添加一个where条件,只获取is_show=1的数据
这时删除操作要做的,就是修改is_show这个字段的值为0
<b>对公共的模版跳转设置</b>
由于 我们把侧边栏的代码提取到了一个公共的文件,这个文件是整个后台所有模板共用的,在修改侧边栏中每一个超链接时,不能直接使用__CONTROLLER__这个字符串,需要从分组开始,使用__MODULE__字符串,然后在后面追加上控制器名称和方法名称
</pre>
</body>
</html>