1

주제: 기본 : 플러그인 구조

tokigun님과 corgan님께 설명한 기억을 더듬어 아주 기본적인 구조에 대해서 설명해 보겠습니다.

주의 : 여기서의 기본은 'beginner' 가 아니라 'basics' 입니다. php나 태터툴즈에 대한 상당한 이해도가 있으신 분들께만 기본적으로 보인다는 전언이 있었습니다. 그러므로 모르겠다 싶으면 무조건 질문해주세요. smile


가장 기본적으로는 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로 불러올 수 있습니다. 여기까지가 플러그인의 '기본' 입니다. 간단한 플러그인부터 복잡한 플러그인까지 수많은 플러그인들이 나와 있으므로 간단해 보이는 것 부터 하나씩 소스를 뜯어보면 즐겁게 배울 수 있습니다. smile

"Everything looks different on the other side."

-Ian Malcomm, from Michael Crichton's 'The Jurassic Park'

2

답글: 기본 : 플러그인 구조

엔도라기?님의 태터툴즈 플러그인 이야기 http://tatterplugins.tistory.com/ 도  절찬리 연재중입니다 smile

lunamoth (2007-01-11 03:31:51)에 의해 마지막으로 수정

3

답글: 기본 : 플러그인 구조

저도 도와드리고 싶은 마음은 굴뚝같습니다. T_T

큰 도움은 안되겠으나 어쨌든 tattersite 위키에 설명은 달아보도록 노력하겠습니다.;;

덧. 개인적으로는 http://www.tattertools.com/ko/bbs/zboard.php?id=skinqna 이 곳과 비슷하게 플러그인 게시판이 있으면 어떨까라고 생각중입니다.
아이디어는 있으나 제작할 능력(?)은 안되는 분, 제작할 능력도 생각도 있는데 아이디어는 없는 분(;; ).
이런 분들을 엮어줄 수 있지 않을까도 내심 기대 중(...)

4

답글: 기본 : 플러그인 구조

Peris 작성:

저도 도와드리고 싶은 마음은 굴뚝같습니다. T_T

큰 도움은 안되겠으나 어쨌든 tattersite 위키에 설명은 달아보도록 노력하겠습니다.;;

덧. 개인적으로는 http://www.tattertools.com/ko/bbs/zboard.php?id=skinqna 이 곳과 비슷하게 플러그인 게시판이 있으면 어떨까라고 생각중입니다.
아이디어는 있으나 제작할 능력(?)은 안되는 분, 제작할 능력도 생각도 있는데 아이디어는 없는 분(;; ).
이런 분들을 엮어줄 수 있지 않을까도 내심 기대 중(...)

전부 결자해지의 문턱으로 ~_~

5

답글: 기본 : 플러그인 구조

Peris 작성:

저도 도와드리고 싶은 마음은 굴뚝같습니다. T_T

큰 도움은 안되겠으나 어쨌든 tattersite 위키에 설명은 달아보도록 노력하겠습니다.;;

덧. 개인적으로는 http://www.tattertools.com/ko/bbs/zboard.php?id=skinqna 이 곳과 비슷하게 플러그인 게시판이 있으면 어떨까라고 생각중입니다.
아이디어는 있으나 제작할 능력(?)은 안되는 분, 제작할 능력도 생각도 있는데 아이디어는 없는 분(;; ).
이런 분들을 엮어줄 수 있지 않을까도 내심 기대 중(...)

고거, 지금 고려중입니다.:)

6

답글: 기본 : 플러그인 구조

태터툴즈 플러그인 (!) 으로 metaBBS를 얹는 테스트를 하고 있습니다. (저 변태 아닙니다) 1.1.1 때문에 살짝 밀려있기는 하지만...
잘 되면 그걸 이용해서 플러그인 게시판 만들어도 재미있겠네요. smile

덧) 뭐랄까요, 그냥 아이디어가 생겨서 시도해보고 있는데, punBB를 태터툴즈 플러그인으로 만들기 등등도 가능하겠더라고요.

"Everything looks different on the other side."

-Ian Malcomm, from Michael Crichton's 'The Jurassic Park'

7

답글: 기본 : 플러그인 구조

Peris 작성:

저도 도와드리고 싶은 마음은 굴뚝같습니다. T_T

큰 도움은 안되겠으나 어쨌든 tattersite 위키에 설명은 달아보도록 노력하겠습니다.;;

덧. 개인적으로는 http://www.tattertools.com/ko/bbs/zboard.php?id=skinqna 이 곳과 비슷하게 플러그인 게시판이 있으면 어떨까라고 생각중입니다.
아이디어는 있으나 제작할 능력(?)은 안되는 분, 제작할 능력도 생각도 있는데 아이디어는 없는 분(;; ).
이런 분들을 엮어줄 수 있지 않을까도 내심 기대 중(...)

그런 과정을 포럼의 플러그인 섹션에서 진행하는 것도 괜찮을 것 같네요. smile

"Everything looks different on the other side."

-Ian Malcomm, from Michael Crichton's 'The Jurassic Park'

8

답글: 기본 : 플러그인 구조

