스마티 기본 문법
작성: pinkhare(분홍토끼) in GTport
스마티 템플릿 태그는 전부 구획 문자로 에워싸이게 되는데, 구획 문자의 기본 값은 {, } 로 표현되며 다른 것으로 사용할 수도 있습니다.
기본 구획 문자를 사용할 경우는 구획 문자로 둘러싸이지 않은 내용들은 전부 고정적인 내용으로 출력되거나 있는 그대로 표현됩니다.
스마티는 템플릿 태그를 읽어들이게 되면, 알맞는 값으로 변환하여 보여줍니다.
1) 스마티 주석 처리 방법
- 중괄호'{}' 안에 애스터리스크(*)로 내용을 감싸면 됩니다.
예제) {* 저는 주석이에요~ *}
- HTML의 주석인 '<!-- -->'은 최종 결과물에 표시가 되지만, 스마티 주석은 최종 결과물에는 출력되지 않습니다.
예제)
{*
개발자 주석: $includeFile은 foo.php 스크립트 안에 선언되어있다.
(이것은 브라우저로 전송되지 않는 주석이므로, 이용자들이 볼 수 없다)
*}
<!-- 이 HTML 주석은 브라우저로 전송되어 이용자들이 볼 수 있다 -->
{include file=$includeFile}
2) 스마티 변수
스마티에서 템플릿 변수는 PHP와 마찬가지로 변수명 앞에 달러표시($)가 붙습니다. 변수명에는 숫자 및 언더스코어를 포함할 수 있습니다.
계수적/비계수적으로 표현되는 배열들을 참조할 수 있습니다. 객체 프로퍼티 및 메소드를 참조할 수도 있습니다.
환경 파일 변수는 앞에 달러표시를 붙이지 않고, 그 대신 해쉬마크(#: 샵 or 잡동사니 부호)를 둘러서 표현하든지 특수 $smarty.config 변수로 표현할 수 있습니다.
예제)
{$foo[4]} <-- 0-인덱스 배열의 5번째 엘리먼트 출력
{$foo.bar} <-- display the "bar" key value of an array, similar to PHP $foo['bar']
{$foo.$bar} <-- display variable key value of an array, similar to PHP $foo[$bar]
{$foo->bar} <-- display the object property "bar"
{$foo->bar()} <-- display the return value of object method "bar"
{#foo#} <-- display the config file variable "foo"
{$smarty.config.foo} <-- synonym for {#foo#}
{$foo[bar]} <-- syntax only valid in a section loop, see {section}
{assign var=foo value="baa"}{$foo} <-- displays "baa", see {assign}
다음과 같이 여러가지 조합도 가능합니다 ;
{$foo.bar.baz}
{$foo.$bar.$baz}
{$foo[4].baz}
{$foo[4].$baz}
{$foo.bar.baz[4]}
{$foo->bar($baz,2,$bar)} <-- passing parameters
{"foo"} <-- static values are allowed
# 추후 연재될 스마티 예약 변수 및 환경(설정) 변수 참조.
3) 함수
스마티 태그는 변수를 출력하거나 함수를 호출합니다.
함수는 그 함수 및 애트리뷰트를 {함수명 애트리뷰트1="값" 애트리뷰트2="값"}과 같이 구획 문자로 둘러쌈으로써 처리되어 출력됩니다.
예제) 함수 구문
{include file="header.tpl"}
{if $highlight_name}
Welcome, <font color="{#fontColor#}">{$name}!</font>
{else}
Welcome, {$name}!
{/if}
{include file="footer.tpl"}
템플릿에서 내장함수와 사용자함수는 똑같은 구문 체계를 사용합니다.
내장함수는 스마티 내부 처리를 담당하며, 수정이 불가능 합니다.
{if}, {section}, {strip} 등..
사용자함수는 플러그인을 이용하여 구현되는 부가 함수입니다. 함수 사용자의 편의대로 고쳐서 사용할 수가 있고 새로운 기능을 추가할 수도 있습니다.
{html_options}, {popup} 등..
4) 애트리뷰트
대부분의 함수는 자신의 기능을 특화하고 수정해주는 애트리뷰트들을 가집니다.
HTML의 애트리뷰트와 거의 흡사합니다. 고정적 값들은 굳이 따옴표 처리할 필요가 없지만, 문자열을 표현할 때 따옴표 처리를 하는게 좋습니다. 변수 사용시에는 따옴표 처리를 하면 안됩니다.
논리(boolean)값 (true, false)을 요하는 애트리뷰트도 있는데, 참과 거짓의 경우 각각
- 참 : true, on, yes
- 거짓 : false, off, no
과 같이 따옴표 없이 적어주면 됩니다.
예제) 함수 애트리뷰트 문법
{include file='header.tpl' attrib_name='attrib value'} --> 문자열
{include file=$includeFile} --> 변수명은 따옴표 없음
{include file=#includeFile# title='Smarty is cool'}
{html_select_date display_days=yes}
{mailto address='smarty@example.com'} --> 메일주소도 문자열이므로
<select name='company_id'>
{html_options options=$companies selected=$company_id}
</select>
5) 큰 따옴표로 묶인 삽입 변수들
스마티는 큰 따옴표 안에 선언된 삽입 변수를 인식합니다. 단, 그 변수는 숫자, 글자, 언더스코어, 대괄호([]) 만으로 이루어져야 합니다. 혹시 마침표, 객체 참조 등의 기타 문자들을 사용하려면 변수명을 역따옴표(``)로 묶어야 합니다. 변경자는 따옴표 안에 삽입할 수 없고, 따옴표의 바깥에 적용해야 합니다.
예제) 삽입 따옴표 문법
{func var="test $foo test"}
{func var="test $foo_bar test"}
{func var="test $foo[0] test"}
{func var="test $foo[bar] test"}
{func var="test $foo.bar test"} --> $foo.bar 를 참조하지 않고 $foo 를 참조함 (역따옴표 없는 마침표는 인식 안함)
{func var="test `$foo.bar` test"} --> 변수명에 마침표가 사용되어, 역따옴표로 묶음
{func var="test `$foo.bar` test"|escape} --> 변경자는 따옴표의 바깥에 적어주었다
사용 예제:
{include file="subdir/$tpl_name.tpl"} <-- will replace $tpl_name with value
{cycle values="one,two,`$smarty.config.myval`"} <-- must have backticks
# 추후 연재될 이스케이프 문자 참조.
6) 연산
변수값에 직접 연산을 적용할 수 있습니다.
예제) 연산 예제들
{$foo*$bar}
{* 좀 더 복잡한 예제들 *}
{$foo->bar-$bar[1]*$baz->foo->bar()-3*7}
{if ($foo+$bar.test%$baz*134232+10+$b+10)}
{$foo|truncate:"`$fooTruncCount/$barTruncFactor-1`"}
{assign var="foo" value="`$foo+$bar`"}
7) 스마티 구문 분석(파싱) 탈피
일부 스마티 문법이 적용되지 않는게 좋거나 적용되지 말아야 하는 부분이 있습니다. 즉, 스마티 문법과 다른 방식으로 판독(구문 분석)이 되어야 하는 부분이 존재합니다. 일례로 자바스크립트 및 CSS 코드를 템플릿에 삽입하는 경우가 그것이죠. 그러한 언어들이 스마티의 기본 구획문자를 사용하기 때문에 문제가 발생하게 됩니다.
이걸 완전히 피하기 위한 가장 단순한 방법은 자바스크립트와 CSS 코드를 해당하는 포맷의 각각의 파일로 분리하고 그 파일들에 접근하는 데 표준 HTML 방식을 사용하는 것입니다.
있는 그대로의 내용을 담기 위해서 {literal} ... {/literal} 블록을 이용할 수 있습니다.
HTML 개체 사용과 비슷하게 현재의 구획문자를 보여주는 데 {Idelim},{rdelim} 또는 {$smarty.Idelim}을 사용할 수 있습니다.
스마티의 $left_delimiter 와 $right_delimilter를 변경하는 것이 때때로 편리합니다.
예제) 구획문자 변경 예제
$smarty = new Smarty;
$smarty->left_delimiter = '<!--{';
$smarty->right_delimiter = '}-->';
$smarty->assign('foo', 'bar');
$smarty->display('example.tpl');
?>
example.tpl 에는:
<script language="javascript">
var foo = <!--{$foo}-->;
function dosomething() {
alert("foo is " + foo);
}
dosomething();
</script>
# 추후 연재될 이스케이프 변경자를 참조하세요.






수달님~~~
여기 암껏도 안보여요~
내용이 없음..ㅡㅡ;;;
.. 아무래도 임시게시판에 올리고 다 되면 옮기는 방식으로 해야할 것 같네요...
아직도 다 완성된 것이 아니니 조금만 기다려주세요 ~..