ユーザメニューポートレットの作成
==========================

要求分析に基けば、3種のポートレットが必要だと判明しました。
それらは「ユーザメニュー」ポートレット、「タグクラウド」ポートレット、「最近のコメント」ポートレットです。
これらのポートレットを、Yii が提供する [CPortlet] ウイジェットを拡張して開発します。

このセクションでは、最初の具体的なポートレットを開発します。
それはユーザメニューポートレットで、認証されたユーザにのみ提供されるメニュー項目のリストを表示するものです。
メニューは以下の4項目です。

 * コメントを承認: 承認待ちとなっているコメントの一覧へのハイパーリンク
 * 新しい記事を作成: 記事作成ページへのハイパーリンク
 * 記事を管理: 記事管理ページへのハイパーリンク
 * ログアウト: 現在のユーザをログアウトさせるリンクボタン


`UserMenu` クラスの作成
-------------------------

ユーザメニューポートレットの論理部分を表現する `UserMenu` クラスを作成します。 
このクラスはファイル `/wwwroot/blog/protected/components/UserMenu.php` に格納され、
以下のような内容を持ちます。

~~~
[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` というビューを描画することによりポートレットのボディ内容を生成します。

> Tip|情報: 最初に `CPortlet` クラスにアクセスする前に `Yii::import()` を呼んで、明示的に `CPortlet` クラスを含めなければならないことに注意してください。
これは `CPortlet` が `zii` プロジェクトの一部であるためです (`zii` は Yii の公式な拡張ライブラリです)。
パフォーマンス上の考慮から、このプロジェクトに属するクラスはコアクラスとしてリストされていません。そのため、最初に使う前にはインポートする必要があります。


`userMenu` ビューの作成
------------------------

次に、`/wwwroot/blog/protected/components/views/userMenu.php` として格納される `userMenu` ビューを作成します。

~~~
[php]
<ul>
	<li><?php echo CHtml::link('新しい記事を作成',array('post/create')); ?></li>
	<li><?php echo CHtml::link('記事を管理',array('post/admin')); ?></li>
	<li><?php echo CHtml::link('コメントを承認',array('comment/index'))
		. ' (' . Comment::model()->pendingCommentCount . ')'; ?></li>
	<li><?php echo CHtml::link('ログアウト',array('site/logout')); ?></li>
</ul>
~~~

> Info|情報: 既定として、ウィジェットのビューファイルは、ウィジェットクラスファイルを含むディレクトリの `views` サブディレクトリの下に配置されるべきです。
ファイル名はビュー名と等しい必要があります。


`UserMenu` ポートレットの使用
------------------------

新しく完成した `UserMenu` ポートレットを使うときがきました。
レイアウトビューファイル `/wwwroot/blog/protected/views/layouts/column2.php` を以下のように変更します。

~~~
[php]
......
<div id="sidebar">
	<?php if(!Yii::app()->user->isGuest) $this->widget('UserMenu'); ?>
</div>
......
~~~

上記においては、`widget()` メソッドを呼んで `UserMenu` クラスのインスタンスを生成して実行しています。
このポートレットは認証済みユーザにのみ表示されるべきであるため、現在のユーザの `isGuest` プロパティが false (このユーザが認証されていることを意味する) の場合にのみ `widget()` をコールします。


`UserMenu` ポートレットの試験
--------------------------

今迄に開発したものの試験をしましょう。

 1. ブラウザウインドウを開き、URL `http://www.example.com/blog/index.php` を入力してください。
ページのサイドバーセクションに何も表示されないことを確認してください。
 2. `Login` ハイパーリンクをクリックし、ログインフォームに入力してログインしてください。
もしログイン成功の場合は、`UserMenu` ポートレットがサイドバーに表れ、ポートレットタイトルがユーザ名となっていることを確認してください。
 3. `UserMenu` ポートレットの 'ログアウト' ハイパーリンクをクリックしてください。
ログアウト動作が成功し、`UserMenu` ポートレットが消えることを確認してください。


まとめ
-------

開発したポートレットは非常に再利用の可能性が高いものです。
別のプロジェクトにおいて少々の修正あるいは全く修正せずに容易に再利用することが出来ます。
それだけでなく、このポートレットの設計は、論理と表現は分離されるべきであるという哲学に忠実に従っています。
この点に関して以前のセクションではことさら指摘しませんでしたが、典型的な Yii アプリケーションではこの手法がほとんどすべての場所で使用されています。

<div class="revision">$Id$</div>
