0 follower

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

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

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

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

1. 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 クラスを拡張します。 CPortletinit() メソッドと renderContent() メソッドをオーバライドします。 前者はポートレットのタイトルを現在のユーザ名に設定します。 後者は userMenu というビューを描画することによりポートレットのボディ内容を生成します。

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

2. userMenu ビューの作成

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

<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>

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

3. UserMenu ポートレットの使用

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

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

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

4. UserMenu ポートレットの試験

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

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

5. まとめ

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

Found a typo or you think this page needs improvement?
Edit it on github !