PHP基礎(027)---ThinkPHP框架1


ThinkPHP學習總結:

 

ThinkPHP是一個開源的PHP框架,是為了簡化企業級應用開發和敏捷WEB應用開發而誕生的。最早誕生於2006年初,原名FCS,2007年元旦正式更名為ThinkPHP,並且遵循Apache2開源協議發布。早期的思想架構來源於Struts,后來經過不斷改進和完善,同時也借鑒了國外很多優秀的框架和模式,使用面向對象的開發結構和MVC模式,融合了Struts的Action和Dao思想和JSP的TagLib(標簽庫)、RoR的ORM映射和ActiveRecord模式,封裝了CURD和一些常用操作,單一入口模式等,在模版引擎、緩存機制、認證機制和擴展性方面均有獨特的表現。
 
官方網址 : http://www.thinkphp.cn/
 
ThinkPHP可以支持windows/Unix/Liunx等服務器環境,正式版需要PHP5.0以上版本支持,支持MySql、PgSQL、Sqlite以及PDO等多種數據庫,ThinkPHP框架本身沒有什么特別模塊要求,具體的應用系統運行環境要求視開發所涉及的模塊。
使用ThinkPHP,你可以更方便和快捷的開發和部署應用,當然不僅僅是企業級應用,任何PHP應用開發都可以從ThinkPHP的簡單、兼容和快速的特性中受益。簡潔、快速和實用是ThinkPHP發展秉承的宗旨,為此ThinkPHP會不斷吸收和融入更好的技術以保證其新鮮和活力,提供WEB應用開發的最佳實踐。
作為一個整體開發解決方案,ThinkPHP能夠解決應用開發中的大多數需要,因為其自身包含了底層架構、兼容處理、基類庫、數據庫訪問層、模板引擎、緩存機制、插件機制、角色認證、表單處理等常用的組件,並且對於跨版本、跨平台和跨數據庫移植都比較方便。並且每個組件都是精心設計和完善的,應用開發過程僅僅需要關注您的業務邏輯。

簡單易用的MVC模式:

模型(M):模型的定義由Model類來完成。Model類位於項目目錄下面的LibModel目錄。
控制器(C):應用控制器(核心控制器)和Action控制器都承擔了控制器的角色,區別在於Action控制器完成業務過程,而應用控制器(App類)負責調度控制。Action控制器位於項目目錄下面的LibAction目錄。
視圖(V):模板的實現是和框架無關的,做到了100%分離,可以獨立預覽和制作。模板目錄位於項目目錄下面的Tpl目錄。
 
ThinkPHP提供了靈活和方便的數據操作方法,不僅實現了對數據庫操作的四大基本操作(CURD):創建、讀取、更新和刪除的實現,還內置了很多實用的數據操作方法,提供了ActiveRecords模式的最佳體驗。
ThinkPHP具有項目目錄自動創建功能,你只需要定義好項目的入口文件,第一次執行入口文件的時候,系統會自動創建項目的相關目錄結構,如果是linux環境下面需要給項目入口文件里面指定的路徑設置可寫權限。

 更多內容=》

一、THINKPHP的一般開發流程

  1. 創建數據庫和數據表
  2. 項目命名並創建項目入口文件
  3. 完成項目配置
  4. 創建控制器類
  5. 創建模型類
  6. 創建模板文件
  7. 運行和調試

二、關於模板

1、執行方法並輸出返回值:

格式:{:function(…)}

例如,輸出U方法的返回值:

{:U('User/insert')}

編譯后的PHP代碼是

<?php echo U('User/insert');?> 

2、執行方法但不輸出:

格式:{~function(…)}

例如,調用say_hello函數:

{~say_hello('ThinkPHP')}

編譯后的PHP代碼是:

<?php say_hello('ThinkPHP');?>

三、關於模板和ACTION

這是Action向模板中輸出的數據

如果我們在Action中賦值了一個name模板變量:

$name = 'ThinkPHP';

$this->assign('name',$name);

使用內置的模板引擎輸出變量,只需要在模版文件使用:

{$name}

 


 

這是模型向模板中輸出的數據

果我們需要把一個用戶數據對象賦值給模板變量:

$User = M('name');

$user = $User->find(1);

$this->assign('user',$user);

也就是說$user其實是一個數組變量,我們可以使用下面的方式來輸出相關的值:

{$user['name']}// 輸出用戶的名稱

{$user['email']} // 輸出用戶的email地址

 

如果$user是一個對象而不是數組的話,

$User = M('name');

$User->find(1);

