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

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

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

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

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



사용자 인증

블로그 응용 프로그램은 시스템 소유자 및 게스트 사용자를 구별해야합니다. 따라서, 우리는 사용자 인증 기능을 구현해야합니다.

기본어플리케이션에서 이미 사용자 이름과 비밀번호가 demo또는 admin 으로 사용자 인증 기능을 제공하고 있다는것을 확인 할 수 있을 것 입니다. 이 섹션에서는 사용자 인증을 User 데이터베이스 테이블을 기반으로 하도록 해당 코드를 수정합니다.

사용자 인증은 IUserIdentity 인터페이스를 구현하는 클래스에서 이루어집니다. 기본응용프로그램은 이 목적을 위해 UserIdentity 클래스를 사용하고 있습니다. 이 클래스파일은 /wwwroot/blog/protected/components/UserIdentity.php 에 저장되어 있습니다.

팁 : 규칙에 따라 클래스 파일 이름은 해당 클래스 이름에 접미사로 확장 . php 를 붙인 것으로 해야 합니다. 이 규칙에 따르면, 경로 별칭 을 사용하여 클래스를 참조 할 수 있습니다. 예를 들어 UserIdentity 클래스를 application.components.UserIdentity 라는 별칭으로 참조 할 수 있습니다. Yii는 많은 API가 경로 별칭을 인식합니다 (예 Yii :: createComponent () ). 그리고 경로 별칭을 사용하면 코드에 절대 경로를 포함 할 필요가 없습니다.
코드에 포함 된 절대 경로는 종종 응용 프로그램 배포시 문제가 발생합니다.

UserIdentity 클래스를 다음과 같이 수정합니다.

<?php
class UserIdentity extends CUserIdentity
{
    private $_id;
 
    public function authenticate()
    {
        $username=strtolower($this->username);
        $user=User::model()->find('LOWER(username)=?',array($username));
        if($user===null)
            $this->errorCode=self::ERROR_USERNAME_INVALID;
        else if(!$user->validatePassword($this->password))
            $this->errorCode=self::ERROR_PASSWORD_INVALID;
        else
        {
            $this->_id=$user->id;
            $this->username=$user->username;
            $this->errorCode=self::ERROR_NONE;
        }
        return $this->errorCode==self::ERROR_NONE;
    }
 
    public function getId()
    {
        return $this->_id;
    }
}

authenticate () 메소드에서는 User 클래스를 이용하여 tbl_user 테이블 중에서 username 컬럼이 주어진 username 과 동일한 행을 대소문자 구분방식으로 찾습니다. User 클래스는 이전 섹션에서 gii도구에 의해 만들어진 것임을 기억하십시오. User 클래스는 CActiveRecord 를 상속하고 있기 때문에, ActiveRecord 기능 을 이용하여 객체 지향 (OOP)의 방식으로 tbl_user 테이블에 액세스 할 수 있습니다

사용자가 유효한 암호를 입력했는지 여부를 확인하기 위해 User 클래스의 validatePassword 메소드를 호출합니다. /wwwroot/blog/protected/models/User.php 를 다음과 같이 수정해야 합니다.  일반 암호를 데이터베이스에 저장하는 것이 아니라 암호 해시 결과를 무작위로 발생한 salt key 함께 저장하는 것에주의하십시오. 사용자가 입력 한 암호를 확인 할 때 암호 대신 해시 된 결과를 비교하는 것입니다.

class User extends CActiveRecord
{
    ......
    public function validatePassword($password)
    {
        return $this->hashPassword($password,$this->salt)===$this->password;
    }
 
    public function hashPassword($password,$salt)
    {
        return md5($salt.$password);
    }
}

UserIdentity 클래스는 getId () 메서드를 재정의하고 tbl_user 테이블에서 발견 된 사용자 id 를 반 합니다. 원래 구현 대신 사용자 이름을 반환하도록 되어 있었습니다. username 과 id 속성은 모두 사용자 세션에 저장된 코드로, 어디서나
Yii :: app () -> user 로 액세스 할 수 있습니다.


팁:
 UserIdentity 클래스에서는 해당 클래스 파일을 명시 적으로로드하지 않고도 CUserIdentity 를 참조하고 있습니다. 이것은 CUserIdentity 이 Yii framework의 코어 클래스이기 때문입니다. Yii는 모든 코어 클래스가 처음 참조 될 때 자동으로 그 클래스 파일을로드합니다.

User 클래스에서도 같은 일이 벌어지고 있습니다. 왜냐하면, User 클래스 파일이 /wwwroot/blog/protected/models 디렉토리에 있고, 그 디렉토리가 응용 프로그램 초기 구성 아래 코드에서 PHP의 include_path 에 추가되어 있기 때문입니다.
return array(
    ......
    'import'=>array(
        'application.models.*',
        'application.components.*',
    ),
    ......
);

