Skip to content
achimnol edited this page Oct 9, 2012 · 3 revisions

텍스트큐브 플러그인은 정확하게는 어떤 '이벤트'가 실행될 때, 그 이벤트에 해당하는 '핸들러'가 호출되어 동작하는 방식입니다. 다양한 종류의 이벤트가 존재하며, 이러한 이벤트를 얼마나 이해하는가가 텍스트큐브 플러그인의 확장성을 좌우합니다.

기본 개념

앞의 예제는 skin.html 안에 [##_HelloWorld_##]라는 치환자를 다른 문자열로 치환하는 경우였습니다. 이 경우 텍스트큐브 플러그인은 단순히 치환자를 다른 결과물로 바꾸는 것처럼 동작했습니다. 간단한 예제이지만 이 방식은 텍스트큐브가 지원하는 이벤트의 한 종류입니다.

텍스트큐브에서 미리 예약되지 않은 [##_임의의치환자_##]는 tag 이벤트를 발생시킵니다. 텍스트큐브에 붙일 수 있는 이벤트의 종류들은

  • tag - 스킨에 명시해 놓은 임의의 치환자가 해석되는 시점에서 실행됩니다.
  • listener/event - 텍스트큐브가 특정한 동작을 실행할 때 이벤트들이 실행됩니다. listener는 지정한 이벤트가 발생할 때 실행됩니다.
  • sidebar - 블로그의 사이드바에 위젯을 추가합니다.
  • coverpage - 블로그의 표지에 위젯을 추가합니다.
  • adminMenu - 관리자 모드에 새로운 메뉴를 추가합니다.
  • formatter - 글을 해석하는 포매터를 명시합니다.
  • editor - 글을 작성할 때 사용하는 에디터를 명시합니다.
  • config - 플러그인의 환경설정 패널 API를 사용합니다.

와 같이 다양합니다.

예제: Hello world!

그러면 플러그인 드라이버에서 예를 든 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

텍스트큐브에 기능을 더하기 위해서는 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()등을 사용해서 글의 전체적인 정보를 얻을 수도 있을 것입니다.

이벤트 목록

아래의 링크에서는 텍스트큐브가 지원하는 이벤트들의 목록을 열람할 수 있습니다. 이벤트는 수시로 갱신됩니다.

Clone this wiki locally