|  |  |
|
페이지 만들기
지금까지 사용자 코드에 필요한 기본적인 것들을 모두 가지게 되었다. 이제 위키의 핵심인 페이지 코드에 대해 알아보자. 사용자는 크리키 엔트리를 만들 필요가 있는데 읽힐 수 있는 엔트리라면 더욱 도움이 될 것이다.
Part 1에서 언급했듯이 페이지를 만드는 것은 페이지를 편집하는 것과 크게 다르지 않다. 편집 뷰와 편집 동작을 이미 베이크했으니 페이지를 만들어 활용하기는 아주 쉬울 것이다. 하지만 먼저 엔트리 모델을 바꿔야 한다.
엔트리와 사용자 관련 짓기
엔트리 모델에서 사용자 정보(특히 마지막으로 엔트리를 수정한 사용자의 이름)에 접근하고 싶을 것이다. CakePHP에서는 belongsTo로 모델들 간의 관계를 정립할 수 있다. 이 작업은 이미 테이블을 만들 때 해 보았다. app/models/entry.php를 편집해 Listing 9의 코드로 대체한다.
Listing 9. 모델들 간의 관계를 belongsTo 로 설정하기
<?php
class Entry extends AppModel {
var $name = 'Entry';
var $belongsTo = array('User' => array (
'className' => 'User',
'conditions' => ,
'order' => ,
'foreignKey' => 'user_id'
)
);
}
?>
|
이제 엔트리와 관련된 질의들이 각각의 엔트리에 대한 사용자 정보를 반환할 것이다.
편집 뷰 수정하기
편집 뷰에는 삭제되어야 할 많은 필드들이 들어있다. 실제로 페이지를 편집할 때 필요한 필드는 내용이다. 편집중인 엔트리 ID를 감춰진 필드로 포함시키면 도움이 될 것이다. 그리고 페이지 제목을 변수로 설정하여 이를 헤더에 보여줄 것이다(이 역시 감춰진 폼 요소로 설정되어야 한다). 여기에 엔트리를 위해 뷰를 되돌릴 수 있는 취소 링크를 추가해야 한다. 이처럼 수정된 편집 뷰는 Listing 10처럼 보여야 한다.
Listing 10. 수정된 편집 뷰
<h2>Edit Entry : <?php echo $entry_title?></h2>
<form action="<?php echo $html->url('/entries/edit/'.$html->tagValue('Entry/id')); ?>"
method="post">
<div class="optional">
<?php echo $form->labelTag( 'Entry/content', 'Content' );?>
<?php echo $html->textarea('Entry/content', array('cols' => '60', 'rows' => '10'));?>
<?php echo $html->tagErrorMsg('Entry/content', 'Please enter the Content.');?>
</div>
<?php echo $html->hidden('Entry/id')?>
<?php echo $html->hidden('Entry/title')?>
<div class="submit">
<?php echo $html->submit('Save');?>
<?php echo $html->link('Cancel', '/entries/view/' . $entry_title);?>
</div>
</form>
|
이것이 편집 뷰에 필요한 모든 것이다. 여기에서 실제 작업은 엔트리 컨트롤러의 편집 동작에서 다뤄질 것이다.
편집 동작 수정하기
Listing 11에 베이크한 편집 동작을 살펴보자.
Listing 11. 편집 동작 베이크하기
function edit($id = null) {
if(empty($this->data)) {
if(!$id) {
$this->Session->setFlash('Invalid id for Entry');
$this->redirect('/entry/index');
}
$this->data = $this->Entry->read(null, $id);
} else {
$this->cleanUpFields();
if($this->Entry->save($this->data)) {
$this->Session->setFlash('The Entry has been saved');
$this->redirect('/entry/index');
} else {
$this->Session->setFlash('Please correct errors below.');
}
}
}
|
이 동작은 "제출 양식이 없는 경우 ID 정보를 보여준다. 그렇지 않으면 보낸 데이터 필드를 클린업하고 데이터를 저장한다" 정도로 해석되겠다.
좀더 쉽게 설명하면 이 동작은 "제출 양식이 없으면 전달된 제목에 대한 정보를 보여주고 그렇지 않으면 적절한 정보를 데이터에 추가하고 저장한다"는 말이다. 이 경우 편집을 한 사용자 ID와 IP 주소 같은 데이터를 제출 양식에 추가할 것이다. 새로운 편집 동작은 Listing 12처럼 보일 것이다.
Listing 12. 새로운 편집 동작
function edit($title = null) {
if(empty($this->data)) {
if(!$title) {
$this->Session->setFlash('Invalid Entry');
$this->redirect('/entries/index');
}
$this->data = $this->Entry->findByTitle($title);
if ($this->data) {
$this->set('entry_title', $this->data['Entry']['title']);
} else {
$this->data['Entry']['title'] = $title;
$this->set('entry_title', $title);
}
} else {
$user_id = 0;
if ($this->Session->check('User')) {
$user = $this->Session->read('User');
$user_id = $user['id'];
}
$this->data['Entry']['user_id'] = $user_id;
$this->data['Entry']['ip'] = $_SERVER['REMOTE_ADDR'];
if($this->Entry->save($this->data)) {
$this->Session->setFlash('The Entry has been saved');
$this->redirect('/entries/view/'.$this->data['Entry']['title']);
} else {
$this->Session->setFlash('Please correct errors below.');
}
}
}
|
지금은 수정 횟수를 걱정하지 말라. 수정을 다루는 절에 가면 다시 한 번 추가할 것이다.
|  |
|