ThinkPHP的Widget扩展实例
分类:多线程

ThinkPHP的Widget扩展用于根据页面需要输出不同内容,它在项目目录中的Lib/Widget下定义。

本文实例讲述了thinkPHP下的widget扩展用法。分享给大家供大家参考,具体如下:

本文实例讲述了ThinkPHP中Widget扩展的两种写法及调用方法。分享给大家供大家参考,具体如下:

具体定义如下:

Widget扩展用于在页面根据需要输出不同的内容,Widget扩展的定义是在项目的LibWidget目录下面定义Widget类库,例如下面定义了一个用于显示最近的评论的Widget:

Widget扩展一般用于页面组件的扩展,在页面根据需要输出不同的内容,下面介绍一下ThinkPHP中Widget的两种写法及调用

class NewsListWidget extends Widget{
  public function render($data){
    // code...
  }
}

位于LibWidgetShowCommentWidget.class.php

写法一:

需要注意:

Widget类库需要继承Widget类,并且必须定义render方法实现,例如:

ArticlWidget.class.php文件:

1.Widget是一个抽象类,其中有一个抽象方法(abstract)render,必须在子类中实现;
2.Widget的render方法必须使用return返回,而不是直接输出;
3.$data是传入Widget的参数。

render方法必须使用return返回要输出的字符串信息,而不是直接输出。

class ArticleWidget extends Widget { /** * * @param array $data * @return type * 调用方法:{:W('ArticleList',array)} * cid为分类id,limit为调用数量 */ public function render { $Article = M; $articleMap["cid"] = $data["cid"]; $data["articleList"] = $Article->where->order->limit->select(); foreach ($articleList as $key => $value) { if ($value["thumbnail"] == "") { $data["articleList"][$key]["thumbnail"] = '/Public/Img/Common/noThumbnail.jpg'; } } return $this->renderFile; }}

然后我们可以在模板中直接调用这个Widget:

Widget也可以调用Widget类的renderFile方法,渲染模板后进行输出。

模板文件articleList.html在Lib/Widget/Article目录下

{:W('NewsList', array('tmpl' => 'a'))}

在项目的lib目录下建立widget目录,与action目录同级。

  {$articleList_vo.title} 

这里我传入了一个参数,这是比较常见的用法,Widget用来做什么?根据页面需要输出不同内容,这个不同内容,可以是数据不同,当然也可以是模板不同。

建立TestWidget.class.php:

写法二:

class NewsListWidget extends Widget{
  public function render($data){
    // code
    $news; // 这里可以是数据检索语句检索出来一个数据集
    $html = $this->renderFile($data['tmpl'], $news);
    return $html;
  }
}
class TestWidget extends Widget{ public function render{ //print_r; $data['id']=$data['id']; $data['info']=$data['info']; $content = $this->renderFile; //print_r; return $content; }}
class ArticleWidget extends Action { /** * * @param array $data * @return type * 调用方法:{:R('Article/articleList',array,'Widget')} * cid为分类id,limit为调用数量 */ public function articleList { $Article = M; $articleMap["cid"] = $cid; $data = $Article->where->order->limit; foreach ($data as $key => $value) { if ($value["thumbnail"] == "") { $data[$key]["thumbnail"] = '/Public/Img/Common/noThumbnail.jpg'; } } $this->assign; $this->display; }}

这时候会自动渲染模板文件/Lib/Widget/NewsList/a.html的内容,并把$news传送过去,可以当普通模板文件处理,然后输出。

在此目录下建立对应的Test文件夹,下面放$this->rendFile调用的html页面。

模板文件articleList.html,内容同写法一,但放在Tpl/风格名/Widget/目录下

当然,还可以在Action控制器里面获取Widget的内容,进行二次加工。

index.html 通过使用循环显示数据的信息

如果模板文件放在ArticleWiget.class.php文件所在目录的Article文件夹下,则写法如下:

$content = W('NewsList', array('tmpl' => 'a'), TRUE); // 第三个参数表示是否返回字符串,默认是FALSE,代表直接输出。
 这是widget调用的模板页面  //注意:id对应与$data的键值 {$vo}  
  //info对应于$data的键值  {$v}  
$this->display . '/Article/articleList.html');

另外,ThinkPHP是MVC框架,请大家把数据检索相关的内容放在Model层

IndexAction.class.php

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。

class TestAction extends Action{ public function index(){ $info=array(array,array; $this->assign; $this->display(); }}

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

action调用的tpl中的html页面的为index.html

这个是test调用的action
{:W('Test',array("id"=>array,"info"=>$info))} //传递给TestWidget.class.php 的参数,要以array格式传递

运行IndexAction.class.php

这样就把show.html中的内容包含进来了

name什么时候用widgte呢?

widget通常是一些封装好了的JS效果组件,直接调用‘加入参数就可以得到一些效果,例如,TAB菜单、旋转木马、图片轮播等交互效果

比如网站的菜单栏。右边常不更新的栏目之类的…

方便多次调用,比如在页面上左侧显示一个新闻列表,每个页面如果都调用这个列表,是不是得在每个控制器里写一遍相同的代码,不累么,用widget可能只需要写一次,然后模板中多次使用

希望本文所述对大家基于thinkPHP框架的PHP程序设计有所帮助。

本文由10bet手机官网发布于多线程,转载请注明出处:ThinkPHP的Widget扩展实例

上一篇:ThinkPHP中的三大自动简介,ThinkPHP三大自动 下一篇:ThinkPHP3快速入门教程,ThinkPHP的Widget扩展实例
猜你喜欢
热门排行
精彩图文