* User ID : leesungmin
* Homepage : https://4880.net
* Email : imadonis@naver.com
* Following : 랩퍼투혼 whom the member is following.
* Following Count : 1people
* Followed by : 탑돌이, 랩퍼투혼 ... now follwing this member.
* Followed Count : 2people

< 빌립보서 4장 13절>
내가 주 안에서 크게 기뻐함은 너희가 나를 생각하던 것이 이제 다시 싹이 남이니 너희가 또한 이를 위하여 생각은 하였으나 기회가 없었느니라 ! 내가 궁핍하므로 말하는 것이 아니니라! 어떠한 형편에든지 나는 자족하기를 배웠노니 나는 비천에 처할 줄도 알고 풍부에 처할 줄도 알아 모든 일 곧 배부름과 배고픔과 풍부와 궁핍에도 처할 줄 아는 일체의 비결을 배웠노라! 내게 능력 주시는 자 안에서 내가 모든 것을 할 수 있느니라 !

* Document Count : 17511
* Comment Count : 82
* Document Count : 36
* Document Count : 115
* Comment Count : 123
* Document Count : 2
* Comment Count : 2
* Document Count : 1
* Comment Count : -1

CMS

  • List
  • Down
  • Up
  • Write
  • Search

XE코어 반복문 loop

부운영자 부운영자
45 0 0

XE Template Syntax

반복문 loop

주어진 조건에 따라 필요한 내용을 반복해서 출력해야 할 때 반복문(루프/loop)을 사용한다.

1. 반복문의 이해

반복문은 컴퓨터가 만들어지면서 가장 먼저 시도된 증조 할아버지뻘 되는 구문이고 문법이다. 1+1 은 쉽다. 하지만 1에서 10까지 더하라고 하면 약간 머리가 복잡해진다. 사람들이 컴퓨터를 만들고 가정 먼저 시도해 본 것도 이 문제를 해결하기 위한 것이다. 우리도 한번 해보자.

<?php
$a = 1;
$b = 1;
$c = $a + $b;
echo $c;
?>

 

 

결과값 : 2

그러면 1부터 10까지 더해보자.

<?php
$a = 1;
$b = 2;
$c = 3;
$d = 4;
$e = 5;
$f = 6;
$g = 7;
$h = 8;
$i = 9;
$j = 10;
$sum = $a + $b +$c +$d + $e + $f + $g + $h + $i + $j;

echo $sum; // 합계의 출력
?>

 

결과값 : 55

여기까지는 괜찮다. 하지만 만약 100까지 더하려면? 아니면 1000은? 그래서 다음과 같이 반복문(loop)을 만든다.

while 루프형
<?php
$i = 1; // 변수의 초기화
$sum = 0; // 합계의 초기화

while ($i <= 10) {
   $sum = $sum + $i; // 실행문
   $i++;
}

echo $sum; // 합계의 출력
?>

결과값 : 55

조건(while)이 만족할 때까지 while문 안의 실행문을 반복한다. 처음에 변수 $i 는 1을 대입한다. 이것을 초기화라고 한다. 왜냐하면 어디서부터 시작할 것인지를 결정하기 때문이다. 정수 1로 초기화 된 $i는 이제 본격적으로 조건식에 들어간다. 조건을 비교해 보니 아직 10보다 작거나 같지 않다. 조건이 참(TRUE)이다. 따라서 변수 $sum에 자신의 값 1을 더하고 다음 줄에서 하나 증가(++)한다. $i 는 2가 되었고 다시 조건을 확인해 본다. 아직 10에 모자르다. 따라서 10일 될 때까지 while문을 반복한다. 그동안 $sum은 1부터 차곡차곡 더해지고 있다. 마침내 $i가 11이 되면 조건식은 거짓(FALSE)이 된다. 그러면 실행문을 무시하고 반복문을 끝낸다. 기다리고 있던 echo문이 $sum을 찾아서 출력한다...^^

