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. use Think\Controller;
  4. class DemoWidget extends Controller{
  5. public function demo_widget_method($id,$name){
  6. $this->assign(‘id‘,$id);
  7. $this->assign("name",$name);
  8. $this->display("Demo:demo_widget_method");
  9. }
  10. }

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>

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

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

时间: 2025-01-02 14:39:18

ThinkPHP3.2.2 Widget扩展以及widget demo实例的相关文章

ThinkPHP 3.2.3 Widget 扩展的使用

ThinkPHP3.2.3 手册中 Widget 扩展的地址是: http://www.kancloud.cn/manual/thinkphp/1862 Widget 扩展一般用于页面组件的扩展,和自定义标签具有相同的功能. 例如:在项目首页(位于 Home 应用 ./Application/Home)的某个栏目如[最热新闻],可以通过 Widget 扩展进行数据调用. 首先在 ./Application/Home 下创建 Widget 目录,在该目录中创建 HotWidget.class.ph

QT+常见控件+tab Widget 和Stacked Widget

首先:这里介绍以下tab Widget 和Stacked Widget 之间的区别和使用的方法: tab Widget控件可以直接的进行切换,Stacked Widget却不可以直接在界面上进行切换,需要第三方的控件来进行支持(按钮).Stacked Widget的具体使用方法如下图: #include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include <QCo

给easyui datebox时间框控件扩展一个清空的实例

给easyui datebox扩展一个清空的实例 步骤一:拓展插件 /** * 给时间框控件扩展一个清除的按钮 */ $.fn.datebox.defaults.cleanText = '清空'; (function ($) { var buttons = $.extend([], $.fn.datebox.defaults.buttons); buttons.splice(1, 0, { text: function (target) { return $(target).datebox("o

java swing开发的图像生成器demo实例源代码下载,实现绘制图像,截屏功能。

一个类似于画画的javase程序 绘制图形 原文:java swing开发的图像生成器demo实例源代码下载,实现绘制图像,截屏功能. java源代码下载地址:http://www.zuidaima.com/share/1550463330028544.htm 获取屏幕 打开调色板

TextAppearance.Material.Widget.Button.Inverse,Widget.Material.Button.Colored

编译xamarin android项目报错: android:TextAppearance.Material.Widget.Button.Inverse android:Widget.Material.Button.Colored 网上查找的参考帖子: http://jingyan.baidu.com/article/4dc40848b4aac8c8d946f13b.html http://blog.csdn.net/u010499721/article/details/49022183 最终解

yii2 Nav::widget() 和 Menu::widget()

Nav::widget http://www.yiiframework.com/doc-2.0/yii-bootstrap-nav.html Menu::widget()  http://www.yiiframework.com/doc-2.0/yii-widgets-menu.html#$items-detail 这两个widget都是显示菜单的,或者说可以这么干,使用之中返现有个很明显的不同: Nav 的子菜单或者子项目默认使用的ul样式是'dropdown-menu',Menu 默认只用一

NET3.5中的扩展方法,DEMO直接通过IEnumerable&lt;T&gt;来自定义调用过滤方法

namespace ConsoleApplication2{ public static class Filter { public static IEnumerable<string> ForUser(this IEnumerable<string> qry, string userName) { return from a in qry where a.Contains(userName.ToLower()) select a; } /// <summary> //

xfire demo 实例

(一) 通过 xfire 发布 webservice 服务 1.添加 xfire相关jar包(以maven为例): <dependency> <groupId>org.codehaus.xfire</groupId> <artifactId>xfire-all</artifactId> <version>1.2.6</version> </dependency> 2.配置 web.xml      <se

ajax 前后端数据传输demo实例

先写html页面(test.html): 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf8"> 5 <title>ajax</title> 6 <script type="text/javascript" src='http://apps.bdimg.com/libs/jquery/1.6.4/jquery.min.js'&