widget好處是方面重用和靈活移動。cwidget是所有的widge父類,同時它又是是cbasecontroller的子類,cwidget提供了類似ccontroller中的一些方法,但render()方法渲染的時候不帶layout,而且渲染的時候$this指得是cwidget物件,而不是ccontroller物件,ccontroller物件可以通過其中的getcontroller()方法獲取,用其子類中需要對init()和run()方法過載以定製不同的掛件。
cbasecontroller提供widget()方法以及beginwidget()、endwidget()方法載入掛件。
public function widget($classname,$properties=array(),$captureoutput=false)
else }
public function createwidget($classname,$properties=array())
上面是直接載入掛件方法,通過第三個引數來決定是返回內容還是直接輸出內容,widget是通過cwidgetfactory來建立。
以**常見的麵包屑導航為例,下面是視**件中的**
$this->breadcrumbs=array(
'users',
);$this->widget('zii.widgets.cbreadcrumbs', array(
'links'=>$this->breadcrumbs,
));
通過cbasecontroller的widget()方法,建立cbreadcrumbs掛件,初始化後,執行run()方法渲染內容。
/**
* renders the content of the portlet.
*/public function run()
echo implode($this->separator,$links);
echo chtml::closetag($this->tagname);
}
另外乙個多級布局例子來說明beginwidget()、endwidget()的用法。在腳手架生成的**中,layout下的column1中的**
<?php $this->begincontent('//layouts/main'); ?>
<?php echo $content; ?>
<?php $this->endcontent(); ?>
**中begincontent($view=null,$data=array())其實是對beginwidget('ccontentdecorator',array('view'=>$view, 'data'=>$data))再次封裝,建立內容裝飾掛件ccontentdecorator,把主檢視傳進去,
與widget()的不同點是通過$this->_widgetstack=$widget和$widget=array_pop($this->_widgetstack)),應用棧來操作掛件,在兩個方法中間的內容通過php內容輸出緩衝函式捕獲,所有上面**的作用是將<?php echo $content; ?>
以變數($content)的方式傳給main.php中。
Yii框架的掛件的使用
參考文件 應用的場景 頁面的某一部分多次被使用 最簡單的一種應用 但是這種寫法是被棄了 大佬選擇了寫乙個php檔案,require 載入的模式 掛件的寫法 useyii base widget classreporttagcontroller extendswidget public functio...
YII框架分析筆記1 YII執行流程
yii整體執行流程直觀,具體由以下步驟 1 程式入口檔案index.php載入yii框架引導程式 bootstrap 檔案yii.php,載入配置檔案以及其他自定義配置。2 yii.php中yii類繼承了yiibase,主要封裝框架的一些通用方法,比如自動載入 建立元件 核心類路徑對映 記錄日誌以及...
YII框架分析筆記9 url路由
curlmanager初始化的時候如果url格式 預設是get格式 如果是path格式,則通過配置中的rule陣列建立路由規則物件,根據路由規則獲取內部路由,當路由都不匹配的時候會根據設定的usestrictparsing引數決定丟擲乙個404錯誤合適返回 pathinfo。如果不是path格式的話...