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并看到了如下的东东

 

[php] view plain copy
 
  1. /** 
  2.     * 模板标签解析 
  3.     * 格式: {TagName:args [|content] } 
  4.     * @access public 
  5.     * @param string $tagStr 标签内容 
  6.     * @return string 
  7.     */  
  8.    public function parseTag($tagStr){  
  9.        if(is_array($tagStr)) $tagStr = $tagStr[2];  
  10.        //if (MAGIC_QUOTES_GPC) {  
  11.            $tagStr = stripslashes($tagStr);  
  12.        //}  
  13.        //还原非模板标签  
  14.        if(preg_match('/^[\s|\d]/is',$tagStr))  
  15.            //过滤空格和数字打头的标签  
  16.            return C('TMPL_L_DELIM') . $tagStr .C('TMPL_R_DELIM');  
  17.        $flag   =  substr($tagStr,0,1);  
  18.        $flag2  =  substr($tagStr,1,1);  
  19.        $name   = substr($tagStr,1);  
  20.        if('$' == $flag && '.' != $flag2 && '(' != $flag2){ //解析模板变量 格式 {$varName}  
  21.            return $this->parseVar($name);  
  22.        }elseif('-' == $flag || '+'== $flag){ // 输出计算  
  23.            return  '<?php echo '.$flag.$name.';?>';  
  24.        }elseif(':' == $flag){ // 输出某个函数的结果  
  25.            return  '<?php echo '.$name.';?>';  
  26.        }elseif('~' == $flag){ // 执行某个函数  
  27.            return  '<?php '.$name.';?>';  
  28.        }elseif(substr($tagStr,0,2)=='//' || (substr($tagStr,0,2)=='/*' && substr(rtrim($tagStr),-2)=='*/')){  
  29.            //注释标签  
  30.            return '';  
  31.        }  
  32.        // 未识别的标签直接返回  
  33.        return C('TMPL_L_DELIM') . $tagStr .C('TMPL_R_DELIM');  
  34.    }  


就在判断“:”的地方判断了模板中存在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] view plain copy
 
  1. <?php  
  2. namespace Home\Controller;  
  3. use Think\Controller;  
  4. class IndexController extends Controller {  
  5.     public function index(){  
  6.         $this->display();  
  7.     }  
  8. }  

Index控制器下的index方法的对应模板如下:

 

 

[html] view plain copy
 
  1. <html>  
  2.     <head>  
  3.         <title>IndexController>Index</title>  
  4.         <meta charset="UTF-8">  
  5.         <meta name="viewport" content="width=device-width, initial-scale=1.0">  
  6.     </head>  
  7.     <body>  
  8.         <h2>IndexController>Index</h2>  
  9.         {:W("Demo/demo_widget_method",array(5,'thinkphp'))}  
  10.     </body>  
  11. </html>  

DemoWidget.class.php的内容如下:

[php] view plain copy
 
  1. <?php  
  2. namespace Home\Widget;  
  3.   
  4. use Think\Controller;  
  5. class DemoWidget extends Controller{  
  6.       
  7.     public function demo_widget_method($id,$name){  
  8.        $this->assign('id',$id);  
  9.        $this->assign("name",$name);  
  10.        $this->display("Demo:demo_widget_method");  
  11.     }  
  12. }  

View/Demo/demo_widget_method.html模板内容如下:

 

 

[html] view plain copy
 
  1. <h2>It is be show by DemoWidget/demo_widget_method</h2>  
  2. <h2 style="color:red;">Id:{$id}</h2>  
  3. <h2 style="color:red;">Name:{$name}</h2>  


百看不如一练,不懂的就试试吧!

 

懂的话,恭喜你,我要像你学习!

posted @ 2016-09-01 09:06  虚幻的街景  阅读(631)  评论(0编辑  收藏  举报