zoukankan      html  css  js  c++  java
  • 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 HomeController;  
    3. use ThinkController;  
    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 HomeWidget;  
    3.   
    4. use ThinkController;  
    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>  


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

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

  • 相关阅读:
    4G DTU是什么 4G DTU有什么功能
    模拟量转485采集模块是什么
    vue详情页回到列表页定位到之前位置(keep-alive)
    vue插槽
    elementUI给table表头加CheckBox
    $attrs和$listeners
    parseTime-格式化时间
    localStorage设置过期时间
    前端埋点
    将接口数据通过递归过滤
  • 原文地址:https://www.cnblogs.com/xtmp/p/5828338.html
Copyright © 2011-2022 走看看