더헉 tatterplugins.tistory.com 은 좀더 정리하고 오픈할 생각이었는데... ㅠㅠ 격무에 시달리느라 어제 그제 못썻습니다. ㅋㅎ 김에 혹시 팀블로깅 같이 하실분 없나요? 그라피티에님은 이미 영입 ( 근데 스킨만 고치실생각이신듯하고 ㅋㅋ)

9

답글: 기본 : 플러그인 구조

Peris 작성:

아이디어는 있으나 제작할 능력(?)은 안되는 분, 제작할 능력도 생각도 있는데 아이디어는 없는 분(;; ).
이런 분들을 엮어줄 수 있지 않을까도 내심 기대 중(...)

동감입니다. 각각의 플러그인 단위로 소그룹을 만들수 있게 되었으면 좋겠습니다. 마치 TNF 처럼 태터를 위해서 모여서 이것저것 아이디어내고(기획) 만들고(개발) ....  태터보다는 플러그인 제작 모임이 좀더 문턱이 낮고 이런 풀이 늘어나면 자연스레 TNF로 흡수가 되지 않을가 하는 생각이.. ㅋㅋ

10

답글: 기본 : 플러그인 구조

ghost_ghost 작성:
Peris 작성:

아이디어는 있으나 제작할 능력(?)은 안되는 분, 제작할 능력도 생각도 있는데 아이디어는 없는 분(;; ).
이런 분들을 엮어줄 수 있지 않을까도 내심 기대 중(...)

동감입니다. 각각의 플러그인 단위로 소그룹을 만들수 있게 되었으면 좋겠습니다. 마치 TNF 처럼 태터를 위해서 모여서 이것저것 아이디어내고(기획) 만들고(개발) ....  태터보다는 플러그인 제작 모임이 좀더 문턱이 낮고 이런 풀이 늘어나면 자연스레 TNF로 흡수가 되지 않을가 하는 생각이.. ㅋㅋ

플러그인 하나 당 하나의 포럼 글타래는 어떨까요? 이제 다운로드도 제공되니 한 글타래와 플러그인이 계속 업데이트 되는 것도 볼 수 있을듯? 합니다^^

"Everything looks different on the other side."

-Ian Malcomm, from Michael Crichton's 'The Jurassic Park'

11

답글: 기본 : 플러그인 구조

개인적으로는 TRAC이 맘에 듭니다... dev.tattersite.com 요거는 어떨가요?

12

답글: 기본 : 플러그인 구조

trac같은 경우는 trac을 새로 배워야되는 부담이 추가로 들기 때문에 기본 커뮤니케이션 창구가 되기는 힘들거라 생각합니다.
(물론 개발 용도로는 좋습니다만..)

국내의 경우 가장 보편화된게 제로보드 형태의 게시판이기 때문에 추천하는 것이고요.(포럼도 아직은..)
스킨쪽도 이러한 이유로 제로보드를 선택한걸로 기억합니다. smile

13

답글: 기본 : 플러그인 구조

ㅎㅎ 이럴때 다음 카페가 유용하긴 하죠 ... 공지와 개시판등 의외로 유용한 면이 있네요...

14

답글: 기본 : 플러그인 구조

<storage>에서 특정 필드의 형식이 auto_increment일때 설정할수 있는 방법이 없군요.
필드 체크 부분에서 <autoincrement>에 대한 체크도 필요할것 같습니다.
예)
기본값 없을때 : <autoincrement></autoincrement>
기본값 있을때 : <autoincrement>10</autoincrement>

이때 default 값의 '0'에 대한 대비도 해야겠지요~~

당신의 삶속에 매화꽃 향기처럼 늘 아름다운 향기로 가득하길...
# J.Parker

15

답글: 기본 : 플러그인 구조

보지욥 센드박스에서부터 ㅇㅎㅎㅎㅎ

16

답글: 기본 : 플러그인 구조

센드박스에 추가 했습니다. 기본 값은 default 가 있으니 거기서 처리 하면 될듯하고요...

mysql의 모든 인크리멘터블한것은 파악이 안되서 int 와 mediumint 만 지원하도록 햇구요 필드에 <autoincrement>1</autoincrement> 요거를 넣어주시면 ai가 맥여집니다. 단 ai는 하나만 지원합니다(아마 원래 그러죠?). 즉 맨처음 나오는 int ,mediumint 이며 <autoincrement>1</autoincrement> 가 존재하는 필드에 ai 가  적용됩니다. jparker님 ^^ 태스트 부탁드려요

17

답글: 기본 : 플러그인 구조

생성이 안됩니다. 샌드박스/1.1.1에도 적용해서 해봐도 이상하게 안되네요. ~~ 어떤 마법을~~
그리고, 차후 기존 storage에서 필드에 대한 추가/수정/삭제도 지원이 되었으면 하는 바램입니다.

당신의 삶속에 매화꽃 향기처럼 늘 아름다운 향기로 가득하길...
# J.Parker

18

답글: 기본 : 플러그인 구조

기존 storage 가 잇으면 지워주시구요 ^^:; 다시 한번 확인 부탁드려요...

그리고, 차후 기존 storage에서 필드에 대한 추가/수정/삭제도 지원이 되었으면 하는 바램입니다. 이것은 무지 많은 생각이... 필요할듯

19

답글: 기본 : 플러그인 구조

check up 을 플러그인에게도?