要件分析に基づき、3つの異なるポートレットが必要です。「ユーザーメニュー」ポートレット、「タグクラウド」ポートレット、「最近のコメント」ポートレットです。これらのポートレットは、Yii が提供する CPortlet ウィジェットを拡張して開発します。
このセクションでは、最初の具体的なポートレットである、認証されたユーザーのみが利用できるメニュー項目の一覧を表示するユーザーメニューポートレットを開発します。メニューには 4 つの項目が含まれます。
UserMenu
クラスの作成 ¶ユーザーメニューポートレットのロジック部分を表す UserMenu
クラスを作成します。クラスは、次の内容を持つファイル /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()
メソッドの両方をオーバーライドします。前者はポートレットのタイトルを現在のユーザーの名前に設定します。後者は、userMenu
という名前のビューをレンダリングしてポートレットの本文コンテンツを生成します。
ヒント: 最初に参照する前に、
Yii::import()
を呼び出すことでCPortlet
クラスを明示的に含める必要があることに注意してください。これは、CPortlet
が Yii の公式拡張ライブラリであるzii
プロジェクトの一部であるためです。パフォーマンスを考慮して、このプロジェクトのクラスはコアクラスとしてリストされていません。したがって、初めて使用する前にインポートする必要があります。
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
ポートレットの使用 ¶新しく完成した UserMenu
ポートレットを利用する時が来ました。次のようにレイアウトビューファイル /wwwroot/blog/protected/views/layouts/column2.php
を変更します。
...... <div id="sidebar"> if(!Yii::app()->user->isGuest) $this->widget('UserMenu'); </div> ......
上記では、widget()
メソッドを呼び出して UserMenu
クラスのインスタンスを生成して実行します。ポートレットは認証されたユーザーにのみ表示される必要があるため、現在のユーザーの isGuest
プロパティが false の場合 (ユーザーが認証されていることを意味する) にのみ widget()
を呼び出します。
UserMenu
ポートレットのテスト ¶ここまでの結果をテストしてみましょう。
http://www.example.com/blog/index.php
を入力します。ページのサイドバーセクションに何も表示されていないことを確認します。ログイン
ハイパーリンクをクリックし、ログインフォームに入力してログインします。成功した場合、UserMenu
ポートレットがサイドバーに表示され、ポートレットのタイトルにユーザー名が表示されていることを確認します。UserMenu
ポートレットの 'ログアウト' ハイパーリンクをクリックします。ログアウトアクションが成功し、UserMenu
ポートレットが非表示になることを確認します。作成したものは、再利用性の高いポートレットです。ほとんどまたはまったく変更せずに、別のプロジェクトで簡単に再利用できます。さらに、このポートレットの設計は、ロジックとプレゼンテーションを分離する必要があるという考え方に厳密に従っています。前のセクションでは指摘しませんでしたが、このような慣習は典型的な Yii アプリケーションのほぼすべての場所で使用されています。
タイプミスを見つけたり、このページを改善する必要があると思われますか?
github で編集する !
pendingCommentCount とは何ですか?
ポートレットが機能するためには、Comment モデルに追加の関数が必要です。
pendingCommentCount、より良い方法
Chris83 によるメソッドの実装に関して
これは、getPendingCommentCount() メソッドを実装するはるかに良い方法です
public function getPendingCommentCount() { return $this->count('status=:status', array(':status'=>self::STATUS_PENDING)); }
メソッドは Comment モデルにあるため、Comment:: ではなく $this を使用する必要があります。また、定義された定数を使用してコメントのステータスを識別する必要があります。
CDbCriteria を使用してカウントを実装することはやり過ぎであり、不要で、おそらく CPU サイクルを浪費する可能性があります。
コードを暗号化せずに可能な限り簡潔にする方法を探している場合は、さらにクリーンでより短い方法があります
public function getPendingCommentCount() { return $this->count('status='.self::STATUS_PENDING); }
getPendingCommentCount() をどこに配置するか
説明されている getPendingCommentCount() メソッドは、コメントモデルファイルで必要です。これは、/protected/models/comment.php の下にあります
コメントするには、サインアップ または ログイン してください。