반복문에 있어서 가장 중요한 것은 조건식이다. 조건식이란 결국 몇 번을 반복할 것인가를 결정하는 중요한 단서이다. 위에서의 반복 조건은 $i가 10보다 작거나 같을때 까지이다. 따라서 10번을 반복했다. while 루프형(loop)은 매우 간단한 형식의 반복문이다.

이것을 for문으로 바꾸어 보자.

for 루프형
<?php
$sum = 0; // 합계의 초기화
for ($i = 1; $i <= 10; $i++) {
    $sum = $sum + $i; // 실행문
}

echo $sum; // 합계의 출력
?>

결과값 : 55

for문은 while문과 조금 다른 형식이다. 몇 번을 반복할 것인지에 대한 반복 횟수는 같다. 하지만 조건식의 구성이 조금 다르다. 좀 더 자세히 들여다 보자.

for (① ; ② ; ③) {
    ④; // 실행문
}

for 반복문이 실행되면 ①에서 초기화 한다. 이때 ①은 최초 한번만 실행한다. 변수 $i 에 1을 대입하여 초기화 한 후 ②로 넘어가면 ②는 참과 거짓을 따져 묻는 조건식이다. 그런데 진행방향이 여기서부터 달라진다. 거짓이면 반복문을 끝낸다. 하지만 참이면 ④로 가서 실행문을 실행하고 난 후 ③을 실행한다. ③은 변수 $i를 1씩 증가(++)시켜 주는 일만 한다. 즉 ④를 실행하고 오면 확인도장을 하나씩 찍어주는 것이다. 확인 도장을 받은 $i는 이제 도장이 2개가 된다. 왜냐하면 처음 for()문을 들어 올 때 이미 ①에서 1개의 도장을 받아 두었기 때문이다. $i는 신이나서 다시 ②로 간다. 그리고 참인지 거짓인지 물어본다. 아직 참이다. 다시 ④로 가서 실행문을 실행하고 ③에 가서 확인도장을 받는다...^^

열심히 뛰어다닌 결과 $i의 도장이 어느새 11개가 되었다. 조건식과 비교해보니 10보다 커서 거짓(FALSE)이 되었다. for()문을 끝내고 보니 받아둔 도장의 갯수는 11개이지만 실제로 반복한 횟수는 10번이다. 따라서 1부터 10까지의 합계가 $sum에 고스란히 저장 되었다.

for 루프형(loop)은 가장 복잡하지만 확인도장을 받아야 하는 재미있는 루프 구문이다.

이번에는 7색이 들어있는 색연필($crayon)이 있다. 이때 각각의 색 이름을 반복문으로 출력해 보자.

foreach 루프형
<?php
$crayon = array('빨강','주황','노랑','초록','파랑','남색','보라');

foreach ($crayon as $color) {
   echo '<p>☆ '.$color.'</p>';
}
?>

결과값 :

☆ 빨강

☆ 주황

☆ 노랑

☆ 초록

☆ 파랑

☆ 남색

☆ 보라

색연필($crayon)은 배열이다. 배열의 요소에 접근하기 위해서는 foreach문을 이용한다. foreach문은 주어진 배열($crayon)에 대해 순차적으로 반복(루프,loop)하면서 각 요소마다 접근한다. 그래서 for + each 이다. 각 루프에서 현재 배열 원소의 값은 변수 $color에 임시로 저장되고 내부적인 배열 포인터는 다음 요소로 이동하게 된다. foreach문이 처음 실행할 때, 내부적인 배열 포인터는 자동적으로 배열의 첫번째 원소를 가리킨다. 그리고 다음 루프에서 다음 배열 원소로 이동한다. 따라서 반복할 때마다 다음 배열 원소를 보게 되는 것이다.

foreach문은 반복 횟수를 결정하는 조건절이 없다. 배열의 요소 갯수가 반복 횟수가 되는 것이다. 좀더 쉽게 이야기하면 변수 $crayon이라는 아이가 있다. 이 아이는 색연필을 하나만 들고 있는 것이 아니라 여러개를 가방에 넣고 다닌다. 그래서 배열(array)이다. 가방속에 색연필이 몇개가 들어있는지 확인하려면 하나씩 하나씩(each) 꺼내보아야 한다. 몇번을 반복(for)해야 하냐면 가방속에 색연필이 없을때 까지이다. 따라서 배열을 확인하는 반복문은 foreach문으로 작성하고 반복 횟수는 자동으로 배열 요소의 갯수만큼이 된다.

