기본 템플릿 문법¶
Rhymix/XE의 템플릿 문법은 HTML 태그에 특별한 속성을 추가하여 동적인 기능을 구현하는 방식입니다.
조건문 (cond)¶
조건문은 특정 조건이 참일 때만 해당 요소를 출력합니다.
기본 사용법¶
<!-- 조건이 참일 때만 출력 -->
<div cond="$is_logged">
로그인되었습니다.
</div>
<!-- 조건이 거짓일 때 출력 (! 사용) -->
<div cond="!$is_logged">
로그인이 필요합니다.
</div>
block 태그 사용¶
HTML 요소 없이 조건만 체크하려면 <block>
태그를 사용합니다:
<block cond="$member_info">
<p>회원명: {$member_info->nick_name}</p>
<p>포인트: {$member_info->point}</p>
</block>
속성 조건부 출력¶
특정 속성만 조건부로 출력할 수 있습니다:
<!-- disabled 속성을 조건부로 추가 -->
<button disabled="disabled"|cond="!$grant->write">
글쓰기
</button>
<!-- class를 조건부로 추가 -->
<li class="active"|cond="$mid == 'board'">
게시판
</li>
복잡한 조건¶
<!-- AND 조건 -->
<div cond="$is_logged && $member_info->is_admin == 'Y'">
관리자 메뉴
</div>
<!-- OR 조건 -->
<div cond="$act == 'dispBoardWrite' || $act == 'dispBoardModify'">
글쓰기 폼
</div>
<!-- 배열/객체 확인 -->
<table cond="count($list) > 0">
<!-- 게시글 목록 -->
</table>
반복문 (loop)¶
반복문은 배열이나 컬렉션의 각 항목에 대해 HTML을 반복 출력합니다.
기본 사용법¶
<!-- 간단한 반복 -->
<ul>
<li loop="$list => $item">
{$item->title}
</li>
</ul>
<!-- 키값 포함 -->
<ul>
<li loop="$list => $key, $item">
{$key}. {$item->title}
</li>
</ul>
block 태그로 반복¶
<table>
<block loop="$document_list => $no, $document">
<tr>
<td>{$no}</td>
<td>{$document->title}</td>
<td>{$document->nick_name}</td>
</tr>
</block>
</table>
for 스타일 반복¶
<!-- 1부터 10까지 반복 -->
<select>
<option loop="$i=1;$i<=10;$i++" value="{$i}">
{$i}
</option>
</select>
중첩 반복문¶
<div loop="$categories => $category">
<h3>{$category->title}</h3>
<ul>
<li loop="$category->children => $child">
{$child->title}
</li>
</ul>
</div>
파일 포함 (include)¶
다른 템플릿 파일을 포함시킵니다:
<!-- 헤더 포함 -->
<include target="header.html" />
<!-- 변수 전달 -->
<include target="item.html" item="$document" />
<!-- 조건부 포함 -->
<include target="admin_menu.html" cond="$logged_info->is_admin == 'Y'" />
리소스 로드 (load)¶
CSS, JS, XML 필터 등을 로드합니다:
<!-- CSS 파일 로드 -->
<load target="style.css" />
<!-- JavaScript 파일 로드 -->
<load target="script.js" />
<!-- body 태그 끝에 JS 로드 -->
<load target="script.js" type="body" />
<!-- XML JS 필터 로드 -->
<load target="filter/insert.xml" />
<!-- 조건부 로드 -->
<load target="admin.css" cond="$logged_info->is_admin == 'Y'" />
<!-- 외부 리소스 로드 -->
<load target="https://cdn.example.com/library.js" />
리소스 제거 (unload)¶
이미 로드된 리소스를 제거합니다:
<!-- 특정 CSS 제거 -->
<unload target="unwanted.css" />
<!-- 특정 JS 제거 -->
<unload target="unwanted.js" />
주석¶
템플릿 컴파일 시 제거되는 주석:
<!--@if($cond)-->
조건부 내용
<!--@else-->
다른 내용
<!--@endif-->
<!--// 한 줄 주석 -->
<!--/*
여러 줄 주석
이 내용은 컴파일된 파일에 포함되지 않습니다.
*/-->
변수 출력¶
<!-- 기본 출력 -->
<p>{$title}</p>
<!-- 객체 속성 -->
<p>{$document->title}</p>
<!-- 배열 요소 -->
<p>{$array['key']}</p>
<!-- 기본값 설정 -->
<p>{$title ?: '제목 없음'}</p>
<!-- HTML 이스케이프 -->
<p>{htmlspecialchars($content)}</p>
<!-- HTML 그대로 출력 (주의!) -->
<div>{$content|noescape}</div>
특수 변수¶
<!-- Context 인스턴스 -->
{$oContext}
<!-- 현재 모듈 정보 -->
{$module_info->mid}
{$module_info->browser_title}
<!-- 로그인 정보 -->
{$logged_info->member_srl}
{$logged_info->nick_name}
<!-- 언어 변수 -->
{$lang->cmd_write}
<!-- XE 경로 -->
{$xe_path}
<!-- 현재 URL -->
{$current_url}
실전 예제¶
게시판 목록¶
<table cond="$document_list">
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>날짜</th>
</tr>
</thead>
<tbody>
<tr loop="$document_list => $no, $document">
<td>{$document->document_srl}</td>
<td>
<a href="{getUrl('document_srl', $document->document_srl)}">
{$document->title}
</a>
<span class="comment" cond="$document->comment_count > 0">
[{$document->comment_count}]
</span>
</td>
<td>{$document->nick_name}</td>
<td>{$document->regdate}</td>
</tr>
</tbody>
</table>
<p cond="!$document_list">
등록된 게시글이 없습니다.
</p>
로그인 폼¶
<block cond="!$is_logged">
<form action="{getUrl('act', 'procMemberLogin')}" method="post">
<input type="hidden" name="success_return_url" value="{$current_url}" />
<div>
<label for="uid">아이디</label>
<input type="text" name="user_id" id="uid" required />
</div>
<div>
<label for="upw">비밀번호</label>
<input type="password" name="password" id="upw" required />
</div>
<button type="submit">로그인</button>
</form>
</block>
<block cond="$is_logged">
<p>{$logged_info->nick_name}님 환영합니다!</p>
<a href="{getUrl('act', 'dispMemberLogout')}">로그아웃</a>
</block>