원문: http://www.coolphptools.com/codeigniter-smarty



절대로 최신버전의 CodeIgniter에서는 따라하지 마세요.

동작 안합니다!!!!!



역주) 따라서 다 하고 나서야, 동작이 안된다는 것을 알았을 뿐이고! 2~3년 전 글이었을 뿐이고! 시간을 낭비했을 뿐이고!


CodeIgniter가 생소할 수도 있겠지만, CodeIgniter는 가벼운 Model-VIew-Controller(MVC) 프레임워크로, PHP를 기반으로 한다. CodeIgniter는 EllisLabs에서 만드는 오픈소스 프로젝트다. CodeIgniter는 템플릿 시스템을 내장하고 있지만, 내가 마지막으로 내장 템플릿 시스템을 보았을 떄, 별 기능이 없었다. 또한 내장 템플릿 시스템은 preg_match()와 문자열 치환을 기반으로 페이지를 필터링하는 방식이었다. 만약 트랙피 사이즈가 크지 않고 변수 치환을 많이 사용하지 않는 사이트라면, 이러한 방법도 효과적일 수는 있다. 하지만 트래픽 사이즈가 크게 증가하고, 페이지수가 많은 사이트라면, 이러한 방식은 웹 사이트의 응답시간에 큰 영향을 미친다.


스마티(Smarty)는 또 다른 오픈소스 프로젝트로 템플릿을 처리하며 마찬가지로 PHP로 작성되었다. 스마티는 오랫동안 사용되었고, CodeIgniter에 내장된 단순한 템플릿 엔진에 비해 막강한 기능을 가지고 있다. 스마티는 또한 템플릿을순수한 PHP 파일로 컴파일하기 때문에, 실행할 때 더 빠르다.


템플릿 생성은 개발자들 사이에서 논쟁거리가 되어 왔는데, PHP를 HTML 안에서 직접 사용하는 편이 더 쉽고, 새로운 템플릿 언어를 배워서 똑같은 일을 하는 일이 좀더 어렵다고 느꼈기 때문이다. 개인적으로 나는 코드(PHP)와 뷰(스마티를 사용한 템플릿)을 서로 명확히 분리하는 편을 선호한다. 나는 개발자가 게을러져서 HTML에 로직, 심지어 데이터베이스 호출 로직까지도 추가하는 일을 자주 목격했다. 하지만 이렇게 개발하면, 유지보수하는 일이 쉽게 악몽이 되어버리고 만다. 또한 나는 스마티가 HTML의 <>와는 달리 {}를 구분자로 사용하는 방식이 마음에 든다. 이처럼 구분자가 다르기 때문에, 스마티 태그를 식별하기가 수월해진다. 이러한 사실은 아래의 코드에서 잘 드러난다.


스마티를 사용하는 경우:

<title>{$title}</title>


PHP를 사용하는 경우:

<title><?php echo $title;?></title>


한가지 성가신 점은 HTML에 꺽쇠가 있는 경우다. 예를 들어 인라인 자바스크립트나 인라인 스타일시트를 사용하는 경우다. 이때는 이들 꺽쇠를 반드시 이스케이프 처리를 해야만 스마티 태그로 해석되지 않는다. 또는 스마티로 해석되지 않도록 꺼두고 싶은 영역이 있다면, {literal}과 {/literal}을 사용하면 된다. 예를 들어 다음과 같다.


<script type="text/javascript">

  {literal}

  function a(b, c) {

      alert('function a('+b+', '+c+') called!');

  }

  {/literal}

</script>


{literal}과 {/literal}은 원하는 어디에서도 사용할 수 있는데, 심지어 단일 문자를 감쌀 수도 있다. 하지만 이처럼 이스케이프 처리를 하기 보다는, 외부 자바스크립트 파일 또는 스타일시트 파일을 사용하기를 바란다. 


지금쯤이면 "스마티를 CodeIgniter와 어떻게 같이 사용하죠?"라는 질문이 떠오를 것이다. 이제 내가 어떻게 했는지 약간 시간을 내서 정리하려고 하며, 여러분도 시작할 수 있도록 몇가지 코드와 함께 예제를 보여주고자 한다.



1단계: CodeIgniter 설치하기


만약 아직 CodeIgniter를 설치하지 않았다면, 여기에서 다운로드해서 설치한다.



2단계: 스마티 설치하기


가장 최근의 스마티를 여기에서 다운로드할 수 있다. 나는 /system/libs 디렉토리를 CodeIgniter에 생성해서, smarty 디렉토리를 복사해서 넣었다. 스마티를 다른 위치에 설치하려고 한다면, Smarty.php 라이브러리 모듈에서 해당 스마티 설치 위치를 가리키도록 수정해야 한다. 가리키려는 디렉토리는 반드시 Smarty.class.php 클래스 파일을 포함하고 있어야 한다.



3단계: 템플릿 디렉토리 생성하기

나는 templates 디렉토리(스마티의 루트 템플릿 디렉토리)와 templates_c 디렉토리(스마티 템플릿이 컴파일된 버전이 저장되는 위치)를 /system/application/views에 만들었다. 이번에도 마찬가지로, 템플릿을 다른 위치에 저장하고 싶다면, Smarty.php 파일을 열어서 해당 디렉토리를 가리키도록 수정해야 한다. 이때 templates_c 디렉토리가 어플리케이션에 쓰기 권한을 가지도록 해야 한다.



4단계: 이 사이트에서 제공하는 코드 설치하기

