본문 바로가기

Yii Framework/블로그 만들기

10. 게시물 작성 및 수정

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

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

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

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

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



 게시물 작성 및 수정

Post 모델의 준비가되면 PostController 위한 뷰와 액션을 재합니다. 이 섹션에서는 먼저 CRUD 작업 액세스 제어를 지정합니다. 다음 create 및 update 작업을 구현하는 코드를 수정합니다.

1. 액세스 제어 정의

먼저하고 싶은 것은, 액세스 제어 의 정의입니다. gii 가 생성 한 코드는 우리의 요구에 맞지 않습니다.
/wwwroot/blog/protected/controllers/PostController.php 파일을 열고 accessRules ()메서드를 다음과 같이 수정합니다.

public function accessRules()
{
    return array(
        array('allow',  // 모든 사용자에게 'index'와 'view'의 액션을 허가
            'actions'=>array('index', 'view'),
            'users'=>array('*'),
        ),
        array('allow', // 인증 된 사용자에게 모든 행동을 허용
            'users'=>array('@'),
        ),
        array('deny',  // 모든 사용자의 액세스를 거부
            'users'=>array('*'),
        ),
    );
}

위의 규칙은 모든 사용자가 index 와 view 작업에 액세스 할 수 있습니다. 인증 된 사용자는 admin 조치를 포함한 모든 작업에 액세스 할 수 있습니다. 이외의 시나리오에서는 액세스가 거부됩니다. 여기에서주의 할 것은 이러한 규칙은 이곳에 정렬 된 순서로 평가되는 것입니다. 그 때의 상황에 일치하는 첫 번째 규칙은 액세스 여부가 결정됩니다. 예를 들어, 사용자가 시스템 소유자에 게시물 작성 페이지를 방문하려 할 경우, 두 번째 규칙이 일치하여 사용자에게 액세스 권한이 부여됩니다.


2. create , update 작업 및 사용자 지정

create 작업 및 update 작업은 비슷합니다. 모두 사용자의 입력을 얻기 위해 HTML 양식을 표시하고 입력을 확인하고 데이터베이스에 저장합니다. 큰 차이는 update 작업은 데이터베이스의 기존 데이터로 약식을 미리 입력한다는 것입니다. 따라서 gii 부분적인 뷰 (partial view)로 /wwwroot/blog/protected/views/post/_form.php 를 생성하고이를 create 와 update 모두보기 묻어 HTML 양식 렌더링 전체를 업데이트 합니다.

먼저 _form.php 파일을 수정하여 우리가 원하는 HTML 양식으로 title , content, tags , status 정보를 가져올수 있도록 해야 합니다.처음 3 개의 특성은 일반 텍스트 입력란을 사용합니다. status 에는 드롭 다운 목록을 사용합니다. 드롭 다운 목록의 옵션은 기사의 상태를 나타내는 문자열입니다.

<?php echo $form->dropDownList($model,'status',Lookup::items('PostStatus')); ?>

위의 예에서는게시물이 취할 수있는 상태의 목록을 검색하려면 Lookup::items('PostStatus') 를 부르고 있습니다.

다음 Post 클래스를 수정하고 기사가 데이터베이스에 저장되기 전에 몇 가지 특성 (create_time 나author_id)이 자동으로 설정되도록합니다. 다음과 같이 beforeSave () 메서드를 재정의합니다.

protected function beforeSave()
{
    if(parent::beforeSave())
    {
        if($this->isNewRecord)
        {
            $this->create_time=$this->update_time=time();
            $this->author_id=Yii::app()->user->id;
        }
        else
            $this->update_time=time();
        return true;
    }
    else
        return false;
}

게시물을를 저장할 때 태그의 출현 빈도의 변화를 반영하기 위하여 tbl_tag 테이블을 업데이트해야합니다. 이 처리는afterSave() 메소드에 쓰면 있습니다. 이 afterSave() 메서드는 데이터베이스에 기사 저장 성공 후 Yii에서 자동으로 호출됩니다.

protected function afterSave()
{
    parent::afterSave();
    Tag::model()->updateFrequency($this->_oldTags, $this->tags);
}
 
private $_oldTags;
 
protected function afterFind()
{
    parent::afterFind();
    $this->_oldTags=$this->tags;
}

구현에서는 사용자가 기존의 게시물을 업데이트 할 때 태그를 변경했는지 여부를 확인하고 싶기 때문에, 이전의 태그가 무엇 이었는지를 알 필요가 있습니다. 따라서 afterFind() 메소드를 작성하고 _oldTags 변수에 오래된 태그를 유지하도록했습니다. 이 afterFind () 메서드는 AR 레코드 데이터베이스에서 검색 한 데이터가 투입된 때 Yii에서 자동으로 호출됩니다.

여기에서는Tag::updateFrequency()  메서드를 자세히 설명하지 않습니다. 관심있는 분은 /wwwroot/yii/demos/blog/protected/models/Tag.ph 를 참조하십시오.