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)됩니다.

  1. 기본으로 제공되는 View 클래스는 Controller 클래스의 기본 값으로 정의되어 있다.
  2. 모든 사용자 컨트롤러는 AppController 클래스를 상속한다.
  3. AppController는 Controller 클래스를 상속하여 이름만 바꾼 간단한 클래스로 확장가능하다.
  4. AppController 클래스는 설치디렉토리/app/app_controller.php 파일을 찾아본 후, 없을 경우 설치디렉토리/cake/app_controller.php 를 찾는다.
  5. 즉, 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 함수에 전달하면 되는 것입니다. 다음 글에 예제를 들어 변수 치환하는 모습을 보여드리겠습니다.

신고
  1. gofeel 2007.03.21 10:00 신고

    와~ 안그래도 RoR과 같은 프레임워크에 관심이 부쩍 늘어서 RoR책 사고 나서 Cakephp메뉴얼을 열심히 읽고 있었는데....;;;;(RoR책은 노트북 받침대로;;;)
    좋은거 알려주셨으니 저도 열심히 장난치겠습니다. ㅋㅋ

    • 최호진 2007.03.21 10:40 신고

      나중에 우리도 CakePHP 사용자 모임같은거 만들어 보아요..

  2. 권남 2007.03.21 10:31 신고

    좋은 글 감사합니다. 사실 저는 PHP 그 자체가 이미 HTML 템플릿 언언인데, 또 다른 템플릿 엔진이 필요하다는 사실이 좀 아이러니하게 느껴지기도 합니다. PHP의 어정쩡함을 보여주는 증거라고나 할까요?
    하지만 더 좋으면.. 써야죠. 뭐.. ^^; 지금 현재는 자체제작 MVC를 사용하고(프레임워크를 안쓴 걸 후회중입니다.. ㅜㅜ) 뷰단에서 조건문 반복문을 사용할 때 if () : .. endif; , for () : ..... endfor; 혹은 foreach () : ... endforeach; 같은 구문을 사용하고, <?= $value ?> 형태로 View단의 가독성을 높여보려는 노력을 하고는 있습니다. 회사 UI 개발자분은 {} 쓸 때보다는 소스를 더 잘 이해하시는 거 같습니다.

    • 최호진 2007.03.21 10:44 신고

      아이러니긴 하죠, 템플릿 문법에도 조건, 루프이런것들이 있으니까요. 사실 php 호출도 가능합니다.

      소개한 Template언더바 의 경우에는 .tpl 파일 문벚을 한번 컴파일하여 php 파일을 만듭니다. 따라서, 그 안에 php 코드를 넣으면 컴파일될때 그대로 이동되므로 사용이 더 쉽더군요.

  3. kebie 2007.03.25 11:33 신고

    둘다 사용법도 정말 쉽고 심플하게 잘 만들어서 져서 그런지.. CakePHP 구조 약간 참조하면서 Template_ 를 감싸는 클래스 하나 만들면, 개인학습목적으로 간단한 자체 프레임워크 만드는 공부하기에 참 좋은 자료가 되는 것 같습니다. 업무보면서 시간 날때마다 살을 하나씩 붙여나가면서 공부하는 재미가 쏠쏠합니다. ^^;

    그나저나 둘다 꽤 오래된 것들인데 이상하게 크게 인기를 못끄는 것 같기도 하네요.. 국내에서는 누구 말대로 Java학원은 있는데 PHP학원은 없어서 그런걸까요.. 회사에서도 개발자구하기 힘들다고 앞으로 PHP로 구현된 것도 모두 Java로 바꾼다는 말도 있고...

  4. 낭망백수 2007.04.07 11:51 신고

    CakePHP 사용자모임 예약가입합니다. ^^;;

  5. 2007.04.11 16:30 신고

    symphony와 CakePHP중 어떤것이 더 좋은가요? 비슷할거 같지만 결정은 해야 하는거나까요.. :-) 좋은 글 많이 보고 갑니다. :-)

  6. mine 2007.08.20 16:34 신고

    다음 글은 어디에? 으흐흐~

  7. mine 2007.09.01 18:51 신고

    꺼내 달라! 꺼내 달라!

  8. bigchoi 2007.10.30 15:33 신고

    머리속에 있는걸 꺼내주세요....cakephp+template_+adodb 를 사용해 보고 싶어니깐요...adodb 설정은 또 어케하는건지....원.~~~~

  9. 미유 2008.02.22 11:49 신고

    cakephp 에 관련된 자료 볼거 없나 해서 검색했는데 여기 나오네용!
    잘읽었습니다 ㅎㅎㅎㅎㅎㅎㅎㅎㅎ

CakePHP 아직 우리나라 개발자들은 요거 잘 안쓰나보다. 구글의 한국어쪽 검색에는 그다지 많은 사이트가 나오질 않는군...

신고
  1. 프리버즈 2007.02.28 10:53 신고

    구글 검색결과는 symfony 2,650,000개. cakephp 2,060,000개.

  2. 프리버즈 2007.02.28 10:54 신고

    http://www.google.com/trends?q=symfony, cakephp

    그래도 인기도는 상승중(?) -.-

  3. 백일몽 2007.02.28 11:36 신고

    뭐 pear 도 잘 안 쓰잖아요.

+ Recent posts