02. 위젯 개발하기(2009.08.18 11:22:52)

2020년 05월 09일

위젯의 동작이해

위젯은 페이지 모듈이나 관리자가 직접 입력한 레이아웃에 <img /> 저장됩니다. 위젯코드가 웹페이지 호출시에 Display Class 의 display.before 부분에서 trigger를 이용하여 widgetController::triggerWidgetCompile() 이 <img />로 저장된 코드가 해당 위젯의 proc()가 실행 됩니다. 이때 <img />의 attribute 값들이 해당 위젯의 Class의 member method proc()의 arguments로 전달되어 템플릿 코드가 html으로 변환되어 보여 지게 됩니다.

값을 받기 위한 extra_vars

위젯에도 관리자가 동적으로 추가하는 부분이 생기게 됩니다. 예를 들어 위젯 스킨은 white로 또는 black으로 타이틀의 색은 파란색으로, 또는 어떤 게시판, 이미지 출력시에는 가로 넓이가 몇 사이즈 등 입력해야할 항목이 있습니다. 이런 부분들에 대해 Widget의 conf/info.xml에서 <extra_vars>에 추가하면 자동으로 입력폼을 만들어 줍니다.

  • text
  • textarea
  • select
  • select-multi-order
  • mid
  • mid_list
  • menu

text/textarea

html의 <input="text"> 와 <textarea>로 생각하면 되는 타입니다.

1588954188569.jpeg

<var id="확장변수의 변수명">
<type>text</type>
<name xml:lang="ko">타이틀 이름</name>
<description xml:lang="ko">해당확장변수 설명</description>
</var>

select

1588954188477.jpeg

selectbox의 option을 위한 <options>가 추가 되어 있습니다.

<var id="확장변수의 변수명">
<type>select</type>
<name xml:lang="ko">타이틀 이름</name>
<description xml:lang="ko">해당확장변수 설명</description>

<options>
<value>선택1의 값</value>
<name xml:lang="ko">선택1의 출력될 이름</name>
    </options>

    <options>
<value>선택2의 값</value>
<name xml:lang="ko">선택2의 출력될 이름</name>
    </options>

</var>

select-multi-order

mutli select방식으로 다중 선택 및 순서를 받을 때 사용합니다.
<options>에 init atturibute 값이 true이면 초기값으로, default atturibute 값이 true이면 그 항목은 꼭 선택되어야 하는 항목입니다.

<var id="확장변수의 변수명">
<type>select-multi-order</type>
<name xml:lang="ko">타이틀 이름</name>

<options default="false" init="true">
<value>선택1의 값</value>
<name xml:lang="ko">선택1의 출력될 이름</name>
</options>
<options>
<value>선택2의 값</value>
<name xml:lang="ko">선택2의 출력될 이름</name>
</options>
<options init="true">
<value>선택3의 값</value>
<name xml:lang="ko">선택3의 출력될 이름</name>
</options>
</vars>

mid

특정 mid 하나를 받는 타입입니다.

<var id="확장변수의 변수명">
<type>mid</type>
<name xml:lang="ko">타이틀 이름</name>
<description xml:lang="ko">해당확장변수 설명</description>
</var>

module_srl_list

1588954188274.jpeg

content 위젯과 같이 어려 게시판 등을 선택할때 사용합니다. 특정 여러개의 module_srl를 받는 타입입니다.

<var id="확장변수의 변수명">
<type>module_srl_list</type>
<name xml:lang="ko">타이틀 이름</name>
<description xml:lang="ko">해당확장변수 설명</description>
</var>

menu

navigation 위젯과 같이 menu를 선택하기 위한 타입입니다.

<var id="확장변수의 변수명">
<type>menu</type>
<name xml:lang="ko">타이틀 이름</name>
<description xml:lang="ko">해당확장변수 설명</description>
</var>

위젯 class 규칙

WidgetHandler를 상속하는 위젯명으로 class를 선언합니다. member method proc를 만들고 proc의 argument는 extra_vars로 설정된 값들이 stdClass로 들어오게 됩니다. 예를 들어에서 info.xml에 <extra_vars>에 지정한 값이 selected_module_srl와 extra_vars_list 는 각각 $args->selected_module_srl과 $args->extra_vars_list로 들어옵니다. 그리고 스킨(skin)값도 들어오게 됩니다.

또 proc의 return은 template 핸들러로 템플릿을 컴파일하여 html를 string으로 리턴하면 됩니다.

<?
class 위젯명 extends WidgetHandler{
function proc($args){


             .. 위젯 구현 ..


             // 템플릿의 스킨 경로를 지정 (skin, colorset에 따른 값을 설정)
$tpl_path = sprintf('%sskins/%s', $this->widget_path, $args->skin);
Context::set('colorset', $args->colorset);

             // 템플릿 파일명
 $tpl_file = 'html확장자를 제외한 템플릿 파일명';

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

}
}
?>