조건문 IF

XE Template Syntax

조건문 IF / cond

주어진 조건에 따라 필요한 내용을 문맥에 알맞게 출력하거나 배제할 때 조건문을 사용한다.

1. IF 문

IF 조건문은 PHP의 IF 조건문과 동일하고 "if, elseif, else, end"와 "조건식"으로 이루어져 있다. if 문이 시작되면 반드시 end 문으로 닫아서 조건문이 끝났음을 선언해야 하고 조건식의 내용은 PHP문으로 해석되기 때문에 PHP에서 사용 가능한 여러 가지 연산자(&&, ||, ==, ! 등)의 사용이 가능하다.

[작성 문법]

<!--@if($a==1)--> // 조건식1이 참(TRUE)이면 포함된 내용을 실행
   <p>Welcome XE!</p>
<!--@elseif($a==2)--> // 조건식1이 거짓(FALSE)이고 조건식 2가 참(TRUE)이면 포함된 내용 실행 
    <p>Welcome XpressEngine!</p>
<!--@else--> // 조건식 1,2가 모두 거짓(FALSE)이면 포함된 내용 실행
    <p>Welcome XEschool!</p>
<!--@end-->

XE 템플릿 스킨 등에서 작성된 IF 조건문은 PHP문으로 해석되어 다음과 같이 출력된다.

compile...
<?php if ($a==1) { ?>
   <p>Welcome XE!</p>
<?php } elseif ($a==2) { ?>
   <p>Welcome XpressEngine!</p>
<?php } else { ?>
   <p>Welcome XEschool!</p>
<?php } ?>

위와 같이 PHP문과 HTML 태그가 분리된 형식을 회피(Escaping in PHP) 구문이라고 한다. XML이나 XHTML 안에 PHP 코드를 내장시키려면 XML과 호환될 수 있도록 <?php ... ?> 형을 써야 한다. 약식 출력(<?=...?>) 또는 짧은 태그(<?...?>)를 사용하면 XHTML 문서에서는 오류가 발생한다. 따라서 XE 템플릿 문법에서 <!--@ ... --> 의 사용은 항상 PHP문으로 해석할 때 <?php ... ?>를 포함하게 되는 것이다. 그러면 HTML 표준에 따른 주석 <!-- ... -->문은 어떻게 될까? 너무 걱정하지 않아도 된다. <!-- ... -->과 <!-- // ... --> 모두 앳 기호(@)가 없기 때문에 주석문으로 계속 사용이 가능하다. 별걱정 다한다...^^

<!--@if($is_logged)--> 
   <h2>당신은 로그인하셨습니다!</h2>
<!--@else--> 
   <h2>당신은 로그인하지 않으셨습니다!</h2>
<!--@end-->

결과값 :

당신은 로그인하지 않으셨습니다!

IF문 안에 또 다른 IF문도 포함(중첩)시킬 수 있다. 모든 HTML 태그의 사용도 가능하다. HTML 문서 안에서 보여주거나 보이지 말아야 할 내용을 동적으로 제어하기 위해 PHP 코드(code)를 분리한 것이 바로 XE 템플릿 문법이다. 대단히 복잡하게 보일 수 있는 코딩을 무척 간결하면서도 판독이 쉽도록 문법화 되어 있다. 다만 문법이기 때문에 한 글자라도 틀리면 오류가 발생한다...^^

IF문에서의 조건식 안에는 일반 변수를 이용한 조건식 뿐만 아니라 모든 "XE core 변수"를 이용한 조건식도 가능하다. 만약 로그인 여부에 따른 조건식을 꾸미면 다음과 같다. 만약 로그인 회원의 회원정보에서 홈페이지가 있는 경우 홈페이지 주소를 출력해 보자!

<!--@if($is_logged)-->
   <!--@if($logged_info->homepage)-->
      <h3>홈페이지 : {$logged_info->homepage}</h3>
   <!--@else-->
      <h3>아직 홈페이지가 없으시군요!</h3>
   <!--@end-->
<!--@else-->
   <h3>당신은 로그인하지 않으셨습니다! 로그인해 주세요!</h3>
<!--@end-->

결과값 :

당신은 로그인하지 않으셨습니다! 로그인해 주세요!

위와 같이 IF문 안에 작성된 코드 블록 영역은 조건식에 의한 결과값에 따라 출력 여부를 결정한다.


2. block 문과 cond 속성

block문은 HTML 표준 요소가 아니다. 실제로 없는 것이나 마찬가지다. 그런데 누구를 닮았는가 하면 DIV를 닮았다. XE 코어가 DIV를 쏙 빼다 박은 <block>...</block> 요소를 하나 만들었다. 그래서 족보에도 없는 것을 새로 만들었기 때문에 가상 요소 또는 가상 태그라고 부른다...^^

<block>
   <p>DIV를 닮은 block 요소!</p>
</block>

결과값 : DIV를 닮은 block 요소!

그러면 div 태그로 변환되는 것일까? 잘 모르겠다. 함수 라이브러리에서 아무리 찾아보아도 어떻게 변환되는지 모르겠다...^^ 웹브라우저도 이놈을 처음 보았을 것이고 선택자(id,class) 또는 스타일(style)도 적용되지 않는다. 유령같은 놈이다. 그래서 나는 이놈을 가상 태그가 아닌 유령(Ghost) 태그(Tag)라고 부른다...^^ 따라서 DIV를 닮기는 했으나 DIV는 아니라고만 말할 수 있다. 왜냐하면, block 요소는 혼자 쓰이지 않는다. 마치 서양의 유령들처럼 큰 낫(scythe) 같은 것을 항상 가지고 다니는데 이것이 cond 속성이다. (condition/조건,상태,상황)

