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();



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章