XpressEngine

[기초] XE구조의 비밀 그 아홉번째 - 위젯코드의 변신

XE 위젯은 별도의 소스코드없이 페이지를 간단하게 꾸밀 수 있게 하지요..

이 위젯개념이 없었다면 소스코드 짜거나 찾거나 해서 페이지를 꾸며야 겠지요..

예를 들어 로그인 위젯이 없었다면 어떻게 되었을까요?? (이부분을 각자 생각해보도록 합시다..)


이번에는 위젯이 어떠한 원리로 작동하는 지 살펴보도록 하겠습니다..

먼저 위젯은 위젯모듈(./modules/widget)에서 위젯의 모든것을 총괄하고 있습니다..


위젯기능을 간단하게 살펴보면..

위젯설정을 하게 되면, 아래와 같이 위젯코드라는 게 생성됩니다..


<img class="zbxe_widget_output" widget="content" skin="default" colorset="white" content_type="document" list_type="normal" tab_type="none" markup_type="table" page_count="1" option_view="title,regdate,nickname" show_browser_title="Y" show_comment_count="Y" show_trackback_count="Y" show_category="Y" show_icon="Y" order_target="regdate" order_type="desc" thumbnail_type="crop" />

  • 이 코드는 이미지태그가 아니라 위젯코드입니다..
  • 이 위젯코드는 XE페이지에서만 사용하겠지요.. (그래서 XE페이지 어디서나 위젯코드를 사용할 수 있습니다.)
  • XE화면 출력바로전 위젯코드는 실제코드로 변환됩니다.. (위젯모듈에서 'display' 트리거를 통해 출력직전 실제코드로 변환됩니다.)


위젯코드를 자세히 살펴보면 아래와 같습니다.

<img class="zbxe_widget_output" widget="위젯이름" skin="위젯스킨" colorset="스킨 컬러셋" 위젯설정사항 />


이 위젯코드가 실제 HTML 코드로 변환되는 형태로 위젯기능이 동작합니다.


위젯코드가 실제 HTML 코드로 변환 되는 과정!!

  1. 위젯코드를 분석합니다. (XmlParser 이용)
  2. 위젯의 클래스파일에서 "proc"함수를 실행시켜 위젯결과 HTML코드를 얻습니다. ("proc"함수 인자로 위젯설정을 받습니다.)
  3. 위젯스타일이 있으면 위젯결과 HTML코드와 합칩니다.
  4. 위젯코드를 최종 HTML 코드로 교체!

위젯은 어떻게 생겼나?
위젯을 보면 "위젯이름.class.php" 이란 클래스 파일이 존재합니다. (예: ./widgets/login_info/login_info.class.php)
위젯 클래스파일을 보면 아래와 같습니다. (아주 기본적인 형태입니다. 리턴값만 제대로 넘겨준다면 아래와 같은 형태로 안하셔도 됩니다.)

class 위젯이름 extends WidgetHandler{
	function proc($args){
		// 위젯스킨 설정
	 	$tpl_file = 'index';
		$tpl_path = sprintf('%sskins/%s', $this->widget_path, $args->skin);

		//컬러셋 지정
	 	Context::set('colorset', $args->colorset);

		// 템플릿 컴파일
 		$oTemplate = &TemplateHandler::getInstance();
	 	return $oTemplate->compile($tpl_path, $tpl_file);
		}
}

위젯코드는 proc함수의 리턴값으로 실제코드가 변경됩니다.
따라서 위 소스코드처럼 위젯 템플릿파일을 '$oTemplate->compile()'이용해 컴파일하여 리턴값으로 넘겨줘야 합니다..
그리고 proc함수의 인자로 위젯설정 값을 받을 수 있습니다.

정리하자면 " 위젯코드 -> 위젯이름.class.php의 proc함수 리턴값 " 으로 변경되는 형태입니다.
  • ?
    날아라 2014.03.22 18:44:34

    위젯의 상세한 작동원리를 알게되서 너무 좋습니다. 역시 최고의 강의입니다.
    다음강의가 벌써 기다려 지네요 항상 감사드리고 많이 배워 갑니다!

  • ?
    다이오니 2015.02.02 01:08:31
    흥미롭네요~
?