티스토리 뷰

전체/장난하기

CakePHP와 Template_

Coolen 2007. 3. 21. 02:24

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 함수에 전달하면 되는 것입니다. 다음 글에 예제를 들어 변수 치환하는 모습을 보여드리겠습니다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
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
글 보관함