위의 초기 구성은 /wwwroot/blog/protected/models or /wwwroot/blog/protected/components 아래에 클래스 파일이있는 모든 클래스 먼저 클래스를 참조 할 때 자동으로 로드되는 것을 입니다.

UserIdentity 클래스는 주로 LoginForm 클래스에서 로그인 페이지에서 입력 된 사용자 이름과 암호를 바탕으로 사용자를 인증하는 데 사용됩니다. 다음 코드 조각에서 UserIdentity 가 어떻게 사용되는지를 보여줍니다.


$identity
=new UserIdentity($username,$password); $identity->authenticate(); switch($identity->errorCode) { case UserIdentity::ERROR_NONE: Yii::app()->user->login($identity); break; ...... }

정보: 사람들은 종종 identity 와 user 어플리케이션 구성요소에 대해서 혼란에 빠집니다.전자는 인증 방법이고, 후자는 현재 사용자에 대한 정보를 나타냅니다. 응용 프로그램을 가질 user 구성 요소는 하나 뿐이지 만, identity 클래스는 어떤 인증 방법을 지원 하느냐에 따라 하나 이상의 클래스를 가질 수 있습니다. 일단 인증이 성공하면 identity 인스턴스에서 user 요소에 인증 정보를 전달하고 응용 프로그램 전체에서 user 를 이용하여 액세스 할 수 있습니다.

수정 된 UserIdentity 클래스를 테스트하기 위해, 브라우저에서 URLhttp://www.example.com/blog/index.php 에 액세스하여 tbl_user 테이블에 저장 한 사용자 이름과 비밀번호로 로그인을 시도해 보십시요. 블로그 데모 에서 제공되는 데이터베이스를 사용하는 경우, 사용자 이름 demo 암호 demo 에 액세스 할 수 있어야합니다. 이 블로그 시스템은 사용자 관리 기능이없는 점에 유의하십시오. 결과적으로 사용자는 웹 인터페이스를 통해 자신의 계정을 변경하거나 새로운 계정을 만들거나 할 수 없습니다. 사용자 관리 기능은 블로그 프로그램의 앞으로의 확장으로 간주 될 수 있습니다.

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

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

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

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

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



정리

milestone 1이 완료되었습니다. 지금까지 무슨 일을 했는지 정리해 보겠습니다.

  1. 필요한 기능을 파악 했습니다.
  2. Yii Framework 를 설치 했습니다.
  3. 기본 어플리케이션을 만들었습니다.
  4. 블로그 데이터베이스를 설계하고 만들었습니다.
  5. 어플리케이션의 기본 설정을 변경하여 데이터베이스와의 연결을 추가 했습니다.
  6. 기시물과 댓글 모두에 대해 기본적으로 CRUD작업을 구한하는 코드를 생성 했습니다.
  7. tbl_user 테이블에 체크하도록 인증 방법을 변경했습니다.

새로운 프로젝트는 첫 번째 milestone1과 4 단계에서 대부분의 시간을 보낼 수있을 것입니다.

gii 도구에 의해 생성 된 코드가 데이터베이스 테이블에 모든 기능을 CRUD 작업을 구현하지만, 종종 실제 응용 프로그램에서 수정해야합니다. 이런 이유로 들어, 다음 두 milestone 에서, 우리의 일이 우리의 초기 요구에 도달하도록 게시물과 댓글에 대한 CRUD 생성 된 코드를 사용자 정의를 할 수 있습니다.

일반적으로 먼저 모델 클래스 파일을 수정하여 적절한 유효성 검사 규칙 을 추가, 관계형 개체 를 선언합니다. 다음 각 CRUD 작업을 위해 컨트롤러 액션 과 뷰 의 코드를 변경합니다.

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

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

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

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

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



Post 모델의 정의

Gii 도구에 의해 생성 된 Post 모델 클래스는 주로 두 가지 점에서 수정해야합니다.

  • rules () 메소드 : 모델의 속성에 대한 유효성 검사 규칙을 규정
  • relations () 메소드 : 관계형 객체를 규정

정보: 모델 은 속성 목록에서 구성됩니다. 각각의 속성은 일반적으로 해당 데이터베이스 테이블의 칼럼과 연결됩니다. 속성은 명시 적으로 클래스 멤버 변수로 선언되는 경우도 선언없이 묵시적으로 선언 될 수 있습니다.

1. rules () 메소드의 정의

먼저 데이터베이스에 저장되기 전에 사용자가 입력 한 속성 값이 올바른지 확인 유효성 검사 규칙을 지정합니다.
예를 들어, 포스트의 상태 속성은 정수 1, 2 또는 3이어야합니다Gii 도구는 각 모델에 대한 유효성 검사 규칙을 생성합니다. 그러나 이러한 규칙은 테이블 열 정보를 기반으로하고 적절하지 않을 수 있습니다.

