Widget擴展一般用於頁面組件的擴展。
先說明Widget被調用的方法,你只需要在你的模板文件中使用這樣的語法:{:W("Demo/demo_widget_method",array(5,'thinkphp'))}
系統就會自動去尋找對應的Widget類文件並執行對應的方法。
具體步驟如下:
1.因爲是直接在模板中寫的{:W("Demo/demo_widget_method",array(5,'thinkphp'))},所以要了解後面的步驟,我們得移步系統的Template.class.php並看到了如下的東東
/**
* 模板標籤解析
* 格式: {TagName:args [|content] }
* @access public
* @param string $tagStr 標籤內容
* @return string
*/
public function parseTag($tagStr){
if(is_array($tagStr)) $tagStr = $tagStr[2];
//if (MAGIC_QUOTES_GPC) {
$tagStr = stripslashes($tagStr);
//}
//還原非模板標籤
if(preg_match('/^[\s|\d]/is',$tagStr))
//過濾空格和數字打頭的標籤
return C('TMPL_L_DELIM') . $tagStr .C('TMPL_R_DELIM');
$flag = substr($tagStr,0,1);
$flag2 = substr($tagStr,1,1);
$name = substr($tagStr,1);
if('$' == $flag && '.' != $flag2 && '(' != $flag2){ //解析模板變量 格式 {$varName}
return $this->parseVar($name);
}elseif('-' == $flag || '+'== $flag){ // 輸出計算
return '<?php echo '.$flag.$name.';?>';
}elseif(':' == $flag){ // 輸出某個函數的結果
return '<?php echo '.$name.';?>';
}elseif('~' == $flag){ // 執行某個函數
return '<?php '.$name.';?>';
}elseif(substr($tagStr,0,2)=='//' || (substr($tagStr,0,2)=='/*' && substr(rtrim($tagStr),-2)=='*/')){
//註釋標籤
return '';
}
// 未識別的標籤直接返回
return C('TMPL_L_DELIM') . $tagStr .C('TMPL_R_DELIM');
}
就在判斷“:”的地方判斷了模板中存在Widget的調用,經過方法前面的解析後的$name=W("Demo/demo_widget_method",array(5,'thinkphp'))
2.然後系統觸發W()方法,此方法在系統目錄下的Common/Functions.php中定義。
3.然後移步W()方法,幾經週轉,系統最後觸發了DemoWidget.class.php的demo_widget_method方法並傳遞了id和name這兩個參數
4.完畢
下面把上面的demo貼出
首先:(目錄結構貼出如下)
IndexController.class.php的內容如下:
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public function index(){
$this->display();
}
}
Index控制器下的index方法的對應模板如下:
<html>
<head>
<title>IndexController>Index</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<h2>IndexController>Index</h2>
{:W("Demo/demo_widget_method",array(5,'thinkphp'))}
</body>
</html>
DemoWidget.class.php的內容如下:<?php
namespace Home\Widget;
use Think\Controller;
class DemoWidget extends Controller{
public function demo_widget_method($id,$name){
$this->assign('id',$id);
$this->assign("name",$name);
$this->display("Demo:demo_widget_method");
}
}
View/Demo/demo_widget_method.html模板內容如下:
<h2>It is be show by DemoWidget/demo_widget_method</h2>
<h2 style="color:red;">Id:{$id}</h2>
<h2 style="color:red;">Name:{$name}</h2>
百看不如一練,不懂的就試試吧!
懂的話,恭喜你,我要像你學習!
有錯誤之處,還請見諒,歡迎指正哈~!