<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head><meta forua="true" http-equiv="Cache-Control" content="max-age=0" /></head>
<card title="ThinkPHP3.1的Widget新用法 多层MVC功能" id="card1">
<p> 游客</p><p>
标题:ThinkPHP3.1的Widget新用法 多层MVC功能<br/>
正文:<br/>
ThinkPHP3.0版本的Widget对Action和View的支持力度是相对不够的，仅能够实现基本的模板渲染输出。而3.1版本的发布带来的多层MVC功能，给我们实现Widget的方式带来了新的思路，且看是如何实现吧。<br/> <br/> 由于ThinkPHP3.1增加了对多层MVC的支持，因此3.1版本可以支持多层的控制器功能，由此我们就可以在控制器层再增加一层：Widget层。首先，还是在项目的Lib目录下面创建一个Widget目录，并且创建一个TestWidget类（Lib/Widget/TestWidget.class.php）如下：class TestWidget extends Action{<br/>  public function hello($name=''){<br/>    echo (&quot;hello,&quot;.$name.&quot;!&quot;);<br/>  }<br/> }我们看到TestWidget和之前的区别是没有继承Widget类，而是直接继承了Action类，这就代表着在TestWidget中可以直接调用Action的方法，包括对模板的渲染输出。定义完成后，我们怎么调用这个Widget呢？用W方法肯定行不通了，这次需要R方法出场了。<br/> R方法的作用是远程调用模块的操作，但是3.1赋予了它新的作用，可以支持调用所有控制器层的操作方法，所以，我们可以在模板中这样来调用Widget：{:R('Test/hello',array('ThinkPHP'),'Widget')}就可以实现在页面中的某个区域输出：hello,ThinkPHP!由于除了Action控制器之外的其他控制器层是无法直接通过URL访问的，所以这个Widget方法只能通过R方法在内部调用才可以。你可以在TestWidget类中调用Model来输出其他数据，如果需要渲染自身的模板，则可以直接调用display方法就行了。class TestWidget extends Action{<br/>  public function hello($name=''){<br/>    $this-&amp;gt;assign('name',$name);<br/>    $this-&amp;gt;display('Test:hello');<br/>  }<br/> }我们在项目的Tpl/Test/ 目录<br/><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1445&amp;Page=1">[&lt;&lt;]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1445&amp;Page=1">[[1]]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1445&amp;Page=2">[2]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1445&amp;Page=2">[&gt;&gt;]</a><br/>
<br/>
<a href="wap.asp?act=Com&amp;id=1445">查看评论(0)</a><br/>
<a href="wap.asp?act=AddCom&amp;inpId=1445">发表评论</a><br/><br/>

<br/>

<br/>
<a href="http://camnpr.com/wap.asp">首页</a>
</p>
</card>
</wml>