$this->assign('user',$User);

可以使用下面的方式輸出相關的屬性值:

{$user:name}// 輸出用戶的名稱

{$user:email} // 輸出用戶的email地址

四、簡單經典的操作數據庫

 

<?php
Class HelloAction extends Action
{
public function show()
{
$newdb=M("manager");//以數據庫的表名為參數建一個模型
$newdb->find(1);//實例化這個模型,參數為id值(數據庫默認id為key,並且唯一自增)
echo "數據庫取得的消息為:".$newdb->username;//取得這個模型某個字段的數據
}
}
五、關於model
自己的模型類創建和使用
 

基礎模型類的使用

$User = new CommonModel('User','think_','db_config');

第三個連接信息參數可以使用DSN配置或者數組配置,甚至可以支持配置參數。關於這個參數的使用我們會在數據庫連接部分詳細描述。

用M方法實現的話,上面的方法可以寫成:

$User = M('CommonModel:User','think_','db_config');

這是帶參數的實例化模型類。

 

六、關於thinkphp上傳文件

FileAction.class.php

<?php
class FileAction extends Action{
    function index(){
        $file=M('file');
        $list=$file->select();
        $this->assign('filelist',$list);
        $this->display();   
    }    
   
    function upload(){
        //文件上傳地址提交給他,並且上傳完成之后返回一個信息,讓其寫入數據庫   
        if(empty($_FILES)){
            $this->error('必須選擇上傳文件');   
        }else{
            $a=$this->up();
            if(isset($a)){
                //寫入數據庫的自定義c方法
                if($this->c($a)){
                    $this->success('上傳成功');   
                }
                else{
                    $this->error('寫入數據庫失敗');   
                }
            }else{
                $this-error('上傳文件異常,請與系統管理員聯系');   
            }
        }
    }
   
    private function c($data){
        $file=M('file');
        $num       '0';
        for($i = 0; $i < count($data)-1; $i++) {
            $data['filename']=$data[$i]['savename'];           
           if( $file->data($data)->add())
           {
               $num++;
           }
        }
        if($num==count($data)-1)
        {
            return true;   
        }else
        {
            return false;
        }
       
    }
   
