3.0版本的Widget對Action和View的支持力度是不夠的,雖然能夠實現基本的模板渲染輸出。3.1版本的發布帶來的多層MVC功能,給我們實現Widget的方式帶來了新的思路,且看是如何實現吧。
看過ThinkPHP3.1新特性詳解:多層MVC的朋友們一定了解,3.1版本可以支持多層的控制器功能,因此我們可以在控制器層增加一層:Widget層。
首先,還是在項目的Lib目錄下面創建一個Widget目錄,并且創建一個TestWidget類(Lib/Widget/TestWidget.class.php)如下:
class TestWidget extends Action{
public function hello($name=''){
echo ("hello,".$name."!");
}
}
我們看到TestWidget和之前的區別是沒有繼承Widget類,而是直接繼承了Action類,這就代表著在TestWidget中可以直接調用Action的方法,包括對模板的渲染輸出。
定義完成后,我們怎么調用這個Widget呢?用W方法肯定行不通了,這次需要R方法出場了。
R方法的作用是遠程調用模塊的操作,但是3.1賦予了它新的作用,可以支持調用所有控制器層的操作方法,所以,我們可以在模板中這樣來調用Widget:
{:R('Test/hello',array('ThinkPHP'),'Widget')}
就可以實現在頁面中的某個區域輸出:
hello,ThinkPHP!
由于除了Action控制器之外的其他控制器層是無法直接通過URL訪問的,所以這個Widget方法只能通過R方法在內部調用才可以。
你可以在TestWidget類中調用Model來輸出其他數據,如果需要渲染自身的模板,則可以直接調用display方法就行了。
class TestWidget extends Action{
public function hello($name=''){
$this->assign('name',$name);
$this->display('Test:hello');
}
}
我們在項目的Tpl/Test/ 目錄下面創建一個hello(Tpl/Test/hello.html)模板文件,添加輸出:
Hello,{$name}!
如果你希望和之前的Widget一樣,把模板文件放到當前目錄下面,則可以使用:
class TestWidget extends Action{
public function hello($name=''){
$this->assign('name',$name);
$this->display(dirname(__FILE__).'/Test/hello.html');
}
}
這個時候,你就可以把剛才定義的hello模板文件放入Widget/Test/ 目錄下面了。
其實這個功能對于新版的多層MVC功能來說,只是一個拋磚引玉了,各位朋友還可以挖掘更多的用法出來,也歡迎投稿分享。