<block cond="!$is_logged">
   <h3>빨리 로그인 하시오! 만약 로그인 하지 않으면....오늘 밤...</h3>
</block>

유령 태그(block)가 큰 낫(???)을 들고 물어본다. 로그인 했냐고! 만약 cond 속성을 이용한 조건식이 참(TRUE)이면 포함된 내용을 보여준다. 하지만 거짓(FALSE)이면 유령처럼 사라진다.

빨리 로그인 하시오! 만약 로그인 하지 않으면....오늘 밤...

block 이라는 가상 요소 안에 cond 속성(가상 속성)을 선언하고 있다. 이 cond 속성은 한줄 형태의 조건식을 포함하는데 IF문과 다른점은 예외(else) 사항이 없다. 무조건 유령 앞에서는 YES or NO 로 대답해야 한다...^^ 왜냐하면 PHP문으로 변환할 때 if(조건식) {...} 의 형태가 되기 때문이다. 만약 2가지 이상의 조건 형태로 작성하기 위해서는 다음과 같이 작성해야 한다.

<block cond="!$is_logged">
   <h3>빨리 로그인 하시오! 만약 로그인 하지 않으면....오늘 밤...</h3>
</block>
<block cond="$is_logged">
   <h3>잘 주무시오...^^</h3>
</block>

결과값 :

빨리 로그인 하시오! 만약 로그인 하지 않으면....오늘 밤...

그런데 이 큰 유령의 낫(?)이 전염된다. 다른 HTML 태그(요소)에서도 사용할 수 있다.

<p cond="조건식">Welcome XE!</p> // 태그 안에서 가상 속성(cond) 형식

HTML 표준 요소도 cond 속성만 가지면 "빨간 휴지 줄까? 파란 휴지 줄까?" 하고 물어보게 된다.
DIV, h1, h2, h3, p, ul, li.......etc,etc,etc...전염성이 무척 크다!


여하튼 "빨간 휴지 줄까? 파란 휴지 줄까?"하고 물어보는 h3 태그가 여기 있다.

<h3 style="color:#FF0000"|cond="$is_logged">빨간 휴지 줄까? 파란 휴지 줄까?</h3>

결과값 :

빨간 휴지 줄까? 파란 휴지 줄까?

h3의 cond 조건식은 참(TRUE) 또는 거짓(FALSE)이다. 하지만 cond 속성이 파이프(|,pipe)를 이용해 다른 속성과 연결되어 있으면, 이때 cond는 h3에 영향력을 행사하는 것이 아니라 파이프(pipe)로 연결된 속성에 제한된다. 만약 조건식이 참이면 폰트의 색을 빨간색으로 값을 추가하거나 변경한다. 거짓이면 연결된 속성과 함께 유령처럼 사라진다. 연결된 속성만 가지고 사라지기 때문에 항상 h3 태그의 내용물은 출력되는 것이다.

※ h3의 폰트는 class 선택자를 이용해 기본 파란색이다. 하지만 인라인 스타일 형식으로 최후에 선언된 스타일을 적용받게 되어 변경된다. 만약 CSS에서 미리 선언되어 있지 않았다면 추가되는 것이다. 연결할 수 있는 속성에는 클래스(class)도 가능하며 자유롭게 사용한다. 이때 연결되는 속성은 파이프(pipe)를 사이에 두고 빈칸 없이 붙여 작성한다.

<p attr="value"|cond="조건식">Welcome XE!</p>

// <p> 요소는 무조건 출력하는데 조건식이 참이면 attr="value" 속성과 값을 출력


[XE 템플릿 문법의 IF 와 cond 의 차이점]
IF문에서는 조건(condition)에 대해서 그밖의(else) 예외에 대한 내용을 포함할 수 있다.(PHP문과 동일) 즉 조건이 참(TRUE)이면 출력할 내용과 참(TRUE)이 아닌 경우에 대한 예외 출력문을 함께 사용할 수 있지만, cond는 태그 요소 또는 속성에서 인라인 형식으로 조건에 따라 출력 여부를 결정하고 끝낸다.

다시말해 IF문은 조건절<!--@if(조건식)--> 바깥 영역에서 출력에 대한 내용을 작성하고 <!--@elseif(추가 조건)-->과 함께 예외 구문 <!--@else-->를 포함한 출력형식을 작성 할 수 있는 반면, cond 속성문은 태그 안에서 자기 자신 스스로에게 조건에 따른 출력 여부를 결정하기 때문에 매우 간단한 형식의 구문을 작성할 수 있다. 또한 태그의 속성에도 조건을 이용해 접근할 수 있는 장점이 있다. cond 속성이 block 가상 요소와 함께 사용된다면 더 큰 힘을 발휘한다. 조건에 따른 요소들을 하나로 묶어두고 출력여부를 한곳에서 결정하기 때문이다. 따라서 2가지 문법의 차이점을 이해하고 block 가상 요소를 적절히 활용하면 매우 유용한 조건 구문을 작성할 수 있다.