Widget扩展一般用于页面组件的扩展。

先说明Widget被调用的方法,你只需要在你的模板文件中使用这样的语法:{:W("Demo/demo_widget_method",array(5,'thinkphp'))}

系统就会自动去寻找对应的Widget类文件并执行对应的方法。

具体步骤如下:

1.因为是直接在模板中写的{:W("Demo/demo_widget_method",array(5,'thinkphp'))},所以要了解后面的步骤,我们得移步系统的Template.class.php并看到了如下的东东

  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的内容如下:

  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方法的对应模板如下:

  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的内容如下:

  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模板内容如下:

  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>

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

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

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

  1. ThinkPHP 3.2.3 Widget 扩展的使用

    ThinkPHP3.2.3 手册中 Widget 扩展的地址是: http://www.kancloud.cn/manual/thinkphp/1862 Widget 扩展一般用于页面组件的扩展,和自 ...

  2. thinkphp Widget扩展

    Widget扩展一般用于页面组件的扩展.大理石平台规格 举个例子,我们在页面中实现一个分类显示的Widget,首先我们要定义一个Widget控制器层 CateWidget,如下: namespace ...

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

    首先:这里介绍以下tab Widget 和Stacked Widget 之间的区别和使用的方法: tab Widget控件可以直接的进行切换,Stacked Widget却不可以直接在界面上进行切换, ...

  4. 【java】之 apache commons-codec 与Apache Digest demo实例,支持md5 sha1 base64 hmac urlencode

    使用commons-codec 进行加密的一些操作 package com.jiepu.ApacheDigest; import java.io.FileInputStream; import org ...

  5. 【xxl-job】轻松实现分布式定时任务demo实例

    [项目描述]前段时间专门独立了一个spring boot服务,用于做和第三方erp系统的对接工作.此服务的第一个需求工作就是可以通过不同的规则,设置不同的定时任务,从而获取erp系统的商品数据.所以, ...

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

    给easyui datebox扩展一个清空的实例 步骤一:拓展插件 /** * 给时间框控件扩展一个清除的按钮 */ $.fn.datebox.defaults.cleanText = '清空'; ( ...

  7. 移动端页面弹幕小Demo实例说明

    代码地址如下:http://www.demodashi.com/demo/11595.html 弹幕小Demo实例地址,点击看效果 写在前面:尝试做了一下弹幕的实例,欢迎提出并指正问题 问题说明: D ...

  8. jetty demo实例启动

    Jetty是一个提供HHTP服务器.HTTP客户端和javax.servlet容器的开源项目.Jetty和tomcat相比,是轻量级服务器,支持热拔插,可扩展性大tomcat集成了很多功能,个性化瘦身 ...

  9. react目录结构、demo实例详解、属性数据绑定方式

    1.目录结构 2.demo实例详解 a)创建Home.js import React, { Component } from 'react'; //创建一个组件必须要集成Component组件,且组件 ...

随机推荐

  1. java.lang.UnsupportedClassVersionError: org/xwiki/xxx : Unsupported major.minor version 51.0

    此类问题主要是因为Unsupported major.minor version 51.0. 原因是JDK版本不一致导致的问题.在web应用中碰到此问题. 应用中规定使用JDK7.0,本地JDK为6. ...

  2. PHPCMS 实现上一篇、下一篇

    方法一:直接调用phpcms系统的函数 <div class="info"> <span>上一篇:<a href="{$previous_p ...

  3. jQuery基础知识点(DOM操作)

    1.样式属性操作     1)设置样式属性操作         ①设置单个样式: // 第一个参数表示:样式属性名称 // 第二个参数表示:样式属性值 $(selector).css(“color”, ...

  4. Mysql怎样取消错误命令

    1.补上分号. 2.quit 3.由于Mysql中,‘号和"号都是成对出现的,故当错误键入'号或"号时,需要补全另一半才能退出.

  5. Practical Java (一)关于reference

    Practice 1, 4, 7, 8 1. 参数传递:by value or by reference 变量型别:reference 和 primitive Java中的变量分为两种:referen ...

  6. 解决phpMyAdmin“登录超时 (1440 秒未活动),请重新登录”的问题

    问题描述 phpMyAdmin打开一段时间后会出现“登录超时 (1440 秒未活动),请重新登录”的问题: 解决方法 永久有效: vim config.inc.php 然后在里面加上下面这一行: $c ...

  7. UVA 11475 后缀数组/KMP

    题目链接: 题意:给定一个只含字母的字符串,求在字符串末尾添加尽量少的字符使得字符串为回文串. 思路:因为只能从末尾添加字符,所以其实求的是最长的后缀回文串.那么添加的字符为除了这个原串的最长后缀回文 ...

  8. HDU 3068 回文串-Manacher

    题意链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 题意:中文题. 思路:Manacher模板题 #include<iostream> ...

  9. mvc-6依赖管理

    CommonJS CommonJS规范,主要解决命名空间管理模块和用一套标准的编程模式来加载模块: 很快成为了JavaScript模块写法的事实标准: 它包含IO接口,底层的套接字流,以及单元测试等标 ...

  10. 浩瀚技术助力批发零售商户实现PDA移动POS打印扫描进销存信息化管理

    批发零售商户其各门店销售品种多,销售量大,在市场上占据巨大的份额,随着各门店的不断扩展,基层的销售管理并不尽如意,传统的进销存管理软件安装在PC端,无法满足有现有的业务支撑,面对当前现状,移动进销存管 ...