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>
百看不如一练,不懂的就试试吧!
懂的话,恭喜你,我要像你学习!
有错误之处,还请见谅,欢迎指正哈~!