Smarty Plugins 확장하기

Smarty를 사용하다 보면 기본 적인 함수, 수정자(modifier) 등이 있으나

프로젝트에 따른 사용자 정의 플러그-인의 필요성을 느끼게 된다.

Java에서 사용자 정의 태그 라이브러리를 만들어 사용하 듯이 Smarty 에서도 플러그-인을 쉽게 추가할 수 있다.

추가로 개발된 플러그-인을 템플릿에서 사용하기 위해서는 Smarty의 플러그-인 디렉토리 설정을 변경해야 한다.

Smarty 하위 클래스를 사용할 때 설정 방법.

class Project_Smarty extends Smarty (

    public function __construct() {
        parent::__construct();

        $this->plugins_dir = array(
            "plugins", // SMARTY 디렉토리의 기본 플러그-인
            PROJECT_PATH."/libs/Project/SmartyPlugins"
        );
        // 기타 설정
    }
}

my_func_test 플러그-인 (SmartyPlugins/function.my_func_test.php)

function smarty_function_my_func_test($params, &$smarty) {
    $data = array("첫 번째", "두 번째", "세 번째");
    return $data[array_rand($data)];
}

템플릿(test.tpl) 에서 사용 예:

내가 선택한 것은 {$my_func_test}입니다.

my_mod_test 플러그-인 (SmartyPlugins/modifier.my_func_test.php)

function smarty_modifier_my_mod_test($no) {
    $data = array("첫 번째", "두 번째", "세 번째");}
    return $data[$no];
}

템플릿(test.tpl)에서 사용 예:

{assign var="my_num" value="2"}
내가 선택한 것은 {$my_num|my_mod_test}입니다.

Smarty에서 explode 사용하기

Smarty 템플릿 엔진을 사용하다가 템플릿에서 문자열을 배열로 만들기 위해 explode를 사용할 필요가 있다.

본래 PHP에서 explode 형식은 array explode ( string $delimiter , string $string [, int $limit ] )와 같다.

Smarty에서는 “delimeter”|explode:$string 으로 사용해야 하며, 예제는 아래와 같다.

explode.tpl

{assign var="phone" value="011-123-4567"}
{assign var="pa" value="-"|explode:$phone}
Phone:{$phone}<br/>
Phone Array:{$pa}<br/>
Phone 1st:{$pa[0]}<br/>
Phone 2nd:{$pa[1]}<br/>
Phone 3rd:{$pa[2]}<br/>

참고

Open Flash Chart 2

PHP로 Google Analytics 데이터를 수신하여 일별 통계를 차트로 보여주고 싶어서 Open Flash Chart를 찾았는데

Open Flash Chart 2가 있어서 이것을 써 보기로 했다.

Open Flash Chart 예제
Open Flash Chart 예제

구현

먼저 컨트롤러인 chart.php를 보면 다음과 같다.

차트를 개발할 땐 실제 데이터를 사용하기 보다 아래와 같이 예제 데이터를 생성하고 하는 것이 좋다.

require_once "OpenFlashChart/open-flash-chart.php";

// Google Analytics 예제 데이터
$dateList = array (
    "20090501" => array ("pageviews" => 100,"visits" => 50,  "visitors" => 10),
    "20090502" => array ("pageviews" => 101,"visits" => 52,  "visitors" => 10),
    ...
    "20090520" => array ("pageviews" => 200,"visits" => 80,  "visitors" => 22)
);
// 데이터를 날짜로 변경
function toDate($str) {
    $str = strval($str);
    return date("M/d", mktime(0, 0, 0, substr($str,4,2), substr($str,6,2), substr($str,0,4)) );
}
$pvValue      = array();  // 페이지뷰 값
$visitValue   = array();  // 방문 값
$visitorValue = array();  // 방문자 값

$x_axis_label = array();
$i    = 0;
$maxY = 0;
foreach ( $dateList as $dimension=>$value ) {
    if ($i % 5 == 0) { // X 축 레이블은 모든 값이 아닌 5씩 건너 뛴다.
        array_push($x_axis_label, toDate($dimension));
    } else {
        array_push($x_axis_label, "");
    }

    $pv      = intval($value["pageviews"]);
    $visit   = intval($value["visits"]);
    $visitor = intval($value["visitors"]);

    array_push( $pvValue,      $pv);
    array_push( $visitValue,   $visit );
    array_push( $visitorValue, $visitor );

    // 최대 Y 값
    $maxY = max($maxY, $pv, $visit, $visitor);
    $i++;
}

// 페이지 뷰 선
$pvLine = new line();
$pvLine->set_key("페이지뷰",10);
$pvLine->set_values( $pvValue );

// 방문 선
$visitLine = new line();
$visitLine->set_colour("#00ffff");
$visitLine->set_key("방문",10);
$visitLine->set_values( $visitValue );

// 방문자 선
$visitorLine = new line();
$visitorLine->set_colour("#ff0000");
$visitorLine->set_key("방문자",10);
$visitorLine->set_values( $visitorValue );

// X 축
$x_axis = new x_axis();
$x_axis->set_range(0,count($dateList));
$x_axis->set_labels_from_array( $x_axis_label );

// Y 축
$y_axis = new y_axis();
$y_axis->set_range(0,$maxY, round($maxY / 5));

// 차트 생성
$chart = new open_flash_chart();
$chart->set_title( new title( "일별 통계" ) );
$chart->set_bg_colour( "#ffffff" );
$chart->add_element( $pvLine );
$chart->add_element( $visitLine );
$chart->add_element( $visitorLine );
$chart->set_x_axis( $x_axis );
$chart->set_y_axis( $y_axis );

$smarty->assign("chart", $chart);
...
$smarty->assign("content_tpl", "chart.tpl");
$smarty->display("layout.tpl");

이제 smarty를 사용한 뷰에 해당하는 chart.tpl을 보면 다음과 같다.

<script type="text/javascript" src="js/json2.js"></script>
<script type="text/javascript" src="js/swfobject2.js"></script>
...
{if $chart}
<div id="my_chart"></div>
<script type="text/javascript">
swfobject.embedSWF("/swf/open-flash-chart.swf", "my_chart", "100%", "200", "9.0.0");
</script>
{/if}
...
{if $chart}
<script type="text/javascript">
function open_flash_chart_data() {ldelim}
    var chartData = {$chart->toString()};
    return JSON.stringify(chartData);
{rdelim}
</script>
{/if}

참고