요구 분석에 따라, rules () 메서드를 다음과 같이 수정합니다.
public function rules()
{
    return array(
        array('title, content, status', 'required'),
        array('title', 'length', 'max'=>128),
        array('status', 'in', 'range'=>array(1,2,3)),
        array('tags', 'match', 'pattern'=>'/^[\w\s,]+$/',
            'message'=>'Tags can only contain word characters.'),
        array('tags', 'normalizeTags'),
 
        array('title, status', 'safe', 'on'=>'search'),
    );
}

상기, title , content , status 속성은 필수입니다. title 의 길이는 128을 초과 할 수 없습니다. status 속성의 값은 1 (초안), 2 (공개), 3 (보관) 중 하나이어야합니다. tags 속성은 단어 문자와 쉼표 만 포함 할 수 없습니다. 또한 normalizeTags 를 사용하여 사용자가 입력 한 태그의 문자열을 정규화하고 독특한 태그 쉼표로 제대로 분리 된 문자열이되도록합니다. 마지막 규칙은 검색 기능에서 사용하지만, 이것에 대해서는 나중에 설명하겠습니다.

required , length , in , match 같은 검사기는 모든 Yii가 제공하는 기존의 것입니다. normalizeTags 검사기는 메서드 기반 검사기이며 Post 클래스에서 정의해야합니다. 유효성 검사 규칙을 정의하는 방법에 대한 자세한 정보는 가이드 를 참조하십시오.

public function normalizeTags($attribute,$params)
{
    $this->tags=Tag::array2string(array_unique(Tag::string2array($this->tags)));
}

여기서 array2string 하면 string2array 는 Tag 모델 클래스에 정의해야 새로운 방법입니다..

public static function string2array($tags)
{
    return preg_split('/\s*,\s*/',trim($tags),-1,PREG_SPLIT_NO_EMPTY);
}
 
public static function array2string($tags)
{
    return implode(', ',$tags);
}

rules () 메소드로 선언 된 규칙은 모델 인스턴스의 validate () 메소드 또는 save () 메서드를 호출 할 때 하나 하나 실행됩니다.

주의: rules()에 나타나는 속성은 최종 사용자가 입력 할 수있는 수 있다는 사실을 기억하는 것은 매우 중요합니다. Post 모델의 id 나 create_time 등 프로그램이나 데이터베이스에 의해 설정되는 속성은 rules() 에 설치할 필요가 없습니다. 자세한 내용은 보안 속성 지정을 참조하십시오.

이상 변경되면 게시물 작성 페이지를 다시 열고 새로운 검증 규칙이 작동하는 것을 확인 할 수 있습니다.


2. relations () 메소드의 정의

마지막으로  relations () 메서드를 정의하여 기사와 관련된 개체를 지정합니다. relations () 에서 관련 개체를 선언하여 관계형 액티브 레코드 (RAR) 의 강력한 기능을 이끌어 낼 수 있습니다. 즉, RAR을 사용하여 복잡한 SQL JOIN 구문을 작성하지 않고 저자 나 코멘트 등의 기사에 관련하는 오브젝트의 정보에 액세스 할 수 있습니다.

relations () 메서드를 다음과 같이 정의합니다.

public function relations()
{
    return array(
        'author' => array(self::BELONGS_TO, 'User', 'author_id'),
        'comments' => array(self::HAS_MANY, 'Comment', 'post_id',
            'condition'=>'comments.status='.Comment::STATUS_APPROVED,
            'order'=>'comments.create_time DESC'),
        'commentCount' => array(self::STAT, 'Comment', 'post_id',
            'condition'=>'status='.Comment::STATUS_APPROVED),
    );
}

동시에, 위 메소드에서 사용되는 두 상수를 Comment 모델에 추가합니다.

class Comment extends CActiveRecord
{
    const STATUS_PENDING=1;
    const STATUS_APPROVED=2;
    ......
}

relations () 에서 선언 한 관계는 다음과 같은 의미입니다.

  • 하나의 문서는 하나의 저자에 속한다. 저자의 클래스는 User 의 기사 author_id 속성에서 연결된다.
  • 하나의 기사는 많은 의견이있다. 댓글 클래스 Comment 에서 댓글 post_id 속성에서 연결된다. 코멘트 작성 날짜별로 정렬
    되어 승인 (APPROVED)의 코멘트만으로 구성된다.
  •  commentCount 는 집계 결과를 반환 조금 특별한 관계에서 기사가있는 댓글 수를 나타낸다.
위의 관계를 선언하는 것으로, 다음과 같이 간단하게 기사의 저자와 코멘트에 액세스 할 수 있습니다.
$author=$post->author;
echo $author->username;
 