이번에는 색연필($crayon)이 색 이름과 영어 이름의 배열로 이루어져 있다. 이때 각각의 색 이름을 반복문으로 출력해 보자.

foreach 루프형
<?php
$crayon = array(
   '빨강' => 'Red',
   '주황' => 'Orange',
   '노랑' => 'Yellow',
   '초록' => 'Green',
   '파랑' => 'Blue',
   '남색' => 'Navy',
   '보라' => 'Violet'
   );

foreach ($crayon as $key => $val) {
   echo '<p>☆ '.$key.' - '.$val.'</p>';
}
?>

결과값 :

☆ 빨강 - Red

☆ 주황 - Orange

☆ 노랑 - Yellow

☆ 초록 - Green

☆ 파랑 - Blue

☆ 남색 - Navy

☆ 보라 - Violet

색연필($crayon)의 배열 요소가 각각 키(key)와 값(value)을 갖고 있다. foreach문을 이용해 순차적으로 반복해서 루프를 돌 때 현재 배열 원소의 키(key)와 값(value)은 각 루프의 $key와 $val 변수에 나누어 임시 저장된다. 마찬가지로 배열의 요소 갯수가 반복 횟수가 된다.


2. XE 템플릿 구문에서의 반복문

반복문은 "foreach"와 "end"의 조건식으로 이루어져 있다. foreach문이 시작되면 반드시 end문으로 닫아서 반복문이 끝났음을 선언해야 한다. XE 템플릿 문법으로 작성된 반복문은 PHP문으로 변환하여 실행 된다. 따라서 위에서 살펴본 while, for, foreach문은 XE 템플릿 구문에서 동일하게 사용 된다.
다만, 앳 기호(@)가 포함된 주석문 <!--@ --> 안에 넣어 사용하기도 하고 block 가상 요소에서 loop 속성과 함께 사용하기도 한다. "loop"는 foreach문의 조건식을 표현할 때 사용하는 가상의 속성이다. 따라서 조건문(IF)에서 가상 속성으로 사용되는 cond 속성과 같은 방법으로 HTML 요소에서 사용하면 반복 횟수만큼 태그 요소와 얻은 값을 반복하여 출력할 수 있다.

위 반복문의 동작 원리를 이해하면 다음의 XE 템플릿 문법으로 작성된 메뉴얼 기본 예제도 쉽게 이해할 수 있을 것이다. XE 코어의 변수들은 대부분 배열 형태이고 키(key)와 값(value)을 가지고 있다. 반복 횟수 또한 그 배열이 가지고 있는 요소의 갯수가 된다.

[$key값 없이 사용하는 반복문]

<!--@foreach(변수명 as $val)-->  // $key값 없이 <tr>...</tr> 반복
   <tr>...</tr>
<!--@end--> 
<block loop="변수명=>$val">
   <tr>...</tr>
</block> 
<tr loop="변수명=>$val">...</tr>

[$key값 포함하여 사용하는 반복문]

<!--@foreach(변수명 as $key => $val)--> // $key값 포함 <tr>...</tr> 반복 
   <tr>...</tr>
<!--@end--> 
<block loop="변수명=>$key, $val">
   <tr>...</tr>
</block> 
<tr loop="변수명=>$key, $val">...</tr>

[반복 횟수 지정하여 사용하는 반복문]

<!--@foreach($i=0;$i<100;$i++)--> // 초기값 0부터 시작하여 <tr>...</tr> 100회 반복 
   <tr>...</tr>
<!--@end--> 
<block loop="$i=0;$i<100;$i++"> 
   <tr>...</tr>
</block> 
<tr loop="$i=0;$i<100;$i++">...</tr>

기본 레이아웃의 GNB 메뉴 구하기 반복문

 

xe.1.4.5.7/layouts/xe_official/layout.html
<div class="gnb">
  <ul>①
┌  <li loop="$main_menu->list=>$key1,$val1" class="active"|cond="$val1['selected']">②
│ⓐ     <a href="{$val1['href']}" target="_blank"|cond="$val1['open_window']=='Y'">{$val1['link']}</a>③
│        <ul cond="$val1['list']">④
│   ┌     <li loop="$val1['list']=>$key2,$val2" class="active"|cond="$val2['selected']">
│   │ⓑ      <a href="{$val2['href']}" target="_blank"|cond="$val2['open_window']=='Y'">{$val2['link']}</a>
│   └     </li>
│        </ul>
└  </li>
  </ul>
</div>

① <ul>은 반복문에 의해 생성되는 리스트(li) 항목을 가둬두는 싸개(wrapper) 역할을 한다.

② <li> 사용자가 생성한 메뉴트리는 $main_menu에 배열 형태로 담겨있다. 따라서 각 메뉴에 접근하려면 $main_menu->list 형식으로 요소에 접근하고, 현재 접근한 배열 원소의 값은 $key값을 포함하여 $key1 변수와 $val1 변수에 각각 임시 저장한다. 일단 ④번 <ul>이 없다고 생각해 보자. 배열 원소의 갯수만큼 <li>를 반복하는데 cond 조건이 하나 걸려있다. 이때 cond 는 파이프(pipe)를 이용해 클래스(class)와 연결되어 있다. <li>는 무조건 출력하지만 만약 현재 배열의 요소가 선택(selected) 되었다면 클래스를 추가한다는 뜻이다. 여기서의 선택이란, 메뉴트리에서 설정한 메뉴 항목의 이름과 연결 URL 즉 설정했던 모듈의 아이디(mid)가 같다는 뜻이다.

③ <li>가 반복되면서 $val1 임시 변수에 담겨진 해당 값(value)을 출력한다. 메뉴 항목의 이름이다. 배열의 요소에 접근하여 출력하기 위해 {$val1['link']}처럼 작성한다. 메뉴 항목의 이름을 클릭하면 설정된 모듈의 아이디(mid)로 이동하기 위해 {$val1['href']} 문으로 URL 링크를 만든다. 이때 cond 조건은 메뉴트리 설정에서 "새창열기"가 설정되어 있다면 새창을 열어서 보여줘야 한다는 의미이다. target 속성에만 제한된다. 따라서 메뉴항목의 이름은 무조건 출력된다. 2번에서 선택된 메뉴 항목의 이름이라면 CSS의 도움을 받아 선택 되었음을 알리는 스타일이 추가될 것이다.

④ 4번에서 <ul>의 cond 속성은 파이프형이 아니다. 따라서 조건에 따라 <ul>의 생사(?)가 결정된다. 조건의 내용은 이렇다. 2번 <li>를 반복할 때 $val1의 배열 요소 list에도 접근해 보자. 만약 list가 있다면, 이것은 "서브메뉴가 있다면?" 이란 뜻이다. 서브메뉴가 있다면 출력하고 없으면 <ul>과 함께 사라진다. 아주 무서운 조건이다. $val1['list'] 역시 배열 요소를 담고 있을 것이다. 이때 배열의 각 요소는 부모 요소와 구분하기 위해 각각 $key2과 $val2에 임시로 저장하는 것이다. ⓑ의 반복 내용은 ⓐ와 동일하다.

※ 이렇게 생성된 메뉴는 메뉴 항목(서브메뉴), 메뉴 항목(서브메뉴)... 식으로 반복 된다. 서브메뉴가 없는 메뉴는 항목만 출력될 것이다. 출력된 메뉴는 CSS 와 JS 스크립트(jQuery)의 도움을 받아 멋진 메뉴 UI로 변신하게 된다.

부운영자 부운영자
93 Lv. 785830/795240P

