phpsource/템플릿2006. 11. 2. 09:49
written: Jan 28 2002
last modified: Nov 02 2006
조건문
PHP 문서에서 아래와 같은 조건문을 많이 보셨을 것입니다.
[code php;gutter:false] <?php if ($image_check) { print '<img src="./images/email.gif">'; } ?>[/code]
 위와 같은 조건문에서 $image_check의 값이 1 또는 true면 괄호 안의 내용을 실행하고, 0 또는 false면 실행하지 않습니다.
후키템플릿에서도 아래와 같이 조건변수(스위치문)를 이용하면 같은 기능을 수행하는 템플릿 문서를 작성할 수 있습니다.
[code html;gutter:false] {IMAGE_CHECK, <img src="./images/email.gif"> }[/code]
또는
[code html;gutter:false] {?IMAGE_CHECK} <img src="./images/email.gif"> {/}[/code]
조건변수 IMAGE_CHECK 값을 0 또는 false로 할당하면 스위치문 안의 내용은 브라우저에 나타나지 않으며 IMAGE_CHECK 값을 1 또는 true로 할당하면 나타납니다.
[code php;gutter:false] $tpl->assign(IMAGE_CHECK, 0); // 아무 것도 나타나지 않음 $tpl->assign(IMAGE_CHECK, 1); // 이미지 email.gif가 나타남[/code]
[주의] {?변수명}경우의수{/} 또는 {?변수명,경우의수}와 같은 구문형식은 1.2.0 버전부터 사용할 수 있습니다. 그 이전 버전에서는 {변수명,경우의수}라고 작성해야 합니다.
스위치문
PHP 문서에서 아래와 같은 스위치문을 많이 보셨을 것입니다.
[code php;gutter:false] <?php switch ($var_name) { case 'apple': print '나는 사과입니다.'; break; case 'pear': print '나는 배입니다.'; break; case 'orange': print '나는 오렌지입니다.'; break; } ?>[/code]
조건변수(스위치문)를 이용하면 아래와 같이 같은 기능을 수행하는 템플릿 문서를 작성할 수 있습니다.
{var_name,
%apple%나는 사과입니다.|%pear%나는 배입니다.|%orange%나는 오렌지입니다.
}
또는
{?var_name}
apple {%
나는 사과입니다.
%}

pear {%
나는 배입니다.
%}


orange {%
나는 오렌지입니다.
%}

{/}
[주의] {?변수명} 인덱스1 {%항목1%}  인덱스2 {%항목2%} ......{/} 또는 {?변수명, %인덱스1% 항목1 | %인덱스2%/ 항목2 ......}와 같은 구문형식은 1.2.0 버전부터 사용할 수 있습니다. 그 이전 버전에서는 {변수명,%인덱스1% 항목1 | %인덱스2%/ 항목2 ......}라고 작성해야 합니다.
이와같이 조건변수를 이용하면 PHP의 스위치문과 같이 한번의 평가에 의해 여러 개의 case를 동시에 표현하는 것이지요. 여러 개의 문자열(태그가 포함될 수 있음)을 템플릿에 정의해 놓고 상황에 따라 그 중에 하나만 선택하여 브라우저에 나타내려면 각 항목(case)를 구분해주는 구분자가 필요하고 또한 각 항목을 대표하는 인덱스 문자를 구분해주는 구분자가 필요합니다. 이러한 구분자들은 각 버전별로 다소 변화가 있습니다.
< 구분자의 버전별 변화 >
해당 버전 조건변수 구문형식 경우의수 구문형식
항목 구분자 인덱스 구분자
0.0.1p3 ~ 1.1.1 {변수명:반복문:초기값,경우의수} | (수직바) %
1.2.0 {변수명::초기값,경우의수} | (수직바) %
{?변수명;변수옵션;필터명령,경우의수}
{?변수명;변수옵션;필터명령}경우의수{/}
| (수직바) %
{% 과 %} white space
PHP 문서의 인덱스(index)
assign 함수에서 지정할 수 있는 인덱스 문자는 정수, 문자열, true, false입니다. 정수를 지정하면 assign 함수에 의해 문자열로 변환됩니다.
[code php;gutter:false] $tpl->assign('SW_VAR', 2);[/code]
지정된 정수 2는 문자열 '2'로 변환되어 해당되는 항목을 선택합니다. boolean형인 true와 false를 지정하면 이 형식을 가지고 항목을 선택합니다.
인덱스 문자를 지정하지 않았을 때
아래와 같이 각 항목에 인덱스 문자가 지정되지 않았을 때는 앞에서부터 1, 2, 3, 4, 5가 자동으로 지정됩니다.
{?VAR} 첫번째값 | 두번째값 | 세번째값 | 네번째값 | 다섯번째값 {/}
위의 예제에서 PHP에서 템플릿 변수 {VAR}에 할당되는 값에 따라 어떤 값이 출력되는지 살펴보면 아래와 같습니다.
PHP 소스 : $tpl->assign('VAR', 2);
출력항목 : 두번째값

