Thinkphp的学习笔记
【控制器和方法的添加】
tp 控制器和方法的添加,仿造tp 自带 Index 模块
【路由解析】
tp框架url分为4种 :0. http://www.xx.com/index.php?m=xx&c=xx&a=xx
1.http://www.xx.com/index.php/模块/控制器/操作方法
2.http://www.xx.com/模块/控制器/操作方法 (url重写)
3.http://www.xx.com/index.php?s=/模块/控制器/操作方法
通过 URL_MODEL 设置url模式,在本应用种配置Common->config.php ,不应去TP配置修改 Thinkphp->conversion.php
注意:在浏览器使用这4种模式都可以兼容
//把目前tp模式变为开发模式 ,在入口文件设置
define("APP_DEBUG",TRUE);
快捷函数U("模块/控制器、方法")根据参数和url模式,创建对应的url地址
【开发,生产模式】
define("APP_DEBUG",TRUE); 加载文件多
define("APP_DEBUG",FALSE); 加载文件少,主要在conmmon~runtime.php加载缓存文件
日志追综:'SHOW_PAGE_TRACE'=>true
【控制器调用VIEW】
创建View:每个控制器标志在View目录下都会有一个与控制器标志一样的目录,目录下有具体的模板
例如:GoodsController.class.php 控制 在View目录有Goods目录
【视图模板与项目进行整合】
1.引入html静态代码
2.引入css js img,放在在shop下的public目录
3.在index入口文件
define('SITE_URL','http://localhost/');
define('CSS_URL',SITE_URL.'shop/public/css/');
define('JS_URL',SITE_URL.'shop/public/js/');
define('IMG_URL',SITE_URL.'shop/public/img/');
4.在模板中通过常量获取具体的js css img等文件
5.把css 文件中本身的图片路径设置正确(css文件中的图片路径是相对于css文件本身的,和入口文件无关)
【空操作与空控制器】 ------------->讲操作与控制器
空操作:一个控制器对象下没有该方法
空控制器:没有该控制器类
**快捷函数
U() 生成url路径
C() 查看后缀
E() 显示错误
L() 语言包函数
A() 实例化控制器对象
===空操作解决办法:ThinkPHP/Library/Controller.class.php->__call()
1.在控制器类中添加_empty()方法
2.在对应的控制器view目录下 写一个该空操作名一样的模板(不推荐)
===空控制器解决方法:ThinkPHP/Library/App.class.php->exec()
可以再制作一个控制器,名称EmptyController.class.php
在该控制器中制作一个_empty() 方法
【项目分组设置】------------> 主讲模块
一个项目一般分为前台和后台,在代码层面上应该进行物理分组
例如该项目中的Home(前台) Admin(后端) 都有自己对应的模块、控制器、View:
Home目录
Controller
IndexController.class.php
GoodsController.class.php
UserController.class.php
Admin目录:
Controller
IndexController.class.php
GoodsController.class.php
UserController.class.php
http://网址/index.php/Home/控制器/操作方法 访问Home模块
http://网址/index.php/Admin/控制器/操作方法 访问Admin模块
【Admin后台css img js】
在index.php 中添加:
define('ADMIN_CSS_URL',SITE_URL.'shop/public/Admin/css/');
define('ADMIN_JS_URL',SITE_URL.'shop/public/Admin/js/');
define('ADMIN_IMG_URL',SITE_URL.'shop/public/Admin/img/');
【后台品字型框架页面搭建】
在IndexController 中添加以下方法
function index(){
$this->display();
}
function head(){
$this->display();
}
function left(){
$this->display();
}
function right(){
$this->display();
}
get_defined_constants() 该函数获取当前系统有那常量可以使用,参数true可以将这些常量分组
【跨控制器调用】
一个控制器在执行的时候,可以实例化另一个控制器,并通过对象访问其指定方法
跨控制器调用可以节省我们代码工作量
例如:有10个页面都需要实现指定的数据信息显示。比如我们网站的“会员数有200万”,
这个信息需要在10个页面都显示
这个数据是通过UserController.class.php里面的number方法给查询到的。
现在商品列表页也需要显示这200万数据,原则上商品控制器GoodsController.class.php 里面页
要有number方法获取数据。
如果许多页面都需要显示200万的会员数据,那么许多控制器都要有number方法
如果大家都能实例化User控制器并调用它的number方法,则可以大大节省代码量
例如代码:
跨控制器: UserController GoodsController ,要求:需要在Goods 控制器中实例化User控制器并调用User的number方法
第一种:直接通过new 实例化。类库自动加载:ThinkPHP/Library/Think/Think.class.php->function autoload()
$user = new UserController();
$user ->number();
第二种:A快捷函数,实例化控制器。ThinkPHP/Common/function.php->A()
$user = A('Home/User');
$user->number();
第三种:R快捷函数,A函数的升级,实例化控制器并调用方法。ThinkPHP/Common/function.php->R()
R('Home/User/number')
【tp框架执行流程】
1.index.php :一般入口文件
2.ThinkPHP/ThinkPHP.php :一般定义系统常量
3.ThinkPHP/Library/Think/Think.class.php :一般自动生成系统结构
4.ThinkPHP/Library/Think/App.class.php :一般实例化控制器并调用相应方法
【回顾一】
新知识点:
配置文件加载顺序: 1.ThinkPHP/Conf/convension.php(核心配置) 2.shop/Common/Conf/config.php(公共配置)
3.shop/Home(Admin)/Common/config.php(模块配置)
函数文件加载顺序: 1.ThinkPHP/Common/config.php
【Model】
1.model 操作数据库数据
2.model 本身也是一个类 ,ThinkPHP/Library/Think/Model.class.php
3.TP如何通过Model连接数据库??
(1)在ThinkPHP/Conf/convension.php 有关于连接数据库配置项
(2)一般而言在本项目配置下配置数据库, shop/Common/Conf/config.php (配置完成及数据库连接成功)
4.数据库的一个表在TP中代表与表同名的类Model
例如:数据库有sw_goods表,在shop/Model/ 目录下就应该有 GoodsModel.class.php 与之对应(GoodsModel extends Model)
注:可以在具体的Model子类中,修改适合自己情况的配置。比如:
实际数据表名(包含表前缀) protected $trueTableName = '';
数据表前缀 protected $tablePrefix = '';
....
【3种实例化Model的方法】
为什么要实例化Modle对象?比如GoodsModel
因为Controller 控制着View 和 Model ,控制器需要数据就需要调用Model,通过实例化后的Model对象操作数据
1. $goods = new 命名空间\GoodsModel(); //object(Model\GoodsModel)
2. $goods = D(‘goods’); // object(Think\Model)
3. $goods = M(); //object(Think\Model)
【数据查询Select及Smarty配置】
1.实例化model后 通过model对象查询数据 (实例化model一般用M()方法,实例化时可以直接填写数据表名,而不用创建具体model类 )
2. $goods = M('goods'); $goods->select(); sql语句等同于:select * from goods
3.一般需要使用smarty 引擎替换 TP引擎
在 ThinkPHP/Conf/convension.php 有 'TMPL_ENGINE_TYPE' => 'Think', 在shop/Common/Conf/config.php中 替换为 'TMPL_ENGINE_TYPE' => 'smarty',
4.注意:替换为smarty引擎后 ,一些特殊TP解析常量不能直接像在TP中那样使用 ,比如:__MOUDEL__ __ACTION__ __CONTROLLER__ ,在smarty中需要把它们当成一般常来处理 例如: $smarty.const.__MOUDEL__
【各种查询条件设置】
$obj = D(); 创建对象
$obj -> select(); 查询数据
select 字段,字段 from 表名 where 条件 group 字段 having 条件 order 排序 limit 限制条数;
SELECT%DISTINCT%%FIELD%FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%%LIMIT% %UNION%%COMMENT%
$obj -> field(字段,字段); 查询指定字段
$obj -> table(数据表); 设置具体操作数据表
$obj -> where(参数); 参数就是正常sql语句where后边的条件信息
例如:( “goods_price >100 and goods_name like ‘三%’”)
$obj -> group(字段); 根据字段进行分组查询
$obj -> having(参数条件); having 条件设置
$obj -> order(‘price desc/asc’) 排序查询
$obj -> limit([偏移量,]条数) 限制查询的条数
sql语句里边具体的条件设置在tp框架model模型里边体现为具体的方法操作
以上方法理论上是父类Model的对应方法
父类model具体存在方法: field() where() limit()
还有一些方法在__call()自动调用函数里边: table() group() order() having()
在__call()魔术方法里边会判断当前的执行方法是否是一个method属性的元素信息,如果存在就会执行执行
以上多个方法是同时使用多个进行条件显示(并且没有顺序要求)
$obj -> limit(5)->field(‘id,name’)->order(‘price asc’) -> table(‘sw_goods’)->select();
以上许多方法执行没有顺序要求,许多方法执行后都是把具体的参数赋予到model属性options里边,最后根据options拼装sql语句。
【查询数据信息】
$info = $goods -> where()->field(字段)->select();
select()方法
1.返回一个二维数组信息
2.返回全部数据表信息
3.给该方法传递参数
a)select(30) 查询主键值等于30的记录信息
b)select(“10,12,14”) 查询主键值在10、12、14范围的记录信息
4.find()如果我们查询的结果只有一个信息,使用select()会返回一个二维数组
为了使用方便我们会希望返回一个一维数组,这时候可使用find()方法
5.having()方法设置查询条件,where()设置查询条件
having 和 where区别
①使用有先后顺序
②where price>100 having price>100
③where 设置条件,字段必须是数据表中存在的字段
④having 设置条件,字段必须是select语句查询出来的字段可以使用
6. 相关聚合函数 count() sum() avg() max() min()
以上聚合函数是最后被调用的方法
以上方法可以结合具体条件方法使用
例如:$goods -> where(‘goods_price >1000’)->count(); 大于1000元的商品的总数目
select 返回查询查询条数
【数据添加add】
tp 添加数据有两种方式:
1.数组添加
$goods = D('goods');
$arr = array(
"goods_name"=>'iphone8',
"goods_price"=>'5999',
);
$goods->add($arr);
2.AR添加
$goods = D('goods');
$goods->goods_name = 'iphone6';
$goods->goods_price = '4999';
$goods->add();
【搜集表单数据入库】
1.制作一个表单
2.通过$_POST() 收集数据
3.表单的请求地址为tp添加数据入库的具体方法
如: function add(){
$arr = $_POST(); // $_POST()直接接受前台来的数据
}
4.tp提供了一个create()方法 ,该方法搜集数据表单 但不存数据库
$goods = D('goods');
$goods->create();
$goods->add();
返回增加的记录主键
【数据修改操作save】
tp 修改数据有两种方式:
1.数组方式
$goods = D("Goods");
$arr = array("goods_name"=>"lenovo","goods_price"=>1200);
$goods->save($arr);
2.AR方式
$goods = D('Goods');
$goods->goods_name = "三星手机";
$goods->goods_price = 1200;
$goods->save();
以上两种方式将修改库里全部数据,不合理,tp不允许这种方式执行
如何执行:
a.在操作数据中加上主键id b.在save前加where条件: $goods->where('id=1')->save()
save返回影响条数
【数据删除delete】
$goods = D('goods');
$goods->delete(30) //删除主键值为30
$goods->delete("30,12,11")//删除主键值为 30 12 11的记录
$goods->where('goods_price>500')->delete()// 删除价格大于500的记录
delete返回影响条数
【执行原生sql语句】
1.查询语句query() 返回一个二维数组信息
$goods = D('Goods');
$sql = "select * from sw_goods";
$goods->query($sql);
2.添加 删除 修改 execute() 返回受影响的记录条数
$goods = D();
$sql = "updata sw_goods SET goods_price where goods_id =30";
$goods->execute($sql);
注意:
给操作方法传递参数 /Admin/User/login/id/100/name/tom
a)function login($id,$name)
【tp服务器对字段的验证】
表单验证
a)在自定义模型里边重写$_validate
b)$_validate属性定义时一个数组信息,内部每个小的单元还是一个数组
c)array(字段,验证规则,错误提示,验证条件,附加规则,验证时间)
d)验证规则:require、email
e)验证条件:
i.0 字段在$_POST里边存在就验证
ii.1 必须验证
iii.2 值不为空才验证
f) 附加规则:regex in callback
注意:
1.模型实例化通过new
2.调用create()方法才可以触发验证执行
【命令空间】
在php里边,同一个应用请求里面如果存在两个方法(类名),他们的名字一样
由于php本身语法规则的限制,系统是要报错的
1.改名
2.命名空间
1).命名空间是虚拟定义的空间,不是真实存在的目录
2).命名空间的分隔符都是反斜杠 \
3). 非限定名称 限定名称 完全限定名称
【tp多语言包的使用】
多语言设置就是通过get参数告诉当前的请求使用何种语言
第一次使用get变量传递语言,之后语言还会保存在cookie里边,供下次使用
如果get没有传递语言,浏览器会根据当前地区选中对应的语言,我们程序也可以读取浏览器的对应的语言变量选择对应的语言
【验证码】
1.tp验证码的引入
a).验证码类在ThinkPHP\Library\Think\Verify.class.php
b).使用验证码类是需要专门在控制器中制作一个方法生成验证码图片
function verify(){
$config = array(........ ); //config数组可以修改验证码图像属性,例如:高 宽 字符数...
$verify = new \Think\Verify($config); //创建verify对象,需要引用verify类,需要加命名空间 ,
//verify 类通过 Think\autoload 类自动加载
$verify->entry() ; //生成验证码图片
}
2.tp 验证码校验
a)验证码code存在 SESSION 中
b)用户通过post提交的验证码在后台获取,通过verify对象的check方法检测用户输入的验证码是否正确
function check(){
$verify = new \Think\Verify();
if( !$verify->check($_POST['capth'])){
echo "验证码错误";
}else{
echo "验证码错误";
}
}
【tp的缓存应用】
1.常用的缓存方式 : file db memycach
2.在tp的config中默认为file缓存 ,使用缓存快捷函数后,就会在Thinkphp/Runtime/Temp 下生成相应的缓存文件
3.缓存快捷函数 ========= S()
a. 设置缓存数据 S($name,$key,[$time]) 第三个为可选参数 -- 缓存时间
b. 获取缓存数据 S($name)
c. 删除缓存数据 S($name,null)
【tp框架使用自定义类】
1.要想tp框架加载到自定义的类,需要注意自定义类的放置位置。因为tp框架加载类是通过ThinkPHP/Library/Think/Think.class.php 中的autoload() 方法加载,需考虑其解释方式
2.一般而言,需要使用自定义类,在本项目下创建 Component 文件夹,然后把class文件放入其中即可
shop/Compoent/Page.class.php
3.在控制器实例化自定义类时: $page = new \Component\Page(); 注意:这里的\Component 也可以理解为namespace
【分页实现】
$goods = D('goods');
//1.获取数据总记录数 并定义每页显示条数
$count = $goods -> count();
$pr = 7;
//2.实例化page类
$page =new \Component\Page($count,$pr);
//3.构建原生sql 并执行查询 ,$page->limit为构造对象时已经设置好,为偏移量 (类似 limit 0,5)
$sql = "select * from sw_goods ".$page->limit;
$info = $goods->query($sql);
//4.获取分页列表 fpage() 方法可以获取分页列表
$pagelist = $page -> fpage();
$this->assign('pagelist',$pagelist);
$this -> assign('goods_info',$info);
$this->display();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.