    private function up(){
        //完成與thinkphp相關的,文件上傳類的調用   
        import('@.Org.UploadFile');//將上傳類UploadFile.class.php拷到Lib/Org文件夾下
        $upload=new UploadFile();
        $upload->maxSize='1000000';//默認為-1,不限制上傳大小
        $upload->savePath='./Public/Upload/';//保存路徑建議與主文件平級目錄或者平級目錄的子目錄來保存   
        $upload->saveRule=uniqid;//上傳文件的文件名保存規則
        $upload->uploadReplace=true;//如果存在同名文件是否進行覆蓋
        $upload->allowExts=array('jpg','jpeg','png','gif');//准許上傳的文件類型
        $upload->allowTypes=array('image/png','image/jpg','image/jpeg','image/gif');//檢測mime類型
        $upload->thumb=true;//是否開啟圖片文件縮略圖
        $upload->thumbMaxWidth='300,500';
        $upload->thumbMaxHeight='200,400';
        $upload->thumbPrefix='s_,m_';//縮略圖文件前綴
        $upload->thumbRemoveOrigin=1;//如果生成縮略圖,是否刪除原圖
       
        if($upload->upload()){
            $info=$upload->getUploadFileInfo();
            return $info;
        }else{
            $this->error($upload->getErrorMsg());//專門用來獲取上傳的錯誤信息的   
          
    }
   
}
?>

模板文件index.html

<html>

<body>

<volist name="filelist" id="vo">
  小圖:<img src="__PUBLIC__/upload/s_{$vo['filename']}" /><br />
  大圖:<img src="__PUBLIC__/upload/m_{$vo['filename']}" /><br />
</volist>

<form action="__URL__/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file[]" /><br />
    <input type="file" name="file[]" /><br />
    <input type="file" name="file[]" /><br />
    <input type="submit" value="上傳" />
</form>

</body>
</html>

 

七、關於thinkPHP的路由

 

<?php

 

Class HelloAction extends Action

 

{

 

public function show()

 

{

 

echo '<h1>show</h1>';

 

}

 

public function index()

 

{

 

echo '<h1>index</h1>';

 

}

 

protected function _empty($name)

 

{

 

echo '<h1>use empty</h1><h3>'.$name.'</h3>';

 

}

 

}

 

控制器位於www/ensleep/lib/action/HelloAction.class.php

 

輸入localhost/ensleep/index.php/Hello    |使用Index方法

 

輸入localhost/ensleep/index.php/Hello/index    |使用Index方法

 

輸入localhost/ensleep/index.php/Hello/show    |使用show方法

 

輸入localhost/ensleep/index.php/Hello/test    使用_empty('test')

 

Hello必須要大寫,否則出錯。
 
thinkphp命名
文件名采用駝峰法,首字母大寫,
類名和文件名一致方法和屬性采用駝峰法,首字母小寫
函數名采用小寫字母加下划線
數據表加字段采用小寫字母加下划線
配置參數和常量使用大寫字母加下划線以
雙下划線打頭的是魔術方法
 
thinkPHP目錄結構
  系統目錄:
      common目錄下放公用函數
     lang目錄下放語言包
     lib基類類庫目錄 lib/org第三方公共類庫
     tpl系統模板目錄
    mode框架模式擴展目錄
    vender第三方類庫目錄
  項目目錄:
     command項目公共文件
     conf項目配置目錄
     lib項目類庫目錄
     tpl項目末班目錄
     runtime項目運行緩存和日志目錄
 
thinkphp慣例配置文件
     Thinkphp/common/convention.php
項目配置文件
     Conf/config.php
 
thinkPHP緩存
    define('RUNTIME_PATH','./MyApp/temp/');   定義緩存存放路徑
    define('NO_CACHE_RUNTIME',True);    不生成核心緩存
    define('STRIP_RUNTIME_SPACE',false);  對於編譯緩存的內容是否去掉空白和注釋
 
thinkPHP類庫導入,Think,ORG,Com將默認為系統基類庫下相關目錄
    import("Think[ORG][Com].util.session")  將導入系統基類的lib/Think[ORG][Com]/util/session.class.php
    import("MyApp.Action.UserAction")  將導入MyApp/lib/Action/UserAction.class.php
       等同於 import("@.Action.UserAction");
    Vender('Zend.Filter.Dir')  將導入第三方類庫目錄vender/zend/fileter/dir.php
    'APP_AUTOLOAD_PATH'     => 'Think.Util.,ORG.Util.', 設置附加文件的自動導入路徑,增加了一個ORG目錄下
    ,注意需要多加一個點。  
 
thinkPHP入口文件
      <?php
         define("THINK_PATH","./ThinkPHP");
         define("APP_PATH","./home");
         require(THINK_PATH."/ThinkPHP.php");
         App::run();

thinkPHP常用項目配置,位於項目目錄下的conf/config.php
                <?php
return array(
     'APP_DEBUG' =>true,
     'DB_TYPE'   =>'mysql',
     'DB_HOST'   =>'localhost',
     'DB_NAME'   =>'think_test',
     'DB_USER'   =>'root',
     'DB_PWD'    =>'usbw',
     'DB_PREFIX' =>'think_'
                  );
     在方法中臨時設置某一配置值采用 C('參數名稱','新的參數值');
 
thinkPHP分組
    配置文件中加入
          'APP_GROUP_LIST'=>'Home,Admin',
            'DEFAULT_GROUP'=>'Home',
    項目目錄結構中,每層加上Home,Admin的文件夾分層
    訪問效果
       index.php/Home/index,由於Home是默認分組,所以還可以寫為 index.php/index
       idnex.php/Admin/index
    model類可以不分組
 
URL偽靜態
  'URL_HTML_SUFFIX'  =>'.shtml',   將所有路徑后加上.shtml的偽靜態效果
URL重寫
  • apache的http.conf配置文件中加載 mod_rewrite.so模塊
  • AllowOverride None的None改為All
  • 確保URL_MODEL設置為2
  • 將.htaccess文件放到入口文件同級目錄下
  • <IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
    </IfModule>
    重啟后就可以省略掉index.php 
 
URL訪問不再區分大小寫
     'URL_CASE_INSENSITIVE' => true
 但如果我們定義一個UserTypeAction模塊類,相應的多單詞的模塊名將變為   
       /index.php/user_type/list
  而不能是
      /index.php/usertype/list
 
 
 
空操作
   如果系統找不到相應的方法,將定位於_empty方法
       Public function _empty(){
   如果找不到相應的模塊,將定位於空模塊EmptyAction
          Class EmptyAction extends Action{
 
 
調用其他項目的其他模塊中的方法
   R("User","importUser","App2")   調用app2項目中的 UserAction模塊中的importUser方法 
   R方法的調用格式:
     R('[項目://][分組/]模塊/操作','參數','控制器層名稱') 
   
  R('Admin://Tool/User/info') //表示調用Admin項目Tool分組的User模塊的info操作方法
   
 R('User/info',array(15))    表示調用當前項目的User模塊的info操作方法,並且id參數傳入15
r
 

重定向
success可以設置為ajax返回,如:$this->success("新增成功!",true) 
還可以使用重定向    $this->redirect('User/list', array('cate_id'=>2), 5,'頁面跳轉中~')
停留5秒后跳轉刡User模塊癿list操作,並且顯示頁面跳轉中字樣 
 
thinkphp中的AJAX
  • ajaxreturn(數據,'提示信息',狀態) 用於從處理提交數據的頁面向提交頁面的js或ajax返回數據
  • 使用thinkphp的js庫,需要載入 base,js prototype.js mootools.js thinkajax.js,在提交頁面載入這些庫
  • 在按鈕事件中使用 thinkajax.sendform('表單id','提交的url',回調函數,處理完的信息在哪里打開),毀掉函數需要傳入(data,status)兩個參數
  • 在status中判斷是否成功
 
thinkphp有四種實例化模型方法

     *    創建一個基礎模型,實例化系統自帶的數據庫操作類
              $user=new Model('User');
              其中表名第一個字母大寫,表示其前面有前綴,如果表名為三段字符,
              如think_user_age,可以寫為UserAge,
              等價於$user=M('User').,

     *    實例化其他類,實例化一個表和另外一個自己寫的擴展操作類,
             自己寫的model需呀繼承model類
             $user=M('user','comonModel')
            
     *    實例化一個用戶定義的模型,需要手動創建一個模型,繼承model,
             在自定義模型中可以額封裝thinkphp提供的高級功能或者自定義方法
             $user=new UserModel('User'),
             使用於更復雜的業務邏輯,但不需要使用公共的業務邏輯,
             等價於$user=D('user')
             大d方法不會重復實例化,並且只支持調用當前項目下的模型,
             如果想實例化其他項目如后台admin的的模型,
             寫為$user=D('admin','user'),如果是分組寫為 D('admin.user')


     *     實例化一張空模型,並不限定操作那張表
             $user=new Model();
             $list=$user->query('select * from think_user')
             等價於 $user=D();
 
thinkphp跨庫操作
 新建一個model類型,在model里定義
      protected $connection = array(
                     'dbms' => 'mysql',
                     'username' => 'username',
                     'password' => 'password',
                     'hostname' => 'localhost',
                     'hostport' => '3306',
                     'database' => 'dbname'
                     );
  或者使用M方法,在控制器里實例化其他庫
      $user=M('user.User','other_');    實例化user庫里的other_user表
   或使用db方法
      ¥this->db(1,"mysql://root:12345@localhost:3306/test")->query('select ......')
   或使用 protected $dbname='user';
thinkphp的多表查詢
 使用table方法
     $model->table('think_blog blog,think_type type')
        ->where('blog.typeid=type.id')
        ->field('blog.id as id,blog.title,blog.content,type.typename as type')
       ->order('blog.id desc')
       ->limit(5)
       ->select();
  使用join方法
      ¥model->table('user u')
                   ->join(new n on u.id=n.id)
                   ->field(n.*,u.*)
                   ->findall()
  在action中設置 protected $tableName='UserMessage',換一個表前綴 protected $trueTableName='cms_userMessage'
 
thinkphp的curd操做
連貫操作不分前后,select在最后即可
  • where方法,查詢范圍定義
  • table定義要操作的數據表 ¥model->table('think_user user')->where('id=1')->select();
  • data方法在新增和保存數據之前對數據對象賦值
  • field方法定義要查詢的字段 $model->field('id,nickname as name')->select();
  • order方法 對結果進行排序 order('id desc,statue desc')
  • limit方法對結果限制 limit('offset,length')
  • distinct對查詢結果進行唯一過濾 $model->disctinct(true)->select()
插入數據
    $model=M('User');
    $model->create();
    $model->add();
讀取數據
   $model=M('User');
   $list=$model->where('status=1')->order('create_time')->limit(10)->select()/find()/getField('id,name');
     find方法只返回一條記錄,getField方法返回指定字段值
更新數據
    $model=M('User');
    $data['name']='Thinkphp';
    $data['email']='Thinkphp@gmail.con';
    $model->where('id=5')->save($data);
    或者:
    $model=M('User');
    $model->where('id=5')->setField('name','Thinkphp');
                                      ->setField(array('name','email'),array('Thinkphp','Thinkphp@gmail.com'));
                                      ->setInc('score','id=5',3); id等於5的用戶積分加3
                                      ->setDec('score','id=5',3) id等於5的用戶積分減5
刪除數據
    $model=M('User');
    $model->where('id=5')->delect();
    $model->where('status=0')->delect();
 
thinkphp自動驗證和自動完成
  令牌驗證
     在action中建立接受提交數據的方法,寫入create方法  if( $user->create()){}  
     在模板中建立<form>,method設置為post方法,將自動加上令牌
     在配置文件中可以使用 'TOKEN_ON'=>false;來關閉令牌
  自動驗證
    需要在model中定義$validate屬性,格式為:
    array(驗證字段,驗證規則,錯誤提示,驗證條件,附加規則,驗證時間)
       驗證字段:需要驗證的字段
       驗證規則:需要驗證的規則,需要結合附加規則
       錯誤提示:如果出現錯誤,需要一個什么樣的提示
       驗證條件:0存在字段就驗證(默認) 1必須驗證 2值不為控時候驗證
       附加規則:配合驗證規則,regex 前面是使用正則驗證 function前面是使用函數驗證 confirm 前面定義的是一個字段名,驗證兩個字段是否相等 equal驗證是否等於某一個值 in驗證是否在某個范圍內 unique驗證是否唯一 callback使用方法驗證,前面規則是本類的一個方法
       TP封裝:require 字段必須驗證;eamil 驗證郵箱;url 驗證url地址;currency 貨幣;number 數字
       驗證時間:1 新增數據時候驗證 2 編輯數據時候驗證 3 全部情況下驗證(默認)
    
       UserModel.class.php
            class UserModel extends Model{                                  //對應數據庫中的表user
      protected $_validate=array(
          array('username','require','用戶名必填'),
          array('username','checklen','用戶名長度過長或過短',0,'callback'),
          array('password','require','密碼必填'),
          array('repassword','require','重復密碼必填'),
          array('password','repassword','兩次密碼不一致',0,'confirm'),
          array('createtime','number','您輸入的不是數字'),
          array('createip','email','郵箱格式不正確'),
          array('verify','require','驗證碼必須!'), //默認情冴下用正則迕行驗證
                  array('name','','帳號名稱已絆存在!',0,’unique’,1), // 在新增癿旪候驗證name字段是否唯一
      ); 
      function checklen($data){
          if(strlen($data)>15 || strlen($data)<5){
              return false;
          }else{
              return true;
          }
      }
        
  }
UserAction.class.php
   class UserAction extends Action {     
       function reg(){
           $this->display();    
       }
     
       function regadd(){
           $user=D('user');
           if($user->create()){
               if($user->add()){
                   $this->success('注冊成功');    
               }else{
                   $this->error('注冊失敗');    
               }
           }else{
               $this->error($user->getError());    
           }     
       }     
  }
  自動完成
   
 在model類定義的$_auto屬性,可以完成數據自動處理,格式為:

       array(填充字段,填充內容,填充條件,附加規則)
           填充字段:需要處理的字段
           填充條件:1新增時候處理 2更新數據的時候處理 3所有情況都處理
           附加規則:function使用函數 callback回調方法,內容是當前模型的一個方法 field填充內容是一個字段的值 string填充的是一個字符串
     protected $_auto = array (
      array( 'status','1'),   //  新增的時候把 status字段設置為 1
      array('password','md5',1,'function') ,  //  對password 字段在新增的時候使 md5 函數處理
      array('name','getName',1,'callback'), // 對name字段在新增癿旪候回調getName方法
      array('createtime','time',3,'function' ),  //  對create_time 字段在更新的時候寫入當前時間戳
    ); 
 
查詢
 查詢表達式  $map['字段名']=array('表達式','查詢條件');
    表達式有 eq等於 ,neq不等於,  gt大於, lt小於 ,egt/elt 大於等於/小於等於
           like類似                                        $map['name']=array('like','thinkphp%')
           [not]between [不在]在什么之間     $map['id']=array('between','1,8')
           [not]in [不屬於]屬於什么集合之一   $map['id']=array('in','1,2,4')
           exp后面支持更復雜的sql表達式       $map['id']=array('exp','in(1,2,4)')
 組合查詢表達式,需要設置_logic
          $map['id']=array('eq',1);
          $map['name']='ok';
          $map['_logic']='or';
          $user->where($map)->select()
     還可以使用_string來設置條件
          $map['_string']='status=1 and score>13';
 復合查詢,多個數組或對象組合成條件
           $where['name']=array('like','thinkphp%');
           $where['title']=array('like','%thinkphp%');
           $where['_logic']='or';
           $map['_complex']=$where;
           $map['id']=array('gt',1)
 統計查詢
    使用thinkphp內置的一些方法
          $usercount=$user->count()   //獲取用戶數
          $usercount=$user->max('score')   //獲取最大積分
          $usercount=$user->where('score>0')->min('score')   //獲取大於0的最小積分
          $usercount=$user->avg('score')     //獲取用戶的平均分
          $usercount=$user->sum('score')   //獲取用戶總成績
  定位查詢
      需要繼承高級模型類才可以使用
        class UserModel extends AdvModel
          $user->where('score>1')->getN(2)  //取的查詢結果中的第三條記錄
                                                   first();     //獲取第一條記錄
                                                   last();      //獲取最后一條記錄
   sql查詢
      可以使用query方法執行sql查詢語句,返回數據集
      可以使用excute()方法執行插入,更新等sql操作,返回影響記錄數
      __TABLE__ 可以使用在sql語句中代替當前模型對應的表名
 
高級模型AdvModel支持字段過濾 ,序列化,只讀字段,延遲更新
 
視圖模型
  繼承ViewModel 在視圖中結合多個表形成一個虛擬表,然后實例化這個視圖,就可以按普通方式查詢
    class BlogViewModel extends ViewModel{
         public $viewFields=array(
                 'Blog'=array('id','name','title'),
                 'Category'=array('title'=>'catagory_name','_on'=>'Blog.catagory_id=category.id),
                 'User'=array('name'=>'username','_on'=>'Blog.user_id=User.id')
         )
   },其中_on定義了連接條件
   等同於:
      selct  Blog.id as id,Blog.name as name, Blog.title as title,Category.title as catagory_name,User.name as username,
               from think_blog as Blog JOIN think_category as Category JOIN think_user as User
               where Blog.catagory_id=Category.id and Blog.user_id=User.id
   還可以使用_type來定義左連接或右連接
       'Blog'=array('id','name','title','_type'=>'LEFT'),
   接着就可以使用模型正常操作
      $Model=D("BlogView")
      $Model->field('id,name,title.category_name,username')->where('id>10')->select();
 
關聯模型
  關聯關系包括 一對一關聯 HAS_ONE,BELONGS_TO,一對多關聯 HAS_MANY,BELONGS_TO,多對多關聯 MANY_TO_MANY
  一對一關系模型,建立兩張表user,info之間的關聯模型,必須繼承RelationModel,每一個子數組就是一個關聯關系
     class UserModel extends RelationModel {
              protected $_link=array(                  //定義關聯模型
                      'Info'=array(
                            'mapping_type'=>HAS_ONE,        //定義關聯關系
                            'class_name'=>'Info',                    //需要關聯的模型類名稱
                            'mapping_name'=>'Info',             //關聯的映射名稱,默認取class_name值
                            'foreign_key'=>'uid',                    //關聯的外鍵名稱
                            'mapping_field'=>'uid,titile,info',  //被關聯表要查詢的字段
                            'as_field'=>'title,id:usid'                //將被關聯表的字段加入到本表字段中,不再顯示為三位數組,而是二維數組
                                                                                   並給對應沖突字段起一個別名
                        ),
              );
      }
  在控制器中
    $user=D('User');
    $list=$user->relation(true)->select();
 插入數據時候 
   $data['username']='aaaaaa';
   $data['info']=array(
                 array('info'=>'bbbbbbb'),
                 array('info'=>'ccccccccc')                  //關聯表中相關字段插入了兩條
   )
  更行數據時候
     $data['info']=array(
                 array('id'=>1,'info'=>'bbbbbbb'),
                 array('id'=>2,'info'=>'ccccccccc')                  //關聯表中相關字段更新了兩條記錄,必須定義相關id
   )
 關聯關系中BELONGS_TO關系,是多關聯一,在model中需要設置foreign_key,關聯其他表的關鍵字段
 
我們可以用getLastsql方法來輸出上次執行癿sql詢句
 
thinkphp擴展
  基類庫擴展
    將類庫放在ThinkPHP\Lib\ORG\[Com\]下,命名為*.class.php,使用import('com[ORG].目錄.類名')
 應用類庫擴展
    放在項目類庫目錄下,使用import('@.目錄,類名')來導入
 第三方類庫擴展
    放在 ThinkPHP\Vendor下,使用vendor方法來導入 Vendor('vendor下子層目錄名.文件名不帶后綴')
 模塊擴展
    例如在項目目錄下Lib\Model\ExtendAction.class.php
     在項目皮配置文件中
       returrn array(
           '模塊名'=>array('導入路徑'[,'類名'])
     )
 方法擴展
   在項目配置文件中   
            return array(
                 'actionName'=>'調用方法'
                //局部調用
                 'ModelName:Name'=>'調用方法'
            )
 
驗證碼
 做一個控制器command,繼承Action
 在其中做一個公用方法Verify,導入ORG.Util.Image類庫和ORG.Util.String,使用方法 Image::buildImageVerify()
 在要使用驗證碼的模板中寫一個<img src="__APP__/command/verify">
 如果想要點擊驗證碼就換一個話,將模板中的驗證碼改為 <img src="__APP__/command/verify" onclick="show(this)">
  ,然后在js 中寫一個show方法, function show(obj){
                                        obj.src="__APP__/command/verify/random/"+Math.random();
                                }
 在控制器中驗證 if($_SESSION['verrify']!=md5($_POST['verify']))
 Image::buildImageVerify()方法可以有很多參數
      buildImageVerify($length,$mode,$type,$width,$height,$verifyNmae)
              length 默認為4字符   mode 0字母 1數字 2大寫字母 3小寫字母 4中文  type驗證碼圖片類型
              VerifyName驗證碼的session中的名字
 buildImage不支持中文驗證碼顯示,如果想要使用中文驗證碼使用GBVerify方法
   需要提前import('ORG.Utile.String'),將字體文件放在image.class.php中統計目錄中,然后使用image::GBVerify()方法,
 
數據分頁
  在action中import("ORG.Util.Page")
  $count=$user->count() //查數據總數
  $page=new Page($count,每頁分幾個);  //實例化一個新的分頁類,傳入數據總數和每頁分幾個
  $page->setConfig()                          //設置分頁顯示的文字和樣式
  $show=$page->show();                   //調用分頁類的show() 方法顯示數據
  $this->assign('page',$show)              //將分頁類顯示出的數據分配給模板變量page
  在控制器的查詢語句中葯加入limit($page->firstRow.','.$page->listRows) //分頁類算出的其實位置和偏移
  在模板中加上剛分配的page的模板變量
 
文件上傳
 新建一個FileAction,繼承action,
 在模板目錄新建一個文件上傳的頁面,做一個表單,提交給FileAction的upload方法
 upload方法判斷文件類型,是否為空等,,如果錯誤返回一個錯誤信息,如果正確調用up方法進行上傳
 在up方法中import('ORG.Net.UploadFile')
 $upload=New UploadFile();
 $upload->maxSize='-1';    //-1為不限制文件大小
  $upload->savePath='./Pulic/';   //上傳文件的保存路徑
 $upload->saveRule='uniqid'         //上傳文件的保存文件名規則 
 $upload->autoCheck=''               //是否自動檢測附件
 $upload->uploadReplace=true                      //如果存在同名文件是否進行覆蓋
 $upload->allowExts=array('jpg','jpeg')              //准許上傳的文件后綴
 $upload->allowTypes=array('image/png','image/jpeg')   //以type檢測允許的上傳文件類型
 $upload->thumb=true;       //是否開啟圖片文件縮略圖
 $upload->thumbMaxWidh='300,500';
 $upload->thumbMaxHeight='300,400'                //多種縮略圖大小
 $upload->thumbFrefix='s_,m_'            //縮略圖文件前綴  
 設置完成后 直接調用upload()方法 如果成功返回true,如果失敗還可以使用$upload->getErrorMsg()方法來獲取失敗原因.或者使用$upload->getUploadFileInfo()方法來獲取成功后文件的相關信息
 
模板view
 視圖默認的命名規則為:
      模板目錄/模板主題/[分組名/]模塊名/操作名+模板后綴
         模板目錄默認為Tpl,模板主題默認為default,模板文件默認后綴為html
 模板賦值
         統一使用assign 如果多個賦值,可以做成數組,一次性賦值
 模板輸出
      使用display方法,可以使用display調用其他模板
          display('分組名:模塊名:操作名')
          display('主題@模塊名:操作名')
      還可以指定編碼和文件格式
          display('模塊名:操作名','編碼utf-8/gbk','text/xml')
 模板常量替換
      可以在模板中使用定義好的常量
          ../Public         /項目目錄/Tpl/default/Public/
          __Public__      當前網站的公共目錄 /Public
          __TMPL__       /項目目錄/Tpl/default/
          __ROOT__      當前網站根目錄地址
          __URL__         當前模塊的url地址
          __APP__         當前項目的url地址
          __ACTION__   當前操作的url地址
          __SELF__         當前頁面的url地址
         __UPLOAD__    當前網站的上傳目錄
         __INFO__         當前路徑
        ACTION_NAME           當前操作方法名稱

 APP_PATH                   代表當前項目目錄

        APP_NAME                  代表當前項目名稱
        CONFIG_PATH             項目配置文件目錄

COMMON_PATH          項目的公共文件目錄

DATA_PATH                  項目數據文件目錄

LOG_PATH                    日志存放目錄

MODEL_NAME              當前模塊名稱

MEMORY_LIMIT_ON     當前內存限制

TEMPLATE_NAME         當前模版名稱

TEMPLATE_PATH           當前模版路徑

        WEB_PUBLIC_PATH        網站的公共目錄,主入口文件同級目錄下的public.
       'TMPL_PARSE_STRING'=>array(),可用於在項目中增加模版替換變量,config中設置即可
 模板組合
       使用:
         <!--layout::Public:header::60-->
         <!--layout::$content::30-->
         <!--layout::Public:footer::60-->
     所有模板都會調用Public/header.html和Public/footer.html,而中間部分的內容可以動態的賦值
       $this->assign('content','user:list');
       $this->display('Index:default')
 系統模板
     頁面Trace模板:默認位亍系統目錄癿Tpl/PageTrace.tpl.php 是一個php文件,可更改 TMPL_TRACE_FILE迕行配置。
     異常模板:默認位亍系統目錄癿Tpl/ThinkException.tpl.php,可以更改
 使用第三方模板引擎
     下載官方的模板引擎擴展,放在 Lib\Think\Util\Template目錄下
     下載模板引擎放在Vendor目錄下
     在項目配置文件里設置 'TMPL_ENGINE_TYPE'=>'Smarty'
 模板定界符設定 TMPL_L_DELIM 和 TMPL_R_DELIM 在項目配置文件中設定
 在模板中輸出數組使用[],輸出對象使用:,.默認為數組輸出分割,也可以配置為對象輸出分割符
 使用函數的例子:
    {$webTitlle|md5|strtoupper||substr=0,3}  //等於 <?php echo (substr(strtuupper(md5($webTitle)),0,3))>,一般而言,函數的第一個參數就是前面函數的結果,如果前面函數的結果不是位於第一位,可以使用占位符###:
   {$create_time|date="y-m-d",###}
   還可以直接使用函數,而不必使用變量
      輸出方法並執行返回值  {:function()}
      執行方法但不輸出   {~function()}
  模板注釋 {/*aaaaaa*/}
  可以在模板中直接使用的系統變量
       {$Think.get.id}  {$Think.server.變量} {$Think.session.變量}等等
  可以在模板中使用系統定義好的常量
      {$Think.const.__SELF__}
 一些特殊常量
     {$Think.now} {$Think.verson}
  快捷輸出,這種方式不支持函數
    {@var}  session
    {^var}    post
     {.var}   get
  默認值輸出
     {$變量|defualt='值'}
  包含文件
     {includ file="主題名@模塊名:方法名" /} file的值可以是變量,在控制器中給變量賦值來改變包含內容
  加載js和css 
      <load file='' />
  循環輸出 volist,還有很多可設置的輸出方式,最簡單的
      < volist  name='分配的變量名'  id='自己設的循環名'>
           {$自己設的循環名.id}
       </volist> 
   foreach可以循環對象,但是功能較簡單
  swith標簽和php功能相同,但是case中的value支持條件判斷和變量
      <switch name="Think.get.type">
           <case value="gif|png|jpg">圖像格式</case>
           <default />其他格式
        </switch> 
       <switch name="User.userId">
           <case value="$adminId">admin</case>
           <case value="$memberId">member</case>
         <default />default
       </switch> 
   比較標簽
       <eq name="name" value="5" >value</eq>   如果=5就輸出
        <eq name="Think.get.name" value="value">相等<else/>丌相等</eq>
    范圍標簽
         <in name="id" value="1,2,3" >輸出內容1<else/>輸出內容2</in>
    變量賦值
          <assign name="var" value="123" />
    if標簽.condition后不能使用> <,替代為eq gt
           <if condition="($name eq 1) OR ($name gt 100) "> value1
              <elseif condition="$name eq 2" />value2
              <else /> value3
            </if> 
    原樣輸出
             <literal>
    php代碼
             可以在模板內直接使用
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM