주제: 기본 : 플러그인 구조
tokigun님과 corgan님께 설명한 기억을 더듬어 아주 기본적인 구조에 대해서 설명해 보겠습니다.
주의 : 여기서의 기본은 'beginner' 가 아니라 'basics' 입니다. php나 태터툴즈에 대한 상당한 이해도가 있으신 분들께만 기본적으로 보인다는 전언이 있었습니다. 그러므로 모르겠다 싶으면 무조건 질문해주세요.
가장 기본적으로는 http://help.tattertools.com/ko/Plugin_Tutorial 문서를 보시면 됩니다. 하지만 기본적으로 내장되어 있는 플러그인들의 소스를 보는 것을 추천합니다. 좀 여러가지 플러그인을 보고 싶으시면 http://dev.tattersite.com/svn/plugins 를 export해서 보시면 됩니다. J.Parker님이나 그라피티에님, 치리님, 저에 의해서 좀 거하게 응용된 플러그인들이 많이 있습니다.
가장 간단한 TattertoolsBirthday 를 봅시다. 플러그인에 대한 메타 정보와 환경설정 부분에 대한 것은 전부 index.xml에 들어가고, 거기서 어느 이벤트 핸들러가 호출될 때 작동하는지 명기해줍니다. index.php에는 해당 호출시 불러지는 함수가 들어있습니다.
1.1 이후부터 플러그인이 가질 수 있는 설정 및 데이터 저장 방법은 두가지가 있습니다. 하나는 그냥 단순한 설정값으로
http://dev.tattersite.com/svn/plugins/J … /index.xml
<?xml version="1.0" encoding="utf-8"?>
<plugin version="1.0">
<title>긴 링크 짧게 표시</title>
<version>3.11</version>
<description>엔트리 본문과 댓글의 긴 링크 주소를 짧게 표시해줍니다.</description>
<license>J. Parker</license>
<link>http://www.create74.com</link>
<author link="http://www.create74.com"><![CDATA[J. Parker]]></author>
<safety changeData="no" exposeData="no" accessLocal="no" accessRemote="no" accessRaw="no" />
<requirements>
<tattertools>1.1</tattertools>
</requirements>
<binding>
<listener event="ViewPostContent">LongToShortLink_showShortLinks</listener>
<listener event="ViewNoticeContent">LongToShortLink_showShortLinks</listener>
<listener event="ViewCommentContent">LongToShortLink_showShortLinks</listener>
<listener event="ViewGuestCommentContent">LongToShortLink_showShortLinks</listener>
<config dataValHandler = "LongToShortLink_DataSet">
<window width="500" height="386" />
<fieldset legend="URL 길이 체크">
<field title="체크할 URL 길이(숫자)" name="checkURL" type="text" size="4" titledirection="bk" value="55">
<caption><![CDATA[<b>tip:</b> 이 값보다 큰 URL 을 자릅니다.]]></caption>
</field>
<field title="...의 왼쪽에 나타낼 URL 길이(숫자)" name="leftURL" type="text" size="4" titledirection="bk" value="39">
<caption><![CDATA[<b>tip:</b> ... 표시의 왼쪽에 나타날 길이를 정합니다.]]></caption>
</field>
<field title="...의 오른쪽에 나타낼 URL의 길이(숫자)" name="rightURL" type="text" size="4" titledirection="bk" value="8">
<caption><![CDATA[<b>tip:</b> ... 표시의 오른쪽에 나타날 길이를 정합니다.]]></caption>
</field>
</fieldset>
</config>
</binding>
</plugin>
이 예시처럼 config 부분에서 이름을 정의해 주고 그걸 불러쓰면 됩니다. 플러그인의 설정값이 '원하는' 값인지의 체크는 index.xml 에서 지정한 dataValHandler 함수에 값을 넘겨주니 index.php 안에 테스트 함수를 만들면 됩니다. xml에 저렇게 정의해주시면 환경설정을 위한 메뉴는 자동으로 생성됩니다.
다른 하나의 방법으로 플러그인이 고유의 테이블을 만들어 가질 수 있습니다. 이 경우는 플러그인이 설정을 넘어서서 고유한 데이터들을 저장해야 하는 경우에 쓰입니다.
예를 들면
http://dev.tattertools.com/browser/bran … /index.xml
...
<storage>
<table>
<name>SubscriptionLogs</name>
<fields>
<field>
<name>ip</name>
<attribute>int</attribute>
<length>11</length>
</field>
<field>
<name>host</name>
<attribute>varchar</attribute>
<length>24</length>
</field>
<field>
<name>useragent</name>
<attribute>varchar</attribute>
<length>128</length>
</field>
<field>
<name>referred</name>
<attribute>int</attribute>
<length>11</length>
<default>0</default>
</field>
</fields>
<key>useragent</key>
</table>
...
의 storage 아래에 정의된 대로 태터툴즈가 테이블을 생성합니다. 태터툴즈는 테이블을 생성하면서 사용자 구분에 쓰이는 인덱스인 owner 를 키 지정과 함께 테이블에 추가합니다. 생성은 플러그인이 켜지는 순간 태터툴즈가 해 줍니다. 테이블의 삭제는 블로그의 관리자만 플러그인 메뉴에서 할 수 있습니다.
플러그인이 바인드 될 수 있는 요소는 UI적으로는 크게 블로그 화면에 관계된 부분, 센터 플러그인 패널 부분, 플러그인이 만드는 관리자 플러그인 탭 이렇게 세가지가 있습니다. 앞의 경우는 이벤트 드리븐입니다. 예를 들어 <listener event="ViewPost">MarkFace</listener> 이런 식으로 명기하면 해당 이벤트가 발생할 때 index.php의 function MarkFace가 동작하게 되는 식입니다. 뒤의 두가지는 자신의 고유한 출력을 만드는 식으로 독립적으로 작동합니다.
이벤트에는 두가지 종류가 있습니다. specific event와 meta event가 있습니다. specific event는 해당 이벤트가 발생하는 '경우'를 의미하고 meta event는 이벤트가 발생하는 '위치'를 의미합니다. ViewPost 는 specific event이고, SKIN_head_start 나 sidebar 이벤트는 meta event가 되겠죠. 아직 갈 길이 멀지만, 1.1까지의 이벤트 이름은 http://tattersite.com/wiki/Spec:Event 에서 확인하실 수 있습니다. (문서화 해야 하는데 시간이 ㅠ_ㅠ peris님 도와주세요 흑)
디비 접근이나 원하는 부분 불러오거나 하는 부분은 전부 추상화 되어 있습니다. 이를 위해서 플러그인은 태터툴즈 컴포넌트를 사용합니다. 사용할 컴포넌트는 requireComponent로 불러올 수 있습니다. 여기까지가 플러그인의 '기본' 입니다. 간단한 플러그인부터 복잡한 플러그인까지 수많은 플러그인들이 나와 있으므로 간단해 보이는 것 부터 하나씩 소스를 뜯어보면 즐겁게 배울 수 있습니다. ![]()
-Ian Malcomm, from Michael Crichton's 'The Jurassic Park'