이 사이트의 코드는 스마티와 CodeIgniter를 연동하는 Smarty 라이브러리 클래스와, CodeIgniter 기능에 접근할 수 있도록 돕는 스마티 플러그인 몇가지, 그리고 "example"이라고 불리는 작은 데모를 포함한다.


메인 클래스(물론 나는 클래스 접두어로 MY_ 가 아니라, CI를 사용하고 있다. 하지만 CodeIgniter에는 Smarty라는 이름의 클래스가 없으므로 상관없다)는 CI_Smarty이며, autoload 설정 배열에 "smaty"라는 이름으로 추가할 수 있다. 이는 다른 라이브러리 모듈을 사용하는 방식과 다를게 없다. 메인 Smarty 클래스를 상속받아서 CodeIgniter용 라이브러리로 만들었기 때문에, 기존의 Smarty API 호출을 모두 사용할 수 있다. 나는 여기에 smarty->view()라는 이름의 함수를 추가하였는데, 이 함수는 CodeIgniter의 템플릿 시스템의 parser->parse() 함수처럼 동작하는 유틸리티 함수다. 또한 스마티와 CodeIgniter 라이브러리 사이의 차이를 메울 수 있는 몇가지 플러그인을 추가하여, 템플릿에서 접근할 수 있도록 하였다. 물론 이렇게 하면서도 MVC 패러다임을 부수지 않도록 하였으며, 또한 템플릿을 호출하기 전에 $data 배열에 잡다한 정보를 꾸겨 넣는 대신에, language 파일 데이터, 검증 에러 등과 같은 요소를 더욱 쉽게 사용하도록 했다.


아래는 메인이 되는 Smarty 라이브러리 클래스다.

<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');


/**

 * Smarty Class

 *

 * @package CodeIgniter

 * @subpackage Libraries

 * @category Smarty

 * @author Kepler Gelotte

 * @link http://www.coolphptools.com/codeigniter-smarty

 */

require_once( BASEPATH.'libs/smarty/libs/Smarty.class.php' );


class CI_Smarty extends Smarty {


    function CI_Smarty()

    {

        parent::Smarty();


        $this->compile_dir = APPPATH . "views/templates_c";

        $this->template_dir = APPPATH . "views/templates";

        $this->assign( 'APPPATH', APPPATH );

        $this->assign( 'BASEPATH', BASEPATH );


        log_message('debug', "Smarty Class Initialized");

    }


    function __construct()

    {

        parent::__construct();


        $this->compile_dir = APPPATH . "views/templates_c";

        $this->template_dir = APPPATH . "views/templates";

        $this->assign( 'APPPATH', APPPATH );

        $this->assign( 'BASEPATH', BASEPATH );


        // Assign CodeIgniter object by reference to CI

        if ( method_exists( $this, 'assignByRef') )

        {

            $ci =& get_instance();

            $this->assignByRef("ci", $ci);

        }


        log_message('debug', "Smarty Class Initialized");

    }



    /**

    *  Parse a template using the Smarty engine

    *

    * This is a convenience method that combines assign() and

    * display() into one step.     

    *

    * Values to assign are passed in an associative array of

    * name => value pairs.

    *

    * If the output is to be returned as a string to the caller

    * instead of being output, pass true as the third parameter.

    *

    * @access public

    * @param string

    * @param array

    * @param bool

    * @return string

    */

    function view($template, $data = array(), $return = FALSE)

    {

        foreach ($data as $key => $val)

        {

            $this->assign($key, $val);

        }

        if ($return == FALSE)

        {

            $CI =& get_instance();

            if (method_exists( $CI->output, 'set_output' ))

            {

                $CI->output->set_output( $this->fetch($template) );

            }

            else

            {

                $CI->output->final_output = $this->fetch($template);

            }

            return;

        }

        else

        {

            return $this->fetch($template);

        }

    }

}

// END Smarty Class


아래는 다운로드에 포함된 모든 파일들이다:


스마티와 연결하기 위해 사용하는 CodeIgniter 라이브러리:

/system/application/libraries/Smarty.php


CodeIgniter 클래스와 연결하기 위한 스마티 플러그인 함수:

/system/libs/smarty/libs/plugins/function.ci_config.php

/system/libs/smarty/libs/plugins/function.ci_db_session.php

/system/libs/smarty/libs/plugins/function.ci_form_validation.php

/system/libs/smarty/libs/plugins/function.ci_language.php

/system/libs/smarty/libs/plugins/function.ci_validation.php


예제 코드:

/system/application/controllers/example.php

/system/application/language/english/label_lang.php

/system/application/views/templates/example.tpl

/system/application/views/templates/header.tpl

/system/application/views/templates/footer.tpl



5단계: CodeIgniter config 수정하기


/system/application/config 디렉토리에 보면, autoload.php 파일이 있다. 파일을 열어서 'smarty'를 자동으로 로드할 라이브러리 클래스 배열에 추가하자.

/*

| -------------------------------------------------------------------

|  Auto-load Libraries

| -------------------------------------------------------------------

| These are the classes located in the system/libraries folder

| or in your application/libraries folder.

|

| Prototype:

|

| $autoload['libraries'] = array('database', 'session', 'xmlrpc');

*/


$autoload['libraries'] = array('smarty');



6단계: 예제 실행하기


모든 단계를 정확하게 설치했다면, http://yourdomain/example에 접속하면, 아래와 같은 화면을 볼 수 있다








Posted by socurites