0 フォロワー

投稿の表示

ブログアプリケーションでは、投稿は投稿のリストの中に表示されるか、単独で表示されます。前者は index 操作として実装され、後者は view 操作として実装されます。このセクションでは、初期要件を満たすために両方の操作をカスタマイズします。

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

view 操作は、PostControlleractionView() メソッドによって実装されます。その表示は、ビューファイル /wwwroot/blog/protected/views/post/view.php を使用した view ビューによって生成されます。

以下は、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() メソッドにあります。このメソッドでは、id GET パラメータに従って Post テーブルをクエリします。投稿が見つからない場合、または公開されていないかアーカイブされている場合(ユーザーがゲストの場合)、404 HTTPエラーをスローします。それ以外の場合、投稿オブジェクトは actionView() に返され、さらに表示するためにビュースクリプトに投稿オブジェクトを渡します。

ヒント: Yii は HTTP 例外(CHttpException のインスタンス)をキャプチャし、定義済みテンプレートまたはカスタマイズされたエラービューに表示します。 yiic によって生成されたスケルトンアプリケーションには、すでに /wwwroot/blog/protected/views/site/error.php にカスタマイズされたエラービューが含まれています。エラー表示をさらにカスタマイズする場合、このファイルを修正できます。

view スクリプトの変更は、主に投稿表示の書式設定とスタイルの調整に関するものです。ここでは詳細には触れません。興味のある読者は、/wwwroot/blog/protected/views/post/view.php を参照してください。

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

view 操作と同様に、index 操作は PostControlleractionIndex() メソッドとビューファイル /wwwroot/blog/protected/views/post/index.php の2か所でカスタマイズします。主に、指定されたタグに関連付けられた投稿のリストを表示するためのサポートを追加する必要があります。

以下は、PostController で修正された actionIndex() メソッドです。

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 を使用して投稿リストを表示していることに注意してください。このウィジェットには、個々の投稿の詳細を表示するためのパーシャルビューが必要です。ここでは、パーシャルビューを _view に指定します。これは、ファイル /wwwroot/blog/protected/views/post/_view.php を意味します。このビュースクリプトでは、$data という名前のローカル変数を介して表示されている投稿インスタンスにアクセスできます。

タイプミスを見つけた場合、またはこのページの改善が必要と思われる場合は、
githubで編集してください !