Yii ブログシステム作成(8)

記事の表示

このブログシステムは、記事を一覧と個別での表示が出来る。
一覧は”index”操作として実装され、個別記事は”view”操作として実装される。

view操作のカスタマイズ

“view”を操作しているPostControllerファイルの『actionView()』と『loadModel()』を編集する。

  /**
   * 
   * ビューアクション
   * 
   **/
  public function actionView()
  {
    // 記事読み込み
    $post = $this->loadModel();
    
    // 個別表示ページにレンダリング
    $this->render(
      'view',
      array('model'=>$post)
    );
  }
  
  
  private $_model;
  
  /**
   * 
   * 記事読み込み
   * 
   **/
  public function loadModel()
  {
  /**
   * 
   * 記事読み込み
   * 
   **/
  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);
      }
      
      // 記事情報がない場合は404ページへ遷移する
      if($this->_model === null)
      {
        throw new CHttpException(404, 'リクエストされたページは存在しません。');
      }
    }
    
    return $this->_model;
  }

個別記事参照
yii036

404ページ
yii037

index操作のカスタマイズ

“view”ファイル同様に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(
          // 1頁あたり5記事を表示する
          'pageSize'=>5,
        ),
        'criteria'=>$criteria,
      )
    );
    
    // 一覧情報をレンダリングする
    $this->render(
      'index',
      array('dataProvider'=>$dataProvider)
    );
  }

続いてビューファイルの”index”を編集する

<?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"は"/blog/protected/views/post/_view.php"である。
このビュースクリプトの中では"$data"というローカル変数を使って、記事のインスタンスにアクセス出来る。

記事一覧
yii038

タグ絞込検索記事一覧
yii039

参考サイト:
http://www.yiiframework.com/doc/blog/1.1/ja/post.display

Comments are closed.