[PHP] PHP 코딩 영역과 HTML 디자인 영역을 분리 시키는 라이브러리 Smarty


Study/PHP  2019. 9. 28. 09:00

안녕하세요. 명월입니다.


이 글은 PHP 코딩 영역과 HTML 디자인 영역을 분리 시키는 라이브러리 Smarty에 대한 글입니다.


PHP는 Java나 C#처럼 컴파일 언어가 스크립트 언어이기 때문에 .php로 호출하면 기본 웹 페이지 형태에서 PHP 소스를 넣어서 동적 웹페이지를 작성합니다.

사실 기억은 잘 안나지만 PHP에서 Class 개념이 생기기 전에는 그렇게 작성을 많이 했습니다.(꼭 그렇게만 한건 아니지만 보통 그렇게 많이 작성했습니다.)

그러다 보니 php 스크립트와 html그리고 javascript가 혼재되어 복잡한 프로그램이 되었네요.

그래서 Class개념이 도입되고 최대한 PHP와 HTML을 분리하려고 개발을 많이 하는데 그때 사용되는 라이브러리가 Smarty입니다.


개인적으로 이 Smarty + Reflection까지 완성되면 MVC를 구현할 수 있지 않을까 생각됩니다.

링크 - https://www.smarty.net/


그럼 Smarty를 사용하기 위해서 composer로 Smarty라이브러리를 다운받습니다.

repository - https://packagist.org/packages/smarty/smarty

{
  "require": {
    "smarty/smarty": "~3.1"
  }
}

Eclipse로 보면 Explorer 윈도우에 간혹 에러처럼 빨간색 엑박이 나오는데 실제는 에러가 아니니 무시하셔도 됩니다. Eclipse가 PHP 소스를 깨끗하게 해독을 잘 못하는듯하네요.. 좋은 IDE 찾아야겠습니다. Visual code가 좋다고는 하는데, 이게 Window이외의 OS에서 작동을 제대로 하는지 확인이 안되서...ㅠㅠ

<?php
  // composer autoload를 한다. 이건 필수이기 때문에 require로 선언!!
  require_once 'vendor/autoload.php';

  // 웹페이지 디렉토리 root설정
  $ROOT = $_SERVER ["DOCUMENT_ROOT"];
  
  // Smart 클래스 선언
  $smarty = new Smarty();
  // html 템플릿 파일 디렉토리 설정
  $smarty->template_dir =  $ROOT.'/View';
  // 그외 캐쉬 설정들...
  $smarty->compile_dir = $ROOT . '/../Smarty/templates_c';
  $smarty->cache_dir = $ROOT . '/../Smarty/cache';
  $smarty->config_dir = $ROOT . '/../Smarty/configs';
  
  // index.tpl 파일을 읽는다.
  $smarty->display('index.tpl');
?>

index.php파일은 위처럼 Smary 클래스를 선언하고 각종 디렉토리를 설정해야 합니다. 제 생각에는 template_dir만 제대로 설정하고 나머지는 적당하게 설정합니다. 참고로 전 htdocs폴더 안에 생성하기 싫어서 외부에 선언했습니다.

그리고 display라는 함수로 index.tpl를 읽습니다.

여기까지는 크게 감흥이 오지 않습니다. 그럼 index.php에서 임의의 값을 생성해서 index.tpl로 넘겨서 출력하겠습니다.

<?php
  require_once 'vendor/autoload.php';
  
  $ROOT = $_SERVER["DOCUMENT_ROOT"];
  
  $smarty = new Smarty();
  $smarty->template_dir = $ROOT . '/View';
  $smarty->compile_dir = $ROOT . '/../Smarty/templates_c';
  $smarty->cache_dir = $ROOT . '/../Smarty/cache';
  $smarty->config_dir = $ROOT . '/../Smarty/configs';
  
  // Node 클래스
  class Node
  {
    // 데이터는 총 세개가 있다.
    private $data = "Hello world!!!!";
    private $dataarray = [];
    private $databoolean = true;
    // 생성자에서 배열 값을 넣는다.
    public function __construct()
    {
      array_push($this->dataarray, "a");
      array_push($this->dataarray, "b");
      array_push($this->dataarray, "c");
      array_push($this->dataarray, "d");
    }
    // 이하 getter
    public function getData1()
    {
      return $this->data;
    }
    public function getData2()
    {
      return $this->dataarray;
    }
    public function getData3()
    {
      return $this->databoolean;
    }
  }
  // 키 이름을 title로 Example 값을 넣는다.
  $smarty->assign("title", "Example");
  // 키 이름을 data로 클래스 Node를 선언하여 넣는다.
  $smarty->assign("data", new Node());
  
  $smarty->display('index.tpl');
?>
<!DOCTYPE html>
<html>
<head>
<!-- key를 title로 받은 값을 넣는다. -->
<title>{$title}</title>
</head>
<body>
  <!-- data키의 Node클래스의 getData1를 넣는다. -->
  {$data->getData1()}
  <br />
  <!-- data키의 Node클래스의 getData2의 배열을 루프로 읽는다.. -->
  {foreach from=$data->getData2() item=item}
      {$item}<br />
  {/foreach}
  <br />
  <!-- data키의 Node클래스의 getData3의 부울값으로 출력값을 정한다. -->
  {if $data->getData3()}
      True!!
  {else}
    False!!
  {/if}
</body>
</html>

php에서 tpl로 값을 넘길때는 assign함수를 사용하여 넘깁니다. 파라미터가 두개인데 첫번째는 smarty 템플릿에서 사용할 변수키와 두번째의 파라미터는 값입니다.

tpl를 보니 확실히 php 문법이 아닙니다. 마치 Java의 JSTL 문법같이 보입니다만 다릅니다.


문법은 Smarty 홈페이지에서 소개하고 있으니 참고하세요. 혹시 어려운 문법이 있으면 댓글에 남겨주세요. 제가 예제를 남기겠습니다.

링크 - https://www.smarty.net/docs/en/


결과 값은 브라우저 타이틀부터 Example과 Example와 a,b,c,d 그리고 True까지 출력이 되었습니다.


여기까지 PHP 코딩 영역과 HTML 디자인 영역을 분리 시키는 라이브러리 Smarty에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.