본문 바로가기

Yii Framework/블로그 만들기

12 .게시물관리

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

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

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

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

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



게시물관리

게시물 관리라는 것은 주로 관리의 관점에서 게시물을 나열하고 모든 상태의 기사를 검색·갱신·삭제 할 수 있도록 하는 것을 의미합니다. 이러한 작업은 각각 admin 작업과 delete 작업을 수행하여 달성됩니다. yiic 의해 생성 된 코드는 별로 수정할 필요가 없습니다. 아래에서는 이러한 두 작업이 어떻게 구현되어 있는지를 설명합니다.

1. 표 형식의 게시물 목록
admin 작업은 모든 상태의 게시물이 표 형식으로 표시됩니다. 이 화면은 정렬 및 페이징을 지원합니다. 다음은PostController 의 actionAdmin() 메소드입니다.

public function actionAdmin()
{
    $model=new Post('search');
    if(isset($_GET['Post']))
        $model->attributes=$_GET['Post'];
    $this->render('admin',array(
        'model'=>$model,
    ));
}

위의 코드는 yiic 도구에 의해 생성 된 것으로, 어느 곳도 수정하지 않습니다. 먼저 Post 모델을 search 시나리오에 따라 만듭니다. 이 모델을 사용하여 사용자가 지정한 검색 조건을 수집 하고 있습니다. 다음 사용자가 지정한 데이터가 있으면 모델에 할당합니다. 마지막으로이 모델을 사용하여 admin 뷰를 표시합니다.

다음은 admin 화면을 위한 코드입니다.

<?php
$this->breadcrumbs=array(
    'Manage Posts',
);
?>
<h1>Manage Posts</h1>
 
<?php $this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        array(
            'name'=>'title',
            'type'=>'raw',
            'value'=>'CHtml::link(CHtml::encode($data->title), $data->url)'
        ),
        array(
            'name'=>'status',
            'value'=>'Lookup::item("PostStatus",$data->status)',
            'filter'=>Lookup::items('PostStatus'),
        ),
        array(
            'name'=>'create_time',
            'type'=>'datetime',
            'filter'=>false,
        ),
        array(
            'class'=>'CButtonColumn',
        ),
    ),
)); ?>

게시물을 보기 위해 CGridView 을 사용합니다. 이것을 사용하면 열에서 정렬하거나 기사가 많아서 1 페이지에 표시되지 않을 때 페이징 처리를 할 수 있습니다. 주요 변경 사항은 각 컬럼의 표시 방법입니다. 예를 들어, title 컬럼 문서의 정보 표시에 대한 하이퍼 링크가 되도록 지정했습니다. $data->url 이라는 표현은 Post 클래스에 정의 된 url 속성 값을 반환합니다.

팁: 텍스트를 표시 할 때 텍스트에 포함 된 HTML 엔티티 (특수 문자)을 인코딩하는 데 CHtml::encode() 를 호출 합니다. 크로스 사이트 스크립팅 을 방지합니다.


2. 게시물삭제
admin 데이터 그리드는 각 행에 삭제 버튼이 있습니다. 삭제 버튼을 클릭하면 해당 게시물이 삭제됩니다. 내부적으로는, 클릭으로 인한 delete 작업은 다음과 같이 구현 되어 있습니다.

public function actionDelete()
{
    if(Yii::app()->request->isPostRequest)
    {
        // we only allow deletion via POST request
        $this->loadModel()->delete();
 
        if(!isset($_GET['ajax']))
            $this->redirect(array('index'));
    }
    else
        throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');
}

위의 코드는 yiic 도구에 의해 생성 된 것으로, 어느곳도 수정하지 않습니다. $ _GET [ 'ajax'] 검사에 대해 조금 설명하겠습니다. CGridView 위젯은 정렬, 페이징 매김 및 삭제 작업이 모두 AJAX 모드에서 수행되는 아주 좋은 기능이 있습니다. 위의 작업중 하나를 수행하는 경우 전체 페이지가 다시 리로드 되지 않는 다는 것입니다. 그렇다고는해도, AJAX가 아닌 모드에서 위젯이 작동하는 경우도 있습니다 (위젯 ajaxUpdate 속성을 false로 설정 한 경우, 또는 클라이언트의 JavaScript이 비활성화되어있는 경우). delete 작업은이 두 시나리오를 구분해야합니다. 즉, 삭제 요청이 AJAX를 통해 오는 경우 브라우저를 리디렉션하지 않고, 그렇지 않은 경우는 리디렉션해야합니다.

게시물을 삭제하면 문서에 붙은 댓글도 모두 삭제해야합니다. 또한 삭제 된 게시물에서 사용하던 태그에 관해서tbl_tag 테이블을 업데이트해야합니다. 이러한 작업은 모두 Post 모델 클래스의 afterDelete 방법을 다음과 같이 작성하여 제공 할 수 있습니다.

protected function afterDelete()
{
    parent::afterDelete();
    Comment::model()->deleteAll('post_id='.$this->id);
    Tag::model()->updateFrequency($this->tags, '');
}

위의 코드는 매우 간단합니다. 먼저 삭제 게시물의 ID와 같은 post_id 를 가지는 코멘트를 삭제합니다. 그런 다음 삭제 게시물의 tags에 관해서 tbl_tag 테이블을 업데이트 합니다.

Tip: 여기에서는 게시물 삭제의 모든 의견을 명시 적으로 삭제 해야합니다. 왜냐하면 SQLite가 외부 키 제약을 지원하지 않기 때문입니다. 이 제약을 지원하는 DBMS (MySQL 및 PostgreSQL 등)를 사용하는 경우, 기사의 삭제시 관련 코멘트가 자동으로 삭제되도록 외부 키 제약을 설정할 수 있습니다. 이 경우 코드에서 명시 적으로 삭제 처리를 호출 할 필요가 없습니다.