PHP 소스 : $tpl->assign('VAR', 4);
출력항목 : 네번째값

PHP 소스 : $tpl->assign('VAR', 0);
출력항목 : 없음
문자열 인덱스
인덱스를 지정하지 않으면 앞 항목부터 1, 2, 3, 4, 5 가 자동으로 지정된다고 하였는데 아래와 같이 자동 지정되는 1, 2, 3, 4 ... 라는 문자를 다른 순서로 임의 지정한다면 어떻게 될까요?
{VAR, %4%첫번째값 | %3%두번째값 | %2%세번째값 | %1%네번째값 | %0%다섯번째값}
이 경우에 템플릿 변수를 할당할 때는 인덱스 키값을 직접 지정하는 경우가 그렇지 않은 경우보다 우선 순위가 높습니다(0.0.3p1부터 적용).
이에 따라 PHP에서 템플릿 변수 {VAR}에 할당되는 값에 따라 어떤 값이 출력되는지 살펴보면 아래와 같습니다.
PHP 소스 : $tpl->assign('VAR', 2);
출력 : 세번째값

PHP 소스 : $tpl->assign('VAR', 4);
출력 : 첫번째값

PHP 소스 : $tpl->assign('VAR', 0);
출력 : 다섯번째값
BOOLEAN 인덱스
각 case를 지정하는 값으로 false 또는 true를 지정하게 되면 마지막에 있는 두가지 경우 중 하나가 선택됩니다. false면 마지막 바로 앞의 경우를 선택하며, true이면 마지막 경우를 선택합니다.
[code html;gutter:false] {?NEW} <img src="./images/new1.gif"> | <img src="./images/new2.gif"> | <img src="./images/new3.gif"> {/}[/code]
[code php;gutter:false] $tpl->assign('NEW', false); // new2.gif가 출력됨 $tpl->assign('NEW', true); // new3.gif가 출력됨[/code]
인덱스 키 'default'
조건에 맞는 항목이 없을 때는 아무런 값도 출력하지 않습니다. 그러나 1.2.0 버전부터는 PHP의 스위치문에서처럼 예약어 'default' 라는 인덱스 키로 지정된 항목을 작성하면 조건에 맞는 항목이 없을 때 default로 지정된 항목을 출력할 수 있습니다.
{?VAR} 첫번째값 | 두번째값 | 세번째값 | 네번째값 | %default% 기본값 {/}
위의 예제의 경우에 PHP에서 템플릿 변수 VAR에 0과 같은 1, 2, 3, 4 이외의 값을 할당한다면default로 지정된 항목 "기본값"이 출력됩니다.
인덱싱(indexing)
이전 버전에서 각 항목을 인덱싱하는 방법을 보면 좀 혼란스러운 것 같아 1.2.0 버전에서는 이를 단순화하였습니다. assign() 함수에서 지정된 인텍스 문자를 가지고 다음과 같은 조건에 의해 해당 항목을 선택합니다.
  • 지정된 인덱스 문자가 문자열이면 각 항목에 기록된 인덱스와 비교하여 일치하는 항목을 되돌려 줍니다.
  • 지정된 인덱스 문자가 boolean형인 true면 가장 뒤에 있는 항목을 되돌려 줍니다.
  • 지정된 인덱스 문자가 boolean형인 false면 뒤에서 두번째 있는 항목을 되돌려 줍니다.
  • 위의 조건에 해당되는 것이 없을 때 인덱스 중에 'default'가 존재하면 이 항목을 되돌려 줍니다.
  • 위의 조건에 해당되는 것이 없으면 아무 값도 되돌려주지 않습니다.
