개발자 가이드

템플릿 문법 v1 (레거시)

템플릿 v1은 XE 시절부터 이어져 온 문법입니다. 기존 자료 대부분이 이 문법으로 만들어져 있어, 유지보수와 참고를 위해 정리합니다. 새 자료는 템플릿 문법 v2로 만드세요.

출력

{$variable}
{$object->method()}
{$array[$key]}

첫 중괄호 바로 뒤에 공백을 넣거나 중간에 줄바꿈이 있으면 동작하지 않습니다 ({ $name } 은 출력되지 않음).

필터는 v2와 같습니다.

{$var|lower|escape}
{$timestamp|date:'Y-m-d H:i'}
{$number|number_format}

조건과 반복: HTML 주석 스타일

<!--@if($condition)-->
	<div>참</div>
<!--@else-->
	<div>거짓</div>
<!--@endif-->

<!--@foreach($list as $key => $item)-->
	<li>{$item->title}</li>
<!--@endforeach-->

<!--@for(...)--> <!--@while(...)--> 도 같은 방식입니다.

속성 스타일: cond / loop

v1의 가장 특징적인 문법입니다. 태그에 속성으로 조건·반복을 붙입니다.

<div cond="$is_logged">로그인 상태에서만 보임</div>

<li loop="$list => $key, $item">{$item->title}</li>

속성 값 자체를 조건부로 붙일 수도 있습니다.

<option value="foo" selected="selected"|cond="$val === 'foo'">FOO</option>
<input type="checkbox" checked="checked"|cond="$item->checked" />

태그 없이 묶고 싶을 때는 <block> 을 씁니다 (v2에서는 지원하지 않는 문법입니다).

<block cond="$show">
	여러 요소를 한 번에
</block>

PHP 코드

{@ $foo = 'bar'}
{@
	$foo = 'bar';
	if ($condition):
		$enabled = true;
	endif;
}

주의: {@ ... } 는 첫 번째 } 까지만 매칭됩니다. 코드 안에 중괄호 블록(if (...) { ... })을 쓰면 잘립니다. if (...): / endif; 스타일을 쓰세요.

포함과 자원 로딩

<include target="_header.html" />
<include target="^/common/tpl/refresh.html" />   <!--// ^ 는 사이트 루트 -->
<include target="_promo" cond="$show_promo" />

<load target="css/skin.css" />
<load target="css/skin.css" media="print" index="20" />
<load target="js/skin.js" type="body" />
<unload target="js/old.js" />

<!--#include(...)-->, <!--%import(...)-->, <!--%load_js_plugin(...)--> 은 더 오래된 표기이며 새로 쓰지 마세요.

주석

<!-- 출력에 남는 일반 HTML 주석 -->
<!--// 출력에서 제거되는 템플릿 주석 -->

자동 기능 (v1·v2 공통)

  • 자원 경로 자동 변환: <img src="img/icon.png" /> 처럼 상대 경로를 쓰면 스킨 경로 기준의 절대 경로로 바뀌어 출력됩니다.
  • 폼 자동 주입: <form method="post"> 에는 mid·act·CSRF 등 필요한 hidden 필드가 자동으로 붙습니다. ruleset="이름" 을 주면 검증 규칙도 연결됩니다. 자동 주입을 끄려면 rx-autoform="false", error_return_url만 빼려면 no-error-return-url="true" 를 씁니다.
  • 자동 이스케이프: 파일 최상단에 <config autoescape="on" /> 을 선언하면 모든 {$var} 출력에 이스케이프가 적용됩니다. 선언하지 않은 옛 파일은 이스케이프되지 않으므로 사용자 입력 출력에 주의하세요.

v2와의 관계

  • v1 문법은 계속 동작하며, v2 파일 안에서도 cond 속성 일부(<include> 의 조건)와 {$var} 출력, {@ } 코드가 호환됩니다.
  • 반대로 v1 파일에서는 @if 등 v2 디렉티브가 동작하지 않습니다. 파일 첫 줄 @version(2) 선언 여부가 기준입니다.
  • 기존 v1 스킨을 고칠 때는 그대로 v1로 고치고, 크게 다시 만들 때 v2로 전환하는 것을 권장합니다.