您的位置:首页 > 编程语言 > PHP开发

ThinkPHP3.2.2 Widget扩展以及widget demo实例

2015-01-14 13:18 501 查看
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.phpdemo_widget_method方法并传递了idname这两个参数

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>

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

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

有错误之处,还请见谅,欢迎指正哈~!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  thinkphp 扩展 Widget