ThinkPHP學習總結:
簡單易用的MVC模式:
更多內容=》
一、THINKPHP的一般開發流程
- 創建數據庫和數據表
- 項目命名並創建項目入口文件
- 完成項目配置
- 創建控制器類
- 創建模型類
- 創建模板文件
- 運行和調試
二、關於模板
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地址
四、簡單經典的操作數據庫
基礎模型類的使用
$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的路由
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重寫
|
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 |
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在最后即可
$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代碼
可以在模板內直接使用
|