ブログアプリケーションでは、投稿は投稿のリストの中に表示されるか、単独で表示されます。前者は index
操作として実装され、後者は view
操作として実装されます。このセクションでは、初期要件を満たすために両方の操作をカスタマイズします。
view
操作のカスタマイズ ¶view
操作は、PostController
の actionView()
メソッドによって実装されます。その表示は、ビューファイル /wwwroot/blog/protected/views/post/view.php
を使用した view
ビューによって生成されます。
以下は、PostController
で view
操作を実装する関連コードです。
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
を参照してください。
index
操作のカスタマイズ ¶view
操作と同様に、index
操作は PostController
の actionIndex()
メソッドとビューファイル /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
ヘッダーを追加することです。
if(!empty($_GET['tag'])): <h1>Posts Tagged with <i> echo CHtml::encode($_GET['tag']); </i></h1> endif; $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で編集してください !
パラメータ
index操作のカスタマイズセクションでは、アプリケーションパラメータ *postsPerPage* が参照されています。
これが機能するには、次のファイルを作成する必要があります
/wwwroot/yii/demos/blog/protected/config/params.php
このファイルのコピーは、ブログデモのサンプルコードにあります。
次に、メインのWebアプリケーション構成ファイルを更新して、params.phpからパラメータを読み込むようにする必要があります
/wwwroot/yii/demos/blog/protected/config/main.php
これを変更
'params'=>array( // this is used in contact page 'adminEmail'=>'webmaster@example.com', ),
これに
'params'=>require(dirname(__FILE__).'/params.php'),
actionListとページネーション
actionList()にページネーションを追加するには、pageSizeを設定する必要があります
$pages=new CPagination($postCount); $pages->pageSize = self::PAGE_SIZE; $pages->applyLimit($criteria);
デモからview.phpをコピーしないでください
views / Post / view.phpの変更は主に書式設定とスタイルに関係していると言われていますが、view.phpをインストールにコピーするだけではいけません。まだビルドしていない_commentを参照しています。
_commentsビューについては、こちら...をご覧ください
コメントするには、サインアップまたはログインしてください。