-
Notifications
You must be signed in to change notification settings - Fork 62
TemplateSyntax
XE 템플릿은 PHP 문법에 기초하며, 문법을 간소화하고 HTML 태그와 잘 어우러지도록 만들었습니다.
XE 템플릿은 크게 세 가지 형태입니다. 중괄호({}
), HTML 주석(<!-- -->
) 그리고 HTML 속성으로 지정할 수 있습니다.
중괄호는 변수의 값을 출력하거나 할당할 때 사용하며, HTML 주석 형태는 if, foreach와 같은 조건문이나 반복문으로 사용됩니다. 또한, 제어문 등은 HTML의 속성이나 태그의 형태로 사용되기도 합니다.
{$var}
{@ $is_logged = true}
<!--@if($is_logged)--> ... <!--@endif-->
<!--@foreach($arr as $val)--> ... <!--@endforeach-->
<div cond="$is_logged"> ... </div>
<load target="./css/style.css" />
HTML 주석과 동일하지만 웹페이지에는 출력하고싶지 않은 내용을 담을 때 사용할 수 있습니다.
감추고 싶은 주석은 <!--// -->
이처럼 주석을 여는 구문에 //
를 추가하면 됩니다.
<!--// 로그인 폼 시작 -->
<form>
...
<!-- 로그인 버튼 -->
<!--// 큰 버튼으로 표시하려면 'large' class를 추가하면 됨 -->
<button class="btn-login">로그인</button>
</form>
<!--// 로그인 폼 끝 -->
위 템플릿은 다음과 같이 <!--// -->
코드를 제거 후 출력됩니다.
<form>
...
<!-- 로그인 버튼 -->
<button class="btn-login">로그인</button>
</form>
{$변수이름}
과 같은 형태로 템플릿을 작성하면 변수를 화면에 출력할 수 있습니다.
단, 이름이 언더스코어 두 개(__)나 숫자, 공백, 언더스코어 문자 이외의 특수 문자로 시작하는 변수는 사용할 수 없습니다. 변수 대신 함수를 실행하고 반환하는 값을 출력할 수도 있습니다.
// 올바름
{$varname}
{$_var2name}
{substr($varname, 0, 5)}
{$varname.'suffix'}
{className::$property}
{className::getProperty()}
// 올바르지 않음
{$123number}
{$__two_underscore}
{@ ... }
문법은 사용하면 중괄호 안의 내용을 출력하지 않고, 변수에 값을 할당할 때 사용할 수 있습니다. 변수의 값이나 함수의 실행 결과를 출력하지 않고 실행만 할 때 사용합니다.
{@ $cms = 'xe'}
{@ $now = date()}
자바스크립트 등에서 중괄호를 사용할 때 문제가 발생하지 않도록 하기 위해 중괄호 문법을 다음과 같이 이스케이프할 수 있습니다.
- 여는 중괄호
{
와 닫는 중괄호}
를 서로 다른 줄에 입력한다. - 또는, 여는 중괄호
{
뒤에 공백을 입력한다. 또는, 주석문(/**/
)을 사용할 수도 있습니다.
function () {
return true;
}
function () { return true; }
function () {/**/return true;}
JavaScript, CSS 파일을 불러들이거나 제거하려면 load
또는 unload
문법을 사용할 수 있고, 다른 파일을 내용을 출력하려면 include
문법을 사용할 수 있습니다.
이 문법은 유효한 XML 노드여야 하고 자기 자신을 바로 닫는 태그(self-closing tag)이므로 >
기호 앞에 반드시 슬래시(/)를 포함해야 합니다.
JavaScript, CSS 등의 외부 파일을 페이지에 로드하려면 load
태그를 사용합니다.
target
속성으로 지정한 파일의 확장자에 따라 동작이 달라지므로 자바스크립트 파일은 반드시 .js
를, CSS 파일은 반드시 .css
를 확장자로 사용해야 합니다.
target
에 지정하는 파일은 템플릿 파일의 위치를 기준으로 상대 경로로 지정할 수 있습니다.
<load target="path/to/style.css" />
<load target="path/to/script.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" />
PHP에서 사용하는 include
문과 비슷한 역할을 하며. 설정한 템플릿 파일을 읽어들여 해석하고 화면에 출력합니다.
include
태그를 사용하고, target
속성에 읽어들인 파일을 입력하면 된다. 읽어들일 파일의 경로는 현재 템플릿 파일을 기준으로 한다.
<include target="header.html" />
unload
태그는 load
로 읽어들인 파일을 제거할 때 사용한다. load
를 사용할 때와 같은 속성을 입력하면 읽어들인 파일을 제거할 수 있다.
<unload target="path/to/style.css" media="all" />
unload
태그에 사용할 수 있는 속성은 다음과 같다.
- target : 읽어들인 파일의 경로
- media : (CSS 전용) CSS의
media
속성 - type : (JS 전용) 자바스크립트를 출력할 위치
- targetie : IE의 조건부 주석
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"
문법을 사용하면 조건을 만족할 때만 속성을 출력한다.
다음은 $isActive
의 값이 true일 때만 class="active"
속성을 출력하는 템플릿 예제이다.
<a href="http://localhost" class="active"|cond="$isActive">Go</a>
위 템플릿을 실행하면 $active의 결과에 따라 서로 다른 결과를 출력한다.
// $isActive = true 일 때
<a href="http://localhost" class="active">Go</a>
// $isActive = false 일 때
<a href="http://localhost">Go</a>
함수를 호출할 수도 있습니다
<a href="http://localhost" class="active"|cond="$obj->isActivated()">Go</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
가 있고 if
로 시작한 구문을 닫을 때는 endif
를 사용한다.
조건을 비교하여 조건에 맞으면 블럭 안의 템플릿을 출력한다. 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-->
배열이나 객체 등 값을 나열할 수 있는(enumerable) 객체에 대해 반복문을 실행한다. for
, foreach
, while
로 시작하고 각각 endfor
, endforeach
, endwhile
로 블럭을 마친다.
for
로 시작하고 endfor
로 마치는 반복문이다. 반복 횟수가 정해진 경우에 유용하다.
<!--@for($i = 0; $i < 10; $i++)-->
<span>Number : {$i}</span>
<!--@endfor-->
foreach
로 시작하고 endforeach
로 마치는 반복문이다. 배열이나 객체를 처음부터 끝까지 반복할 때 유용하다.
<!--@foreach($arr as $key=>$name)-->
<span>Item {$key} : {$name}</span>
<!--@endforeach-->
while
로 시작하고 endwhile
로 마치는 반복문이다. 반복 횟수를 알 수 없을 때 유용하다.
<!--@while($item=get_item())-->
<span>Item : {$item}</span>
<!--@endwhile-->