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.php的demo_widget_method方法并传递了id和name这两个参数
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>
百看不如一练,不懂的就试试吧!
懂的话,恭喜你,我要像你学习!
ThinkPHP3.2.2 Widget扩展以及widget demo实例的更多相关文章
- ThinkPHP 3.2.3 Widget 扩展的使用
ThinkPHP3.2.3 手册中 Widget 扩展的地址是: http://www.kancloud.cn/manual/thinkphp/1862 Widget 扩展一般用于页面组件的扩展,和自 ...
- thinkphp Widget扩展
Widget扩展一般用于页面组件的扩展.大理石平台规格 举个例子,我们在页面中实现一个分类显示的Widget,首先我们要定义一个Widget控制器层 CateWidget,如下: namespace ...
- QT+常见控件+tab Widget 和Stacked Widget
首先:这里介绍以下tab Widget 和Stacked Widget 之间的区别和使用的方法: tab Widget控件可以直接的进行切换,Stacked Widget却不可以直接在界面上进行切换, ...
- 【java】之 apache commons-codec 与Apache Digest demo实例,支持md5 sha1 base64 hmac urlencode
使用commons-codec 进行加密的一些操作 package com.jiepu.ApacheDigest; import java.io.FileInputStream; import org ...
- 【xxl-job】轻松实现分布式定时任务demo实例
[项目描述]前段时间专门独立了一个spring boot服务,用于做和第三方erp系统的对接工作.此服务的第一个需求工作就是可以通过不同的规则,设置不同的定时任务,从而获取erp系统的商品数据.所以, ...
- 给easyui datebox时间框控件扩展一个清空的实例
给easyui datebox扩展一个清空的实例 步骤一:拓展插件 /** * 给时间框控件扩展一个清除的按钮 */ $.fn.datebox.defaults.cleanText = '清空'; ( ...
- 移动端页面弹幕小Demo实例说明
代码地址如下:http://www.demodashi.com/demo/11595.html 弹幕小Demo实例地址,点击看效果 写在前面:尝试做了一下弹幕的实例,欢迎提出并指正问题 问题说明: D ...
- jetty demo实例启动
Jetty是一个提供HHTP服务器.HTTP客户端和javax.servlet容器的开源项目.Jetty和tomcat相比,是轻量级服务器,支持热拔插,可扩展性大tomcat集成了很多功能,个性化瘦身 ...
- react目录结构、demo实例详解、属性数据绑定方式
1.目录结构 2.demo实例详解 a)创建Home.js import React, { Component } from 'react'; //创建一个组件必须要集成Component组件,且组件 ...
随机推荐
- penghui_031413 Bat命令学习
penghui_031413 Bat命令学习 基础部分:====================================================================== ...
- hdu 4762 公式 java
n/(n)^(m-1) import java.io.*; import java.math.*; import java.util.*; public class Main { static Big ...
- hdu 4007 暴力or线段树 ***
尼玛,INF不能定义太大,找标程对拍了好久 #include<cstdio> #include<iostream> #include<algorithm> #inc ...
- myeclipse报错: java compiler level does not match the version of the installed java project facet
在升级到myeclipse 9.0正式版后,很无耐地出发现了一个error级别的错误,虽然没在代码中,但是看着让人很不舒服.第一反应就是到网上搜索解决之道,结果,网站说在工程的属性中去找个叫啥&quo ...
- PMP 第三章 单个项目的项目管理标准
1 项目管理五大过程组分别是什么? 启动过程组 规划过程组 执行过程组 监控过程组 收尾过程组 2 启动项目组是干什么?包含哪些过程?每个阶段都需要启动吗? 启动过程组:获得授权,定义一个新项目或现有 ...
- [译]:Orchard入门——安装Orchard
原文链接:Installing Orchard 文章内容基于Orchard 1.8版本 安装Orchard的方式 主要有以下四种方式安装Orchard: 利用Microsoft Web Platfor ...
- 第二十篇:在SOUI中使用分层窗口
从Windows 2K开始,MS为UI开发引入了分层窗口这一窗口风格.使用分层窗口,应用程序的主窗口可以是半透明,也可以是逐点半透明(即每一个像素点的透明度可以不同). 可以说,正是因为有了分层窗口, ...
- MySQL模糊查询:LIKE模式和REGEXP模式
MySQL模糊查询提供了两种模式:LIKE模式和REGEXP模式. LIKE模式 LIKE模式是使用的LIKE 或 NOT LIKE 比较运算符进行模糊查询. SELECT 字段 FROM 表 WHE ...
- javascript settimeout and setinterval
setTimeout只运行一次,也就是说设定的时间到后就触发运行指定代码,运行完后即结束.如果运行的代码中再次运行同样的setTimeout命令,则可循环运行.setinterval是循环运行的,即每 ...
- Java优化之输出十万以内的质数
(1)未经优化时所耗费的时间: public class PrimeNumber { public static void main(String[] args) { long start = Sys ...