記事の表示

私達のブログアプリケーションでは、記事の表示方法は、リスト形式と単独での表示が可能です。前者はindex操作として実装し、後者はview操作として実装します。この節では、初期の要求を満たすように両方の操作をカスタマイズします。

1. view操作のカスタマイズ

view操作はPostControlleractionView()メソッドで実装します。表示内容はviewというビューで生成されます。ビューファイルは/wwwroot/blog/protected/views/post/view.phpです。

以下のコードで、PostControllerview操作を実装します:

public function actionView()
{
    $post=$this->loadModel();
    $this->render('view',array(
        'model'=>$post,
    ));
}
 
private $_model;
 
public function loadModel()
{
    if($this->_model===null)
    {
        if(isset($_GET['id']))
        {
            if(Yii::app()->user->isGuest)
                $condition='status='.Post::STATUS_PUBLISHED
                    .' OR status='.Post::STATUS_ARCHIVED;
            else
                $condition='';
            $this->_model=Post::model()->findByPk($_GET['id'], $condition);
        }
        if($this->_model===null)
            throw new CHttpException(404,'The requested page does not exist.');
    }
    return $this->_model;
}

主な変更点はloadModel()メソッドにあります。このメソッドで、GETパラメータのidに従ってPostテーブルに問い合わせをします。もし記事が見つからない、または記事の状態が未公開、または(ユーザーがゲストの場合)アーカイブ化されていたら、404 HTTPエラーを投げます。そうでなければ、記事オブジェクトがactionView()に返され、表示のためにビュースクリプトへと渡されていきます。

Tip: YiiはHTTP例外(CHttpExceptionのインスタンス)を捕捉し、定義済みのテンプレートか、カスタマイズしたエラービューで表示します。yiicで生成したスケルトン・アプリケーションにはカスタマイズしたエラービューが含まれています。ファイルは/wwwroot/blog/protected/views/site/error.phpです。このファイルを修正すれば、エラー表示をもっとカスタマイズできます。

viewスクリプトの変更は、記事の表示に関するフォーマットとスタイルを調整することが中心になります。ここでは詳細には立ち入りません。興味のある方は/wwwroot/blog/protected/views/post/view.phpを参照してください。

2. index操作のカスタマイズ

view操作と同様に、index操作でも2ヶ所をカスタマイズします。PostControlleractionIndex()メソッドと、ビューファイル/wwwroot/blog/protected/views/post/index.phpです。主な追加内容は、特定のタグに結び付いた記事の一覧表示をサポートすることです。

下は、PostControlleractionIndex()メソッドを修正したものです:

public function actionIndex()
{
    $criteria=new CDbCriteria(array(
        'condition'=>'status='.Post::STATUS_PUBLISHED,
        'order'=>'update_time DESC',
        'with'=>'commentCount',
    ));
    if(isset($_GET['tag']))
        $criteria->addSearchCondition('tags',$_GET['tag']);
 
    $dataProvider=new CActiveDataProvider('Post', array(
        'pagination'=>array(
            'pageSize'=>5,
        ),
        'criteria'=>$criteria,
    ));
 
    $this->render('index',array(
        'dataProvider'=>$dataProvider,
    ));
}

上の例では最初に、記事リストを取得するためのクエリー基準を作成します。この基準は、公開済みの記事だけを返し、並び順を更新時刻の降順にするという内容です。また、リスト表示するときは各記事のコメント数を表示したいので、commentCountを返す指示もあります。覚えているか分かりませんが、これはPost::relations()で宣言したリレーションです。

ユーザーが特定のタグの記事を見たいという場合は、検索条件をクエリー基準に追加して、特定のタグだけを探すようにします。

このクエリー基準を使って、データプロバイダーを作ります。データプロバイダーは主に3つの仕事をこなします。まず、データが多いときにページネーション(ページ送り処理)ができます。ここではページサイズを5にセットして、ページネーションをカスタマイズしています。次に、ユーザーの要求に合わせてソートができます。最後に、ページ送りとソートをしたデータを、表示のためにウィジェットとビューに供給することができます。

actionIndex()ができあがったら、indexビューを以下のように修正します。主な変更点は、表示する記事をユーザーがタグで指定したときに、h1ヘッダーを追加することです。

<?php if(!empty($_GET['tag'])): ?>
<h1>Posts Tagged with <i><?php echo CHtml::encode($_GET['tag']); ?></i></h1>
<?php endif; ?>
 
<?php $this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProvider,
    'itemView'=>'_view',
    'template'=>"{items}\n{pager}",
)); ?>

上の例では、記事リストの表示にCListViewを使っています。このウィジェットは、個々の記事の詳細を表示するために部分的ビュー(partial view)を必要とします。ここでpartial viewとして指定している_viewは、/wwwroot/blog/protected/views/post/_view.phpのことです。このビュースクリプトの中では、$dataというローカル変数を使って、記事のインスタンスにアクセスできます。

$Id: post.display.txt 2121 2010-05-10 01:31:30Z qiang.xue $

Be the first person to leave a comment

Please to leave your comment.