$comments=$post->comments;
foreach($comments as $comment)
    echo $comment->content;

관계를 선언하고 사용하는 방법에 대한 자세한 내용은 가이드를 참조하시기 바랍니다.


3. URL 속성추가

게시물의 내용을 볼 수있는 독특한 URL이 관련된 내용입니다. 이 URL을 얻기 위해 코드 곳곳에서 CWebApplication :: createUrl 을 쓰는 것이 아니라, Post 모델에 url 속성을 추가하여 URL을 생성하는 동일한 코드를 재사용 할 수 있습니다. 나중에 URL을 아름답게하는 방법을 설명 할 때이 속성의 추가가 매우 유용한 것을 알 수 있습니다.

url 속성을 추가하기 위해 다음과 같이 Post 클래스를 수정하여 getter 메소드를 추가합니다.

class Post extends CActiveRecord
{
    public function getUrl()
    {
        return Yii::app()->createUrl('post/view', array(
            'id'=>$this->id,
            'title'=>$this->title,
        ));
    }
}

게시물 ID 외에, 우리는 또한 URL에 GET 매개 변수로 게시물 Title을 추가합니다. 이것은 우리가 URL을 미화 하는것에 대한 설명으로, 주로 검색 엔진 최적화 (SEO) 가 목적입니다.

Post 의 최상위 부모 클래스는 CComponent 이므로 getUrl () 는 getter 메소드를 추가하여 $post->url 라고 작성을 할 수있게됩니다. $post->url 에 액세스하면 getter 메소드가 실행되고, 그 결과 식의 값으로 반환합니다. 이러한 구성 요소의 기능에 대한 자세한 내용은 가이드를 를 참조하십시오.

4. 상태를 텍스트로 표현

게시물의 상태가 데이터베이스에 정수로 저장되기 때문에, 우리는 최종 사용자에게 표시되는 경우보다 직관적이 되도록 텍스트 형식의 표현을 제공해야 합니다. 대형 시스템에서 유사한 요구사항은 매우 일반적입니다.

일반적인 솔루션으로, 우리는 다른 데이터 객체로 필요한 정수 값과 텍스트 표현 사이의 매핑을 저장하기 위해 tbl_lookup테이블을 사용합니다. Lookup 모델 클래스를 다음과 같이 수정하고 테이블의 텍스트 데이터에 쉽게 액세스 할 수 있도록합니다.
class Lookup extends CActiveRecord
{
......
 
    private static $_items=array();
 
    public static function items($type)
    {
        if(!isset(self::$_items[$type]))
            self::loadItems($type);
        return self::$_items[$type];
    }
 
    public static function item($type,$code)
    {
        if(!isset(self::$_items[$type]))
            self::loadItems($type);
        return isset(self::$_items[$type][$code]) ? self::$_items[$type][$code] : false;
    }
 
    private static function loadItems($type)
    {
        self::$_items[$type]=array();
        $models=self::model()->findAll(array(
            'condition'=>'type=:type',
            'params'=>array(':type'=>$type),
            'order'=>'position',
        ));
        foreach($models as $model)
            self::$_items[$type][$model->code]=$model->name;
    }
}

새로운 코드는 주로 두 정적 메서드, Lookup :: items () 와 Lookup :: item () 를 제공합니다. 전자는 지정된 데이터 유형에 속하는 문자열의리스트를 돌려줍니다. 후자는 지정된 데이터 유형과 값에 해당하는 특정 문자열을 반환합니다.

블로그의 데이터베이스는 Lookup 유형으로 PostStatus 과 CommentStatus 가 사전에 등록되어 있습니다. 전자는 문서의 상태가 취할 수있는 값을 보여, 후자는 논평 상태가 취할 수있는 값을 보여줍니다.

또한 코드를 읽기 쉽게하기 위해 일련의 상태를 나타내는 정수 값의 상수를 선언합니다. 코드에서 각 상태 값을 참조 할 때이 상수를 사용합니다.

class Post extends CActiveRecord
{
    const STATUS_DRAFT=1;
    const STATUS_PUBLISHED=2;
    const STATUS_ARCHIVED=3;
    ......
}

따라서 Lookup::items('PostStatus') 를 호출하면 게시물의 상태가 취할 수있는 값 목록 (해당하는 정수 값을 인덱스로하는 텍스트 표현의 목록)을 얻을 수 있습니다. 또한 Lookup::item('PostStatus', Post::STATUS_PUBLISHED) 를 호출하면 공개 된라는 상태의 텍스트 표현을 얻을 수 있습니다.


이 곳은 제가 개인적으로 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 를 참조하십시오.


이 곳은 제가 개인적으로 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 라는 로컬 변수를 사용하여 문서의 인스턴스에 액세스 할 수 있습니다.

+ Recent posts