본문 바로가기

Yii Framework/블로그 만들기

11. 게시물 보기

이 곳은 제가 개인적으로 YII framework의 블로그 만들기를 번역해 놓은 곳입니다.

제가 영어 전공자도.. 그렇다고 영어랑 친하지도 않습니다. 

그래서 보시면 뭔가 글도 엉성하고 말이 안맞는게 많습니다.

잘못 오역된 부분이라던지 그런 부분들 친절하게 알려주시면 바로 수정하겠습니다.

이 페지의 원글 http://www.yiiframework.com/doc/blog/1.1/en/post.display



게시물보기

이 블로그 어플리케이션에서 문서는 목록 형식으로 표시 혼자 볼 수 있습니다. 전자는 index 작업으로 구현되고 후자는view 조작으로 구현되어 있습니다. 이 섹션에서는 초기의 요구에 맞게 두 작업을 정의합니다.

1. view 작업 사용자 지정

view 작업 PostController 의 actionView() 메소드로 구현되어 있습니다. 표시 내용은 view 라는 뷰에서 생성됩니다.뷰 파일은/wwwroot/blog/protected/views/post/view.php 입니다.

다음 코드는 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() 메소드에 있습니다. 이 메서드는 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 곳을 지정합니다. PostController 의 actionIndex () 메소드와 뷰 파일 /wwwroot/blog/protected/views/post/index.php 입니다. 주로 특정 태그에 결부 된 게시물의 목록에 대한 지원을 추가 해야 합니다.

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() 에서 선언 한 관계입니다.

사용자가 특정 태그를 가진 게시물을보고 싶어 경우에, 우리는 특정 태그를 찾아 기준에 검색 조건을 추가 하여 특정 태그만 찾게 합니다.

이 쿼리 기준을 사용하여 데이터 공급자를 만듭니다. 데이터 공급자는 주로 세 가지 일을 처리합니다. 먼저 데이터가 많을 때는 페이지 네이션 (페이징 처리)을합니다. 여기에서는 페이지 크기를 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 라는 로컬 변수를 사용하여 문서의 인스턴스에 액세스 할 수 있습니다.