ThinkPHP3.2.2 Widget擴展以及widget demo實例

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.phpdemo_widget_method方法並傳遞了idname這兩個參數

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>

百看不如一練,不懂的就試試吧!

懂的話,恭喜你,我要像你學習!

有錯誤之處,還請見諒,歡迎指正哈~!

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