根據需求分析,我們需要三個不同的 portlet:「使用者選單」portlet、「標籤雲」portlet 和「近期留言」portlet。我們將透過擴充 Yii 提供的 CPortlet 小工具來開發這些 portlet。
在本節中,我們將開發第一個具體的 portlet - 使用者選單 portlet,它會顯示一個僅供已驗證使用者使用的選單項目清單。此選單包含四個項目
UserMenu
類別 ¶我們建立 UserMenu
類別來表示使用者選單 portlet 的邏輯部分。此類別儲存在檔案 /wwwroot/blog/protected/components/UserMenu.php
中,其內容如下
Yii::import('zii.widgets.CPortlet');
class UserMenu extends CPortlet
{
public function init()
{
$this->title=CHtml::encode(Yii::app()->user->name);
parent::init();
}
protected function renderContent()
{
$this->render('userMenu');
}
}
UserMenu
類別繼承自 zii
函式庫的 CPortlet
類別。它覆寫了 CPortlet
的 init()
方法和 renderContent()
方法。前者將 portlet 標題設定為目前使用者的名稱;後者透過呈現名為 userMenu
的視圖來產生 portlet 主體內容。
提示: 請注意,我們必須在第一次引用
CPortlet
類別之前,透過呼叫Yii::import()
明確地包含它。這是因為CPortlet
是zii
專案的一部分 -- Yii 的官方擴充函式庫。為了效能考量,此專案中的類別未列為核心類別。因此,我們必須在使用它的第一次之前匯入它。
userMenu
視圖 ¶接下來,我們建立 userMenu
視圖,它儲存在檔案 /wwwroot/blog/protected/components/views/userMenu.php
中
<ul> <li> echo CHtml::link('Create New Post',array('post/create')); </li> <li> echo CHtml::link('Manage Posts',array('post/admin')); </li> <li> echo CHtml::link('Approve Comments',array('comment/index')) . ' (' . Comment::model()->pendingCommentCount . ')'; </li> <li> echo CHtml::link('Logout',array('site/logout')); </li> </ul>
資訊: 預設情況下,小工具的視圖檔案應放置在包含小工具類別檔案的目錄下的
views
子目錄中。檔案名稱必須與視圖名稱相同。
UserMenu
Portlet ¶現在是時候利用我們新完成的 UserMenu
portlet 了。我們修改版面配置視圖檔案 /wwwroot/blog/protected/views/layouts/column2.php
如下
...... <div id="sidebar"> if(!Yii::app()->user->isGuest) $this->widget('UserMenu'); </div> ......
在上述程式碼中,我們呼叫 widget()
方法來產生並執行 UserMenu
類別的實例。由於 portlet 應僅顯示給已驗證的使用者,因此我們僅在目前使用者的 isGuest
屬性為 false 時(表示使用者已驗證)呼叫 widget()
。
UserMenu
Portlet ¶讓我們測試一下目前為止的成果。
http://www.example.com/blog/index.php
。確認頁面的側邊欄區段中沒有顯示任何內容。登入
超連結並填寫登入表單以登入。如果成功,請確認 UserMenu
portlet 出現在側邊欄中,且 portlet 的標題為使用者名稱。UserMenu
portlet 中的「登出」超連結。確認登出動作成功,且 UserMenu
portlet 消失。我們建立的是一個高度可重複使用的 portlet。我們可以輕鬆地在不同的專案中重複使用它,而無需進行任何修改或僅需少量修改。此外,此 portlet 的設計緊密遵循邏輯與呈現應分離的哲學。雖然我們在先前的章節中沒有指出這一點,但在典型的 Yii 應用程式中,這種實務幾乎無處不在。
發現錯字或您認為此頁面需要改進?
在 github 上編輯 !
pendingCommentCount 是什麼?
您需要在您的 Comment 模型中加入一個額外的函式,portlet 才能運作。
pendingCommentCount,更好的方法
關於 Chris83 方法的實作
這是一個更好的方法來實作 getPendingCommentCount() 方法
public function getPendingCommentCount() { return $this->count('status=:status', array(':status'=>self::STATUS_PENDING)); }
該方法位於 Comment 模型中,因此我們應該使用 $this 而不是 Comment::,我們也應該使用已定義的常數來識別留言狀態。
使用 CDbCriteria 來實作計數是過度和不必要的,可能會浪費 CPU 週期。
這裡有一個更簡潔、更短的方法,如果您喜歡盡可能簡潔而不隱晦的程式碼
public function getPendingCommentCount() { return $this->count('status='.self::STATUS_PENDING); }
getPendingCommentCount() 應該放在哪裡
描述的 getPendingCommentCount() 方法需要在留言模型檔案中。它位於 /protected/models/comment.php 下
註冊 或 登入 以進行評論。