템플릿 문법에만 보이는 주석은 //로 시작하는 HTML 주석을 작성하면 된다.
<!--// my memo--><span>Memo</span>
위 템플릿은 다음과 같이 주석 부분이 제거된 채 출력된다.
<span>Memo</span>
변수
변수 출력
{$변수이름}과 같은 형태로 템플릿을 작성하면 변수를 화면에 출력할 수 있다. 단, 이름이 언더스코어 두 개()나 숫자, 공백, 언더스코어 문자 이외의 특수 문자로 시작하는 변수는 사용할 수 없다. 변수 대신 함수를 사용할 수도 있다.
// 올바름 {$varname} // 올바름 {$_var2name} // 올바름 {substr($varname, 0, 5)} // 올바름 {$varname.'suffix'} // 올바름 {className::$property} // 올바름 {className::getProperty()} // 올바르지 않음 {$123number} // 올바르지 않음 {$__two_underscore}
변수 할당
{@ ... } 문법을 사용하면 중괄호 안의 내용을 출력하지 않고 실행만 한다. 이 문법은 변수에 값을 할당할 때 주로 사용하지만 함수를 실행할 때도 사용할 수 있다.
{@ $cms = 'xe';}
변수 이스케이프
자바스크립트 등에서 중괄호를 사용할 때 문제가 발생하지 않도록 하기 위해 중괄호 문법을 이스케이프 할 수 있다. 템플릿 엔진에서 중괄호 문법을 해석하지 않도록 하는 방법은 다음과 같다.
- 여는 중괄호 { 와 닫는 중괄호 }를 서로 다른 줄에 입력한다.
- 또는, 여는 중괄호 { 뒤에 공백을 입력한다.
외부 파일 다루기
자바스크립트, CSS 등의 외부 파일을 읽어들이거나 읽어들인 파일을 제거하려면 load 또는 unload 문법을 사용한다. 다른 템플릿 파일을 포함시키려면 include 명령어를 사용한다. 이 명령어들은 유효한 XML 노드여야 하고 자기 자신을 바로 닫는 태그(self-closing tag)이므로 > 기호 앞에 반드시 슬래시(/)를 포함해야 한다.
템플릿 포함하기
PHP에서 사용하는 include 문과 비슷한 역할을 한다. 설정한 템플릿 파일을 읽어들여 해석하고 화면에 출력한다. include 태그를 사용하고,target 속성에 읽어들인 파일을 입력하면 된다. 읽어들일 파일의 경로는 현재 템플릿 파일을 기준으로 한다.
<include target="header.html" />
읽어오기
자바스크립트, CSS 등의 외부 파일을 페이지에 참조하려면 load 태그를 사용하고 target 속성을 통해 읽어들일 파일을 설정한다. target 속성에 사용하는 파일의 확장자에 따라 동작이 달라지므로 자바스크립트 파일은 반드시 .js를, CSS 파일은 반드시 .css를 확장자로 사용해야 한다.
<load target="path/to/javascript.js" />
load 태그에 사용할 수 있는 속성은 다음과 같다.
- target : 읽어들일 파일의 경로. 현재 템플릿 파일의 경로를 기준으로 함
- media : (CSS 전용) CSS의 media 속성. 기본값은 "all"이다.
- type : (JS 전용) 자바스크립트를 출력할 위치를 정한다. head(기본값) 또는 body를 사용할 수 있다. body를 입력하면 닫는 </body> 태그 바로 위에 등록된 순서대로 출력된다.
- targetie : IE의 조건부 주석을 사용할 때 설정한다. 조건부 주석에 입력하는 문자열과 같이 IE 6, gt IE 6 등으로 값을 입력한다.
- index : 우선 순위를 설정한다. 특별한 문제가 없다면 사용하지 않는 편이 좋다.
load 태그는 언어 파일을 불러올 때도 사용할 수 있다. target 속성에 lang.xml 파일의 경로를 입력하면 해당하는 언어를 읽어들인다.
<load target="../lang/lang.xml" />
제거하기
unload 태그는 load로 읽어들인 파일을 제거할 때 사용한다. load를 사용할 때와 같은 속성을 입력하면 읽어들인 파일을 제거할 수 있다.
<unload target="path/to/style.css" media="all" />
unload 태그에 사용할 수 있는 속성은 다음과 같다.
- target : 읽어들인 파일의 경로
- media : (CSS 전용) CSS의 media 속성
- type : (JS 전용) 자바스크립트를 출력할 위치
- targetie : IE의 조건부 주석
DOM 제어문
HTML 요소와 함께 사용하는 형태의 문법이다. 블럭 문법과 달리 별도의 시작/끝을 별도로 지정하지 않으며, 문법이 적용된 DOM을 대상으로 한다. 예를 들어, 다음은 간단한 조건문의 한 예이다.
<img src="img.jpg" alt="Sample image" cond="$cond" />
cond문의 유효 범위는 문장이 적용된 DOM 요소 <img>이다. 따라서 이 템플릿은 다음과 같은 PHP 코드로 변환된다.
<?php if($cond){ ?><img src="img.jpg" alt="Sample image" /><?php } ?>
이 밖에 속성과 함께 사용하는 속성 조건문도 있다.
속성 조건문
다른 문법이 DOM 요소에 작용하는 반면, 속성 조건문은 특정 속성에만 작용한다. 특정 속성 뒤에 파이프 문자(|)와 cond="$cond" 문법을 사용하면 조건을 만족할 때만 속성을 출력한다. 다음은 $active의 값이 true일 때만 class="active" 속성을 출력하는 템플릿 예제이다.
<a href="http://xe.org" class="active"|cond="$active">xe.org</a>
위 템플릿을 실행하면 $active의 결과에 따라 서로 다른 결과를 출력한다.
$active = true 일 때 <a href="http://xe.org" class="active">xe.org</a> $active = false 일 때 <a href="http://xe.org">xe.org</a>
조건문
특정 조건을 만족할 때만 DOM 요소를 출력하도록 한다. 조건문을 적용할 DOM 노드에 cond 속성을 다음과 같이 사용하면 된다.
<img src="img.jpg" alt="Sample image" cond="$cond" />
이 템플릿은 다음과 같은 PHP 문법으로 변경된다(실제와는 약간 차이가 있다).
<?php if($cond){ ?><img src="img.jpg" alt="Sample image" /><?php } ?>
자식 요소를 포함한 DOM에도 적용할 수 있다.
<div class="buttons" cond="$showButtons"> <button type="button">Save</button> <button type="button">Reset</button> </div>
이 템플릿은 다음과 같은 PHP 문법으로 변경된다(실제와는 약간 차이가 있다).
<?php if($showButtons){ ?> <div class="buttons"> <button type="button">Save</button> <button type="button">Reset</button> </div> <?php } ?>
반복문
특정 DOM 요소를 주어진 조건에 따라 반복 출력한다. 반복문을 적용할 DOM 노드에 loop 속성을 사용하면 된다. 다음은 $arr 배열의 항목 갯수만큼 반복해서 출력하는 템플릿 예제이다.
// 템플릿 <ul> <li loop="$arr=>$val">Item : {$val}</li> </ul> // PHP <ul> <?php foreach($arr as $val){ ?> <li>Item : <?php echo $val ?></li> <?php } ?> </ul>
배열의 인덱스나 연관 배열의 키 이름을 사용하려면 다음과 같이 템플릿을 작성할 수 있다.
// 템플릿 <ul> <li loop="$arr=>$key,$val">Item {$key} : {$val}</li> </ul> // PHP <ul> <?php foreach($arr as $key=>$val){ ?> <li>Item <?php echo $key ?>: <?php echo $val ?></li> <?php } ?> </ul>
일정 횟수를 반복할 때 사용하는 for 문법도 사용할 수 있다.
// 템플릿 <ul> <li loop="$i=0; $i < count($arr); $i++">Item : {$arr[$i]}</li> </ul> // PHP <ul> <?php for($i=0; $i < count($arr); $i++){ ?> <li>Item : <?php echo $i ?></li> <?php } ?> </ul>
예를 들어 $arr이 1,2,3,4,5 다섯 개의 숫자를 저장한 배열이라면 이 템플릿은 다음과 같이 출력된다.
<ul> <li>Item : 1</li> <li>Item : 2</li> <li>Item : 3</li> <li>Item : 4</li> <li>Item : 5</li> </ul>
특정 조건을 만족하는 동안 계속 반복하는 while 문법은 다음과 같이 사용한다. while 문법의 표현식은 반드시 변수에 값을 할당하는 형태여야 한다.
// 템플릿 <ul> <li loop="$item=get_item()">Item : {$item}</li> </ul> // PHP <ul> <?php while($item=get_item()){ ?> <li>Item : <?php echo $item ?></li> <?php } ?> </ul>
가상 노드
여러 개의 DOM을 한꺼번에 다루어야 하는 등 한 개의 DOM만 다뤄서 원하는 결과를 얻기 어려울 때는 가상 노드 <block>을 사용할 수 있다. 가상 노드 <block>은 실제로 화면에 출력되지는 않지만 cond나 loop를 속성으로 사용할 수 있다. 다음 템플릿 구문을 보자.
<block cond="$cond"> <a href="link1.html">Link1</a> <a href="link2.html">Link2</a> </block>
이 코드를 PHP 코드로 변환하면 다음과 같은 형태가 된다.
<?php if($cond){ ?> <a href="link1.html">Link1</a> <a href="link2.html">Link2</a> <?php } ?>
가상 노드는 템플릿 파일 안에 있는 다른 HTML 요소와 동등하게 하나의 완전한 노드로 취급되어야 한다. 다시 말해 다음과 같이 노드를 기술할 때 가상 노드를 사용할 수 없다.
// 잘못된 사용법 <a href="link.html" <block cond="$style">style="{$style}"</block> class="link">Link</a>
블럭 제어문
블럭 문법은 @로 시작하는 HTML 주석 형식으로 작성한다.
조건문
조건문에 사용하는 문장으로는 if, else, elseif, switch, case, default, break가 있고 if로 시작한 문장을 닫을 때는 endif를, switch로 시작한 문장을 닫을 때는 endswitch를 사용한다. 간단하게 endif나 endswitch 대신 end를 사용할 수도 있다.
if 문
조건을 비교하여 조건에 맞으면 블럭 안의 템플릿을 출력한다. if로 시작하고 endif로 블럭을 마치며, elseif와 else 등을 블럭 안에서 사용할 수 있다(elseif에 공백이 없음에 주의). 다음은 가장 간단한 if문 예제이다.
<!--@if($var)-->Is this printed?<!--@endif-->
다음 예제처럼 else 또는 elseif 문을 추가해 다양한 조건을 비교할 수도 있다.
<!--@if($var)--> I am the first! <!--@elseif($another_var)--> Second. Not bad. <!--@else--> Oops. I am the last. <!--@endif-->
switch 문
동일한 변수를 반복해서 비교할 때 유용하다. switch로 시작하고 endswitch로 블럭을 마치며, case로 비교할 값을 입력한다. 다음은 $varname을 비교하는 switch 문의 예이다.
<!--@switch($varname)--> <!--@case('A')--> $varname의 값은 A입니다. <!--@break--> <!--@case('B')--> $varname의 값은 B입니다. <!--@break--> <!--@default--> $varname의 값은 A도 아니고 B도 아닙니다. case에 해당하는 값이 없으면 기본값으로 실행되는 부분). <!--@endswitch-->
반복문
배열이나 객체 등 값을 나열할 수 있는(enumerable) 객체에 대해 반복문을 실행한다. for, foreach, while로 시작하고 각각 endfor, endforeach,endwhile로 블럭을 마친다. 간단하게 endfor, endforeach, endwhile 대신 end를 사용할 수도 있다.
for 문
for로 시작하고 endfor로 마치는 반복문이다. 반복 횟수가 정해진 경우에 유용하다.
<!--@for($i = 0; $i < 10; $i++)--> <span>Number : {$i}</span> <!--@endfor-->
foreach 문
foreach로 시작하고 endforeach로 마치는 반복문이다. 배열이나 객체를 처음부터 끝까지 반복할 때 유용하다.
<!--@foreach($arr as $key=>$name)--> <span>Item {$key} : {$name}</span> <!--@endforeach-->
while 문
while로 시작하고 endwhile로 마치는 반복문이다. 반복 횟수를 알 수 없을 때 유용하다.
<!--@while($item=get_item())--> <span>Item : {$item}</span> <!--@endwhile-->