-
Notifications
You must be signed in to change notification settings - Fork 55
PluginEvent
텍스트큐브 플러그인은 정확하게는 어떤 '이벤트'가 실행될 때, 그 이벤트에 해당하는 '핸들러'가 호출되어 동작하는 방식입니다. 다양한 종류의 이벤트가 존재하며, 이러한 이벤트를 얼마나 이해하는가가 텍스트큐브 플러그인의 확장성을 좌우합니다.
앞의 예제는 skin.html 안에 [##_HelloWorld_##]
라는 치환자를 다른 문자열로 치환하는 경우였습니다. 이 경우 텍스트큐브 플러그인은 단순히 치환자를 다른 결과물로 바꾸는 것처럼 동작했습니다. 간단한 예제이지만 이 방식은 텍스트큐브가 지원하는 이벤트의 한 종류입니다.
텍스트큐브에서 미리 예약되지 않은 [##_임의의치환자_##]
는 tag 이벤트를 발생시킵니다. 텍스트큐브에 붙일 수 있는 이벤트의 종류들은
- tag - 스킨에 명시해 놓은 임의의 치환자가 해석되는 시점에서 실행됩니다.
- listener/event - 텍스트큐브가 특정한 동작을 실행할 때 이벤트들이 실행됩니다. listener는 지정한 이벤트가 발생할 때 실행됩니다.
- sidebar - 블로그의 사이드바에 위젯을 추가합니다.
- coverpage - 블로그의 표지에 위젯을 추가합니다.
- adminMenu - 관리자 모드에 새로운 메뉴를 추가합니다.
- formatter - 글을 해석하는 포매터를 명시합니다.
- editor - 글을 작성할 때 사용하는 에디터를 명시합니다.
- config - 플러그인의 환경설정 패널 API를 사용합니다.
와 같이 다양합니다.
그러면 플러그인 드라이버에서 예를 든 Hello world! 플러그인의 index.xml과 index.php를 간단하게 확장해 보겠습니다.
<?xml version="1.0" encoding="utf-8"?>
<plugin version="1.0">
<title xml:lang="ko">안녕 세상아! (기본)</title>
<link>http://www.example.com/</link>
<version>1.0</version>
<description xml:lang="ko">여기저기에 Hello world!를 출력해보는 예제 플러그인입니다.</description>
<license>GPL</license>
<author xml:lang="ko" link="http://www.example.com">슈퍼맨</author>
<safety changeData="no" exposeData="no" accessLocal="no" accessRemote="no" accessRaw="no" />
<requirements>
<textcube>1.5</textcube>
</requirements>
<binding>
<tag name="HelloWorld" handler="Helloworld_Show" />
</binding>
</plugin>
이 예제에서 보면 <binding>
사이에 "<tag
"로 시작하는 줄이 있는 것을 볼 수 있습니다. <binding>
안의 줄들은 플러그인의 특정 함수(핸들러)와 텍스트큐브를 묶는 역할을 합니다.
위의 예제에서는 [##_HelloWorld_##]
라는 스킨 태그에 function Helloworld_Show($target)
라는 함수가 실행되도록 (핸들러) 묶었습니다.
위의 예제에서 tag 를 중복 바인딩해 봅시다. Helloworld_Show2
라는 핸들러를 추가하고, 같은 이름의 함수를 index.php에 집어 넣어 봅시다.
<binding>
<tag name="HelloWorld" handler="Helloworld_Show" />
<tag name="HelloWorld" handler="Helloworld_Show2" />
</binding>
<?php
function Helloworld_Show($target) {
return $target.'Hello World!';
}
function Helloworld_Show2($target) {
return $target.' Hello World~~!';
}
?>
결과물로는 스킨의 [##_HelloWorld_##]
가 있던 자리에
Hello World! Hello World~~!
또는
Hello World~~!Hello World!
가 출력될 것입니다. 하나의 이벤트에 연결된 플러그인의 핸들러 실행 순서는 임의로 지정되므로, 순서에 상관 없도록 제작하여야 합니다.
그러면 위의 플러그인을 수정해 보도록 하겠습니다. 임의로 Helloworld_Show()
, Helloworld_Show2()
의 순서로 실행되는 것을 가정하겠습니다. (일반적으로 텍스트큐브 이벤트 핸들러들은 이름의 오름차순으로 정렬되어 실행됩니다.)
<?php
function Helloworld_Show($target) {
return $target.'Hello World!';
}
function Helloworld_Show2($target) {
return ' Hello World~~!';
}
?>
Helloworld_Show2()
에서 $target
을 지웠습니다. 실행해보면
Hello World~~!
가 출력될 것입니다. 핸들러들은 이벤트의 결과들을 상속받기 때문에, 위와같이 상속 처리를 해주지 않으면 다른 플러그인의 결과에 영향을 줄 수 있습니다. 그래서 아무것도 하지 않더라도 그 값을 리턴해야 합니다.
텍스트큐브에 기능을 더하기 위해서는 listener를 이벤트에 등록하는 방식이 가장 표준적입니다. 스킨에서 위치만 지정할 수 있는 tag와는 달리, 이벤트가 발생하면 해당 이벤트에 붙인 핸들러로 참조할 수 있는 값과 현재의 결과값을 함께 보내주기 때문입니다.
예를 들면, 글을 출력해주는 ViewPostContent 이벤트의 경우, 이벤트가 발생할 때 현재의 글 번호와 출력될 글의 내용을 플러그인의 핸들러로 보내줍니다.
<binding>
<listener event="ViewPostContent" handler="Helloworld_Show" />
</binding>
와 같이, Helloworld_Show()
함수를 ViewPostContent 이벤트의 핸들러로 붙일 수 있습니다.
tag 이벤트를 통한 경우와 달리, listener를 통한 이벤트는 두개의 값을 주고 받습니다. 예를 들어, 위의 ViewPostContent가 정상적으로 동작하기 위해서는
<?php
function Helloworld_Show($mother, $target) {
return $target.'Hello World!';
}
?>
와 같이 두개의 인자를 받습니다. $mother
와 $target
을 받는 것에 유의하세요.
$mother
는 이벤트를 처리하는 핸들러에서 참조할 수 있는 값들을 담고 있습니다. $target
은 이 이벤트의 결과로 만들어진 출력 (또는 결과) 코드입니다. tag에 기반한 이벤트와 같이 상속을 반드시 해 주어야 합니다. 위의 플러그인을 예로 들면, Helloworld_Show()
가 실행되는 순간 넘어오는 $mother
에는 글의 id가, $target
에는 현재 뿌려줄 글 내용이 들어 있습니다.
제목: '테스트용 글', 글 내용: '가나다라마바사' 라는 글을 썼다고 가정해 봅시다. 이 경우 블로그에서 글이 출력되는 시점에 ViewPostContent 이벤트가 발생하고, 바로 Helloworld_Show()
함수가 실행됩니다. 글 번호가 3번이라면 $mother
에는 3이, $target
에는 "가나다라마바사"가 들어 있을 것입니다. Helloworld_Show()
를 거쳐 최종적으로 출력되는 블로그의 글은 "가나다라마바사 Hello World!" 라고 적혀 있게 됩니다. 만약 더 많은 글의 정보를 참조하고 싶다면, $mother
에 들어있는 글의 id를 참조하여 getEntry()
등을 사용해서 글의 전체적인 정보를 얻을 수도 있을 것입니다.
아래의 링크에서는 텍스트큐브가 지원하는 이벤트들의 목록을 열람할 수 있습니다. 이벤트는 수시로 갱신됩니다.
- Source | Wiki Front | Main | Notice