티스토리 뷰
CakePHP는 자체에 HTML Template을 제공하지 않기 때문에 다른 템플릿 라이브러리를 사용해야하는 경우가 있습니다. CakePHP에 대해 국내에는 그다지 많은 자료가 나와 있지 않은 관계로 지금 글을 쓰는 것이 CakePHP가 좀 더 많이 사용되는 것에 도움이 되었으면 합니다.
Template 라이브러리 사용의 필요성
CakePHP의 MVC 구조중 View 는 .thtml 이라는 확장자를 기본으로 하는 일종의 PHP 파일에서 html helper나 javascript helper 들을 이용하여 tag 들을 만들어내는 일을 하게 됩니다. 이 단계에 이르기 전에 controller에서 페이지 렌더링을 위한 작업은 모두 끝났다고 보여지는 것이죠. 그런데, 이 페이지는 거의 PHP 수준이어서, 만약 디자이너와의 협업으로 일을 하기 위해서는 약간 조심스러운 면이 있습니다.
Template_ 는 변수 치환자와 루프, 비교 등을 텍스트 및 주석 부분에 넣어서 비교적 HTML 디자이너가 작업을 하는데에도 큰 무리가 없습니다.
Template_ 라이브러리의 설치
외부 라이브러리는 대개 설치디렉토리/vendors 혹은 설치디렉토리/app/vendors 디렉토리에 설치됩니다. 여기서는 설치디렉토리/vendors 안에 다음과 같은 방법으로 설치되게 합니다.
vendors/Template_/Template_.class.php
vendors/Template_/Template_.compiler.php
이렇게 설치하게되면 사용할 때는 vendor("Template_/Template_.class") 와 같이 앞 부분의 vendors 디렉토리와 맨 뒤의 .php 를 제거한 경로를 넣어주면 include하게 됩니다.
CakePHP의 View 치환 방법
CakePHP는 다음과 같은 방법으로 처리(dispatch)됩니다.
- 기본으로 제공되는 View 클래스는 Controller 클래스의 기본 값으로 정의되어 있다.
- 모든 사용자 컨트롤러는 AppController 클래스를 상속한다.
- AppController는 Controller 클래스를 상속하여 이름만 바꾼 간단한 클래스로 확장가능하다.
- AppController 클래스는 설치디렉토리/app/app_controller.php 파일을 찾아본 후, 없을 경우 설치디렉토리/cake/app_controller.php 를 찾는다.
- 즉, AppController를 사용자들이 확장하고자할 경우 설치디렉토리/app 에 두면된다.
이와 같은 순서를 잘 생각해보면, AppController 클래스를 통해 기존의 Controller 클래스의 기능을 Override하면 됨을 알 수 있습니다. 따라서, app_controller.php의 내용을 다음과 같이 합니다.
$view 값은 Controller 클래스안에 "View" 로 되어 있는데, 이것을 override하는 것입니다. 또한 확장자도 Template_ 에서 지원하는 .tpl을 사용하도록 합니다.
<?php
class AppController extends Controller {
var $view = "Template_";
var $ext = ".tpl";
}
?>
이제, View 클래스를 상속하여 기본 기능을 확장할 수 있는 Template_View 클래스를 만들어야 합니다. AppController에 $view를 "Template_" 로 명시하게 되면 디스패치 루틴은 "template_.php" 라는 파일을 찾게 됩니다. 가장 먼저 찾는 곳이 이번에도 설치디렉토리/app/views/template_.php 입니다. 여기에 없으면 설치디렉토리/cake/libs/view/template_.php 파일을 찾습니다.
<?
vendor( 'Template_/Template_.class' );
class Template_View extends View
{
var $name = "Template_";
var $tpl = null;
function __construct(&$controller)
{
$this->tpl = new Template_();
parent::__construct($controller);
$this->tpl->template_dir = "/";
}
function _render($filename, $viewvars, $loadHelpers = true, $cached = true)
{
/* copied from cake/libs/view/view.php:function _render */
if ($this->helpers != false && $loadHelpers === true) {
$loadedHelpers = array();
$loadedHelpers = $this->_loadHelpers($loadedHelpers, $this->helpers);
foreach(array_keys($loadedHelpers) as $helper) {
$replace = strtolower(substr($helper, 0, 1));
$camelBackedHelper = preg_replace('/\\w/', $replace, $helper, 1);
${$camelBackedHelper} =& $loadedHelpers[$helper];
if (isset(${$camelBackedHelper}->helpers) && is_array(${$camelBackedHelper}->helpers)) {
foreach(${$camelBackedHelper}->helpers as $subHelper) {
${$camelBackedHelper}->{$subHelper} =& $loadedHelpers[$subHelper];
}
}
$this->loaded[$camelBackedHelper] = (${$camelBackedHelper});
}
}
foreach( $this->loaded as $helpername => $helperobj )
{
if( !isset( $this->tpl->$helpername ) )
{
$this->tpl->$helpername = $helperobj;
$this->tpl->$helpername = $helperobj;
}
}
$this->tpl->assign( $this->loaded );
if( !isset( $this->tpl->viewVars ) )
{
$this->tpl->viewVars = $this->controller->viewVars;
}
/* copied up to here from cake/libs/view/view.php:function _render */
$this->tpl->assign( $viewvars );
$this->tpl->assign( array('here' => $this->controller->here) );
$this->tpl->define('body', $filename );
return $this->tpl->fetch('body');
}
}
?>
View 클래스의 멤버 변수 중에서 가장 중요한 것은 _render 라는 함수 입니다. 이것은, 외부에서 render라는 명령이 명시적 혹은 암묵적으로 불릴 때, layer 혹은 content 를 구성하기 위해 매번 불리는 함수이기 때문입니다. 이 함수를 Template_ 내의 rendering 함수와 연결시키면 우리의 목적은 달성하게 됩니다. 즉, Template_ 에서 치환을 위한 변수들을 넘기고 그것을 .tpl 파일을 치환하여 html 코드를 만들어주는 함수인 fetch 함수에 전달하면 되는 것입니다. 다음 글에 예제를 들어 변수 치환하는 모습을 보여드리겠습니다.
- Total
- Today
- Yesterday
- MySQL
- 대화
- Subversion
- 오픈소스
- Linux
- Tattertools plugin
- JavaScript
- 수선화
- 디버깅
- OpenID
- tattertools
- 퀴즈
- 식물
- 커피
- VIM
- nodejs
- SSO
- macosx
- ssh
- url
- 덴드롱
- 구근
- writely
- SVN
- BlogAPI
- perl
- 벤자민
- 클레로덴드럼
- TCP/IP
- 킹벤자민
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |