Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
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

AltStyle によって変換されたページ (->オリジナル) /