< 빌립보서 4장 13절>
내가 주 안에서 크게 기뻐함은 너희가 나를 생각하던 것이 이제 다시 싹이 남이니 너희가 또한 이를 위하여 생각은 하였으나 기회가 없었느니라 ! 내가 궁핍하므로 말하는 것이 아니니라! 어떠한 형편에든지 나는 자족하기를 배웠노니 나는 비천에 처할 줄도 알고 풍부에 처할 줄도 알아 모든 일 곧 배부름과 배고픔과 풍부와 궁핍에도 처할 줄 아는 일체의 비결을 배웠노라! 내게 능력 주시는 자 안에서 내가 모든 것을 할 수 있느니라 !

ReportShareScrap

Comment 0

Comment Write
WYSIWYG

Report

"님의 댓글"

Are you sure you want to report this comment?

Comment Delete

"님의 댓글"

I want to Are you sure you want to delete?

Share

Permalink
  • Module Admin Controller for Delete 모듈 삭제와 컨트롤러(Controller) 모듈(mid)의 삭제는 모듈의 고유 식별 번호($module_srl)을 확인하고 module 테이블에서 해당 식별 번호를 삭제하는 것으로 끝난다. 여기에서...
  • Module Admin Controller for Insert/Update 모듈 입력/수정과 컨트롤러(Controller) 예제로 만들고 있는 example 모듈에서 새로운 모듈(mid)을 추가하고 수정할 수 있는 액션과 그에 따른 진행 과정을 그린 설계도이...
  • 모듈 확장과 모델(Model) 관리자를 위한 백 엔드 뷰(View)가 실행되면 관리자-인덱스로 설정했던 dispExampleAdminList 액션이 작동하고 그 진행과정을 설명한 그림이다. 또한 앞으로 만들게 될 관리자 목록 보기를 ...
  • Front and back ends 프론트 엔드(front-end)와 백 엔드(back-end)는, 사용자가 접근하는 영역을 말하는데 이때 사용자는 사람이 아닌 프로그램이 될 수도 있다. 예를 들어 컴퓨터 OS의 그래픽 파일 관리자는 컴퓨터...
  • MVC 구조의 이해
    부운영자 Views 68 20.08.13.14:45
    Model-View-Controller XE Core는 모델-뷰-컨트롤러(Model-View-Controller) 개발 패턴에 기반한다. 이것을 줄여서 MVC 구조라고 말한다. 소프트웨어 공학에서 프로그램의 설계는 건축(architecture)과 같다. 시스템...
  • 폼(form)과 DB
    부운영자 Views 139 20.08.13.14:41
    Form & DB XE 모듈을 이해하기 위한 기초 과정으로 폼(form)의 동작 방식을 살펴보자. 모듈은 결론적으로 폼과 DB의 관계이다. 모듈은 자신이 관리하는 테이블을 한두개 이상 가지고 있고 이것을 다루기 위해 폼을 사...
  • XE의 URL 규칙
    부운영자 Views 94 20.08.13.14:40
    URLs on XE XE에서 생성한 URL 은 깔끔하고 검색엔진에서 색인되기 좋은 구조이다. XE는 일반적인 쿼리스트링 기반의 URL이 아니라 세그먼트 기반의 URL을 사용한다. 쿼리스트링(Query string) URL이란, 다음과 같이 ...
  • 모듈의 기본 이해
    부운영자 Views 26 20.08.13.14:37
    The Story of XE Modules XE코어의 모듈 이야기... 1. 백엔드 어드민(Admin) 뷰(View) 구현을 위한 example 모듈 만들기 2. 프론트 엔드 뷰(View) 구현을 위한 BOOK 모듈 만들기 3. v1.5 룰셋(ruleset)과 BOOKMARK 모...
  • XE 모듈
    부운영자 Views 19 20.08.13.14:35
    The Story of XE Modules XE코어의 모듈 이야기... 1. 백엔드 어드민(Admin) 뷰(View) 구현을 위한 example 모듈 만들기 2. 프론트 엔드 뷰(View) 구현을 위한 BOOK 모듈 만들기 3. v1.5 룰셋(ruleset)과 BOOKMARK 모...
  • 반복문 loop
    부운영자 Views 45 20.08.13.00:44
    XE Template Syntax 반복문 loop 주어진 조건에 따라 필요한 내용을 반복해서 출력해야 할 때 반복문(루프/loop)을 사용한다. 1. 반복문의 이해 반복문은 컴퓨터가 만들어지면서 가장 먼저 시도된 증조 할아버지뻘 되...
  • 조건문 IF
    부운영자 Views 38 20.08.13.00:42
    XE Template Syntax 주어진 조건에 따라 필요한 내용을 문맥에 알맞게 출력하거나 배제할 때 조건문을 사용한다. 1. IF 문 IF 조건문은 PHP의 IF 조건문과 동일하고 "if, elseif, else, end"와 "조건식"으로 이루어져...
  • 파일 포함 include
    부운영자 Views 64 20.08.13.00:41
    XE Template Syntax XE 템플릿 스킨의 HTML 문서 안으로 외부 파일을 불러와 포함시키기 위한 문법이다. 파일 포함 문법에서는 불러 들이고자 하는 외부 파일의 경로 설정을 상대 경로로 표시한다. 즉 HTML 문서의 자...
  • 기본 문법 default
    부운영자 Views 81 20.08.13.00:40
    XE Template Syntax 1. 변수 PHP에서 변수를 다루는 것과 동일한 방법으로 XE 템플릿 안에서 변수를 정의하고 출력할 수 있다. 변수를 나타내는 문자열 앞에는 달러($) 기호를 붙여 사용하며 변수명은 대소문자를 구...
  • XE 템플릿 문법의 이해
    XE Template Syntax 템플릿(template)이란 붕어빵을 만드는 틀로 비유된다. 같은 모양, 같은 크기의 객체(object)를 만들기 쉽다. 프로그래밍 언어에서 템플릿 구문은 초등학교 시절의 플라스틱 모형자를 생각하면 이...
  • logged_info
    부운영자 Views 118 20.08.13.00:37
    $logged_info XE에 접근하면 XE는 항상 방문자의 로그인 여부를 우선 먼저 확인하게 된다. 이때 사용하는 변수가 $is_logged 와 $logged_info 이다. Context.class.php 파일 137라인을 참고해 보면 member 모듈의 mem...
  • getUrl()
    부운영자 Views 157 20.08.13.00:34
    getUrl() XE 레이아웃에 많이 쓰이는 getUrl() 함수이다. "getUrl()은 현재 요청된 RequestURI에 주어진 인자의 값으로 변형하여 url을 리턴한다."고 설명되어 있다. 또한 인자는 (key, value)... 의 형식으로 주어져...
  • Context.class.php
    부운영자 Views 97 20.08.13.00:30
    요청 인자(request arguments), 환경 변수(environment variables)와 같은 모든 컨텍스트(Context)를 관리 Context::methodname()로 호출할 수도 있고 정적 객체로도 호출할 수 있는 사용하기 쉬운 이중 방식 구조를 ...
  • Object.class.php
    부운영자 Views 68 20.08.13.00:29
    XE 모듈 사이의 객체 인스턴스를 전달하는 기본 클래스(데이터를 주고 받기 위한 클래스) 모든 모듈은 객체(Object)를 상속한다. 객체(Object)의 error, message, variables 를 이용하여 통신을 하게 된다 Object 함...
  • 함수라이브러리 func.inc.php
    clone($object) iconv($in_charset, $out_charset, $str) &getModule($module_name, $type = 'view', $kind = '') &getController($module_name) &getAdminController($module_name) &getView($module_name) &getMobi...
  • 환경설정 config.inc.php
    XE의 버전 및 개발자용 디버깅 설정이 저장된 파일 XE가 기본적으로 사용하는 함수라이브러리 func.inc.php 파일과 클래스(class)파일을 시작페이지 index.php 파일로 가져간다 define('ZBXE_VERSION', '1.4.5.7'); X...