중첩 switch문
1.0.0 버전부터는 switch문 내에 switch문을 제한없이 중첩할 수 있도록 개선하였습니다. 아래는 중첩 switch문을 이용한 템플릿 파일 예제입니다.
{?SW_VAR_1;;pear}
   apple {%
       사과
   %}
   pear {%
       배:
       {?SW_VAR_2;;나주}
           서울 {%
               서울배
           %}
              
           성환 {%
               성환배
           %}
              
           나주 {%
               {?SW_VAR_3;;나주2}
                   나주1 {% 나주1배 %}
                   나주2 {% 나주2배 %}
                   나주3 {% 나주3배 %}
                   나주4 {% 나주4배 %}
               {/}
           %}
       {/}
   %}
   orange {%
       오렌지
   %}
{/}
조건변수(스위치문)를 중첩되게 사용할 경우에 한 문장내에서는 여러가지 구문형식 중에 동일한 구문형식으로 작성하여야 하며 혼용하여 사용할 수 없습니다. 혼용하더라도 현재 버전에서는 정상적으로 동작하나 향후 상위버전과의 호환성을 보장할 수 없습니다.
각 항목의 앞 뒤에 공백붙이기
1.0.0 버전부터 각 항목의 앞뒤에 있는 공백이 모두 삭제됩니다. 만약에 각 항목의 앞뒤에 공백을 넣으려면 어떻게 할까요? 아래의 예와 같이 공백 앞에 역슬래시(\)를 붙여서 escape 시키면 됩니다.
{COLOR,
\ 파란색\ |
\ 빨간색\ |
\ 노랑색\ |
\ 하늘색\ |
\ 초록색\
}
역슬래시(\)를 붙여서 escape 시키는 대신에 아래와 같이 &nbsp; 코드를 이용하셔도 됩니다.
{COLOR,
&nbsp;파란색&nbsp; |
&nbsp;빨간색&nbsp; |
&nbsp;노랑색&nbsp; |
&nbsp;하늘색&nbsp; |
&nbsp;초록색&nbsp;
}
동일한 스위치 변수명으로 다른 조건 선택하기
동일한 변수값을 가지고 여러개의 다른 조건을 선택할 수 있습니다.
{SW_VALUE, a | b | c}
{SW_VALUE, A | B | C}
위의 예와 같이 템플릿 파일 내에 동일한 템플릿 변수 {SW_VALUE}에 대하여 그 조건문이 다르게 나타낼 수 있습니다. 이 때 {SW_VALUE}의 값이 2라면 {SW_VALUE, a | b | c}의 결과값은 'b'이고 {SW_VALUE, A | B | C}의 결과값은 'B'입니다. 위의 예에 있는 템플릿 파일을 컴파일하면 템플릿변수 구조는 대략 아래와 같이 변환됩니다. 여기서 변수 구조와 인덱스값은 템플릿 버전 및 템플릿 파일에 포함된 템플릿 변수의 위치에 따라 변경될 수 있습니다.
[*switch_1] => Array(
[var_name] => SW_VALUE
[case] => Array(
[1] => Array(
[0] => a
)

[2] => Array(
[0] => b
)

[3] => Array(
[0] => c
)
)
)

[*switch_2] => Array(
[var_name] => SW_VALUE
[case] => Array(
[1] => Array(
[0] => A
)

[2] => Array(
[0] => B
)

[3] => Array(
[0] => C
)
)
)

Posted by 방글24