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



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