'테터툴즈 플러그인'에 대한 글 검색 결과 1개search result for posts

페이지 이동< 1 >

테터툴즈용 플러그인을 만들자...(입문자용)

먼저 이 글을 작성 하기전에 PHP와 MySQL을 기본적인 지식은 있다는 가정하에 작성 하겠습니다. 고수분들은 우스운 이야기겠지만 제가 못찾아서 그런지 기본적인 자료조차 없더군요.

자 이제 부터 시작하겠습니다. 플러그인에 필요한 기본적인 파일은 두개입니다.
index.xml과 index.php 이 두개의 파일로 기본적으로 만들 수 있습니다.

먼저 index.xml을 먼저 보겠습니다.


index.xml (Language : xml)
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <plugin version="1.0">
  3.     <title>최근 인기글</title>
  4.     <link>http://www.withdev.com</link>
  5.     <version>0.1</version>
  6.     <description>본문 하단에 설정된 기간내에 설정된 갯수 만큼 인기글을 보여준다.[##_HotPostView_##]</description>
  7.     <license>GPL</license>
  8.     <author link="http://www.withdev.com"><![CDATA[낚시광준초리]]></author>
  9.     <safety changeData="no" exposeData="no" accessLocal="no" accessRemote="no" accessRaw="no" />
  10.     <requirements>
  11.         <tattertools>1.1</tattertools>
  12.     </requirements>
  13.     <binding>
  14.         <listener event="ViewPostContent">fn_HotPostView</listener>
  15.         <listener event="AddPost">fn_choriAddPost</listener>
  16.         <listener event="AddComment">fn_choriAddComment</listener>
  17.         <config dataValHandler="chorihotPostviewCfg">
  18.             <window width="300" height="250" />
  19.             <fieldset legend="HotTopic Display 설정" >
  20.                 <field title="기간설정(주 단위) :" name="choriHotPostWeek" type="text" size="5" value="2" />
  21.                 <field title="표시글수 :" name="choriHotPostLine" type="text" size="5" value="5" />
  22.                 <field title="댓글점수 :" name="choriCommentPoint" type="text" size="5" value="3" />
  23.             </fieldset>
  24.         </config>
  25.     </binding>
  26.     <storage>
  27.         <table>
  28.             <name>EntriesCount</name>
  29.             <fields>
  30.                 <field>
  31.                     <name>id</name>
  32.                     <attribute>int</attribute>
  33.                     <length>11</length>
  34.                 </field>
  35.                 <field>
  36.                     <name>HitCount</name>
  37.                     <attribute>int</attribute>
  38.                     <length>11</length>
  39.                     <default>0</default>
  40.                 </field>
  41.             </fields>
  42.             <key>id</key>
  43.         </table>
  44.     </storage>
  45. </plugin>
  46.  

1라인은 이 파일은 xml 포맷이고 UTF-8로 작동 한다는 표시입니다. UTF-8일 시에는 반드시 저장을 UTF-8로 하되 BOM이 없는 것으로 저장 하시면 됩니다. BOM이 있으면 브라우져는 UTF-8로 인식을 못합니다.

2번 라인부터 12번 라인까지는 설정 화면입니다. 설명 및 라이센스 정보 제작자 정보등을 알려 주지요

13번 라인을 보시면 binding 부분이 있습니다. 이부분은 index.php에 정의되어 있는 이벤트 핸들 함수와 실제 테터에서 발생하는 이벤트에 대해서 mapping 시켜 주신다고 보시면 됩니다. 이벤트와 맵핑 되는 함수 설정은 <listener> 부분입니다. 여기서는 포스트가 보일때<ViewPostContent>이벤트이고 AddPost 이벤트는 포스트를 등록할때 AddComment는 커멘트가 등록 될때 발생 되는 이벤트입니다. 이 이벤트들이 발생할때 fn_으로 시작하는 함수를 실행 시키겠다는 거지요.(이벤트 정의는 포럼 에 있습니다.) 여기에는 존재 하지 않지만 <tag>를 언급 하자면 <listener>에 정의된 함수에서 치환자를 대신 하여 출력 해주지만 이벤트 없이 항상 치환자 대신 보여 줄때는 <tag>를 써서 함수를 정의 하고 치화자명을 정해 주면 치환자가 화면에 나올시 바로 정의된 함수를 실행하게 됩니다.

그리고 17번째 라인에 <Config>는 등록해도 되고 안해도 되는데 이 <Config>필드는 플러그인 실행 했을때 설정화면을 정의 하는 함수를 나타내는 것입니다.
18번째 라인부터 23번째 라인까지 설정 화면에 어떻게 보여 줄건지 그리고 설정된 변수명을 어떻게 지정할 건지 타입을 어떻게 지정할 건지를 알려 주는겁니다.

그리고 최근 버전에 추가된것으로 알고 있는데요 <storage>부분입니다. 사용자가 임의 테이블을 생성 할때 <storage>세션에 등록된 테이블 형식으로 자동으로 생성 됩니다. 필드타입까지 정의 가능합니다. 주의 할것은 이렇게 하면 내가 정의 하지 않은 owner 필드가 프라이머리 키로 생성 됩니다. 아마 팀 블러깅때문에 자동으로 넣었는 것 같습니다.

자 index.xml을 간단히 설명 했습니다. 이제 index.php를 보겠습니다.


index.php (Language : php)
  1. <?
  2. function chorihotPostviewCfg($data)
  3. {
  4.     requireComponent('Tattertools.Function.misc');
  5.     $cfg = misc::fetchConfigVal($data);
  6.     return true;
  7. }
  8.  
  9. function CheckInit()
  10. {
  11.     global $database, $owner;
  12.    
  13.     $rowcount = mysql_query ("select COUNT(id) from {$database['prefix']}EntriesCount");
  14.     if(!$rowcount || !($resultcount = mysql_fetch_row ($rowcount)) || $resultcount[0] == 0)
  15.     {
  16.         $row = mysql_query ("select MAX(id) from {$database['prefix']}Entries");
  17.         $result = mysql_fetch_row ($row);
  18.         for($i = 1; $i <= $result[0]; $i++)
  19.         {
  20.             mysql_query ("insert into {$database['prefix']}EntriesCount values ({$owner}, $i, 0)");
  21.         }
  22.     }
  23. }
  24.  
  25. function fn_HotPostview($target, $mother)
  26. {
  27.     global $database, $owner, $configVal, $entryView, $blog, $defaultURL;
  28.     requireComponent('Tattertools.Function.misc');
  29.  
  30.     $data = misc::fetchConfigVal($configVal);
  31.    
  32.     CheckInit();
  33.    
  34.     $entryid = $mother;
  35.     if(!mysql_query ("update {$database['prefix']}EntriesCount set HitCount = HitCount + 1 where id = $entryid"))
  36.     {
  37.         mysql_query ("insert into {$database['prefix']}EntriesCount values ({$owner}, {$entryid}, 1");
  38.     }
  39.    
  40.     if(is_null ($data))
  41.     {
  42.         $data['choriHotPostWeek'] = 2;
  43.         $data['choriHotPostLine'] = 5;
  44.         $data['choriCommentPoint'] = 3;
  45.     }
  46.    
  47.     $hotPostLine = $data['choriHotPostLine'];
  48.     $hotPostLimitTime = $data['choriHotPostWeek'] * 7 * 24 * 60 * 60;
  49.   $row = mysql_query ("select e.ID, e.TITLE, e.SLOGAN, c.HitCount from {$database['prefix']}Entries e, {$database['prefix']}EntriesCount c where c.id = e.id and e.OWNER = {$owner} and e.VISIBILITY <> 0 and e.created >= UNIX_TIMESTAMP() - {$hotPostLimitTime} order by c.HitCount DESC LIMIT 0, {$hotPostLine}");
  50.  
  51.                                            
  52.     $hotPostWeek = $data['choriHotPostWeek'];
  53.  
  54.     $HotPostviewCode .= "<FIElDSET style='padding:3px;text-align:left'><LEGEND>{$hotPostWeek}주간 인기글</LEGEND>";
  55.  
  56.     while($result = mysql_fetch_row ($row))
  57.     {
  58.         $posttitle = $result[1];
  59.         $postLink = ($blog['useSlogan'] ? "entry/{$result[2]}" : $result[0]);
  60.         $HotPostviewCode .= '                    <li><a href='. $defaultURL . '/' . $postLink .'>' . $posttitle . '</a>(HitPoint : ' . $result[3] . 'point)</li>';
  61.     }
  62.    
  63.     if(is_null ($posttitle))
  64.     {
  65.         $HotPostviewCode .= $hotPostWeek . '주간 인기글이 없습니다.';
  66.     }
  67.     $HotPostviewCode .= '</FIElDSET>';
  68.     misc::dress('HotPostView', $HotPostviewCode, $entryView);
  69.  
  70. //  misc::dress('HotPostView', 'TEST', $entryView);
  71.  
  72.   return $target;
  73. }
  74.  
  75. function fn_choriAddPost($target, $mother)
  76. {
  77.     global $database, $owner;
  78.     $entryid = $target;
  79.    
  80.     mysql_query ("insert into {$database['prefix']}EntriesCount values ({$owner}, {$entryid}, 0)");
  81.    
  82.     return $target;
  83. }
  84.  
  85. function fn_choriAddComment($target, $mother)
  86. {
  87.     global $database;
  88.     $entryid = $target;
  89.     requireComponent('Tattertools.Function.misc');
  90.     $data = misc::fetchConfigVal($configVal);
  91.     if(is_null ($data))
  92.     {
  93.         $data['choriHotPostWeek'] = 2;
  94.         $data['choriHotPostLine'] = 5;
  95.         $data['choriCommentPoint'] = 3;
  96.     }
  97.    
  98.     $hotPostPoint = $data['choriCommentPoint'];
  99.     mysql_query ("update {$database['prefix']}EntriesCount set HitCount = HitCount + $hotPostPoint where id = '$entryid'");
  100.    
  101.     return $target;
  102. }
  103. ?>
  104.  

앞에 index.xml에서 <listener>에서 정의된 함수들을 정의 해놓은것을 보실 수 있을 겁니다.
이 코드는 Entries 테이블(이 테이블은 포스팅 내용을 담고 있는 테이블입니다.) 참조 하여  제가 만든 EntriesCode 테이블에 카운팅을 하는 것입니다.

자 그런데 테터툴즈와 내가 세팅 한 것을 어떻게 연동 하느냐가 관건입니다. 테터에서 제공 하는 함수 몇개를 보겠습니다.(사실 저도 한참 모릅니다.)


(Language : php)
  1. requireComponent('Tattertools.Function.misc');
  2. $cfg = misc::fetchConfigVal($data);


설정 부분을 보시면 이렇게 함수를 통해서 테터툴즈의 펑션을 사용 할 수 있습니다. misc를 통해서 설정값을 저장 할 수 있습니다. 그럼 <tag>와 틀리 이벤트 함수들은 어떻게 치환자로 디스플레이 해줄 것이냐... 다음 코드를 보시면 답이 있습니다.


(Language : php)
  1. global $database, $owner, $configVal, $entryView, $blog, $defaultURL;
  2. requireComponent('Tattertools.Function.misc');
  3. $data = misc::fetchConfigVal($configVal);
  4. // 처리를 한다..
  5. // HTML 코드를 생성한다.
  6. misc::dress('HotPostView', $HotPostviewCode, $entryView);
  7. // 제일 앞쪽에 변수가 치환자 명입니다. 두번째가 디스플레이 할 코드구요 세번째는 글로벌 변수 를 정의합니다.


자 코드를 보시면 간단하게 주석 처리 하였습니다. 자 그럼 글로벌 변수는 어디에 정의 되느냐? 이것 또한 포럼 에 정의 되어 있습니다. 그리고 이벤트 함수 에는 항상 return을 $target으로 해주어야 합니다. 자 지금까지 알고 있는것을 말씀 드렸구요. 한가지 더 주의 사항을 한다면 변수명이나 함수명을 만들때 자기의 이니셜을 포함 시키던가 하여 다른 플러그인과 중복 정의 되게 하지 마시기 바랍니다. 플러그인 사이에 충돌이 발생합니다.

그냥 간단하게 공지 같은것을 포스트 제일 하단부에나 제일 상단부분에 넣을 수 있겠지요? 음 추후 한번 만들어 봐야겠습니다 ^^*(음 갑자기 생각났는데 괜찬겠네요 ㅎㅎㅎ, 뭐 랜덤명언 출력 하는 방식으로 말이죠 ^^*)
아 그리고 반드시 UTF-8일때는 xml과 동일 하게 저장 하셔야 합니다.

일단 지금까지 제가 간단히 그동안 플러그인 만들면서 공부한 지식의 전부입니다. 아직 저도 PHP는 초보이고(전 그간 C/S개발자로 C만 사용했습니다.) 해서 많은 것을 알지는 모르지만 앞으로 하나씩 알때 마다 추가 포스팅 하겠습니다.

2007년 04월 08일 13시 15분 2007년 04월 08일 13시 15분
블로그코리아에 블UP하기
카테고리의 다른 글 - WEB
이 글의 관련글
4주간 인기글
  • 4주간 인기글이 없습니다.
오늘 올라온 글
  • 오늘 올라온 글이 없습니다.
댓글 단 사람 BEST 5

트랙백 주소http://www.withdev.com/trackback/152
  • daewonyoon2007년 04월 06일 23시 03분 수정/삭제 댓글주소 댓글달기
    소스의 압박(xml, php, mysql이라니!) 때문에 읽기는 어려웠지만, 멋져요.
  • 아르2007년 04월 07일 03시 42분 수정/삭제 댓글주소 댓글달기
    이올린에서 타이틀만 보고 클릭해서 읽다가 '아 괜찮은 가이드다'
    하고 -_-; 다음에 다시 와서 또 봐야겠다 싶어서 즐겨찾기 추가했더니

    '낚시광준초리의 Blog 세상' 이 뜨길래 잠시 당황(...)
  • =_=;2007년 04월 07일 08시 44분 수정/삭제 댓글주소 댓글달기
    한글을 좀 제대로 써주시면 안되겠습니까. '테'터툴즈라고 하다 못해 이젠 테트툴즈입니까. '태터툴즈'라고 똑바로 써주세요. 어떻게 읽어도 상관없는거 아니냐고 하신다면, 낚시광준초리가 아니라 낚시에미친줜차리 라고 불러도 상관없는거죠?
    • 낚시광준초리2007년 04월 08일 13시 13분 수정/삭제 댓글주소
      음음.. 원래 제가 좀 오타쟁이입니다.. 오타체크해주는건 감사합니다만.. 익명이라는게 못내 아쉽네요..
    • 아르2007년 04월 09일 08시 56분 수정/삭제 댓글주소
      이런 어린애들 댓글에 그렇게 진지하게 답변하실 필욘 없지요...; 함부로 남의 닉네임 가지고 장난치면서 되도 않는 헛소리를 하며 욕을 하다니... ''; 저렇게 계속 설치다가 언젠간 된통 한 방 맞고 정신차리겠지요.
    • 낚시광준초리2007년 04월 09일 09시 04분 수정/삭제 댓글주소
      아르님 흥분 하지 마세요 ㅎㅎㅎㅎㅎ 열내시면 건강에 안좋아요 ^^* 제가 알아서 할께요 ㅎㅎㅎㅎ
    • 민서대디2007년 04월 09일 10시 14분 수정/삭제 댓글주소
      까칠한 질문에 진지한 대답이네요..^^

      그나저나 PHP는 언제봐도 적응하기 힘든 소스네요.
      그나마 화면표현은 xml로 빠져서 그렇지 일반 Tag들과 뒤섞인 소스를 보면, 그냥 도망가고 싶어진다는...^^
    • 낚시광준초리2007년 04월 09일 10시 19분 수정/삭제 댓글주소
      그렇죠? 그런데 인덴트만 잘주면 뭐......나름 이해하기 편하다는.. C함수들과 대부분 비슷해서 ㅎㅎㅎㅎ 그래도 이런 함수 있을까 하고 c랑 비슷한 함수 찾아보면 대략 있다는 ㅎㅎㅎㅎㅎ
    • brainchaos2007년 04월 10일 12시 57분 수정/삭제 댓글주소
      이거 찔린다.
      내 글에도 완전 오타 투성인데.

      한글을 사랑하시는 분~~이신가보네요.

      광초리님. 근데 php는 잘 몰라서 눈이 휘둥글합니다.
    • 낚시광준초리2007년 04월 10일 15시 55분 수정/삭제 댓글주소
      ㅋㅋㅋ brainchaos님 광초리라 부르니 데게 이상한데요 ㅎㅎㅎㅎ
    • brainchaos2007년 04월 10일 17시 58분 수정/삭제 댓글주소
      그것보세요..
      전 오타쟁이입니다. 이런 실수를 또하고 말았군요.
      준초리님. 맞지요?

      휴~~
      죄송합니다.
    • 낚시광준초리2007년 04월 10일 18시 03분 수정/삭제 댓글주소
      저도 무진장 오타쟁이예요ㅕ ㅋㅋㅋㅋ 그래서 낙장불입인 me2day가 겁납니다..
  • 건이아빠2007년 04월 09일 01시 48분 수정/삭제 댓글주소 댓글달기
    직접 플러그인 개발 문서를 작성해버리셨군요 ^^
    아무것도 안하는 제가 왈가불가할 입장은 아니지만
    예제가 "입문자용" 치고는 너무 어려운것 같애요;;
    레퍼런스를 만드는데는 독자의 레벨 결정이 제일 어렵긴 하겠지만, 아~주 간단한 것부터 시작하는게 좋을것 같아요 ^^

    혹시 스프링노트 사용하시면 거기서 플러그인 제작 매뉴얼을 공동 작업해도 괜찮을것 같네요 ^^
    언제나 화이팅 하세요 !!
    • 낚시광준초리2007년 04월 09일 08시 55분 수정/삭제 댓글주소
      저도 참 애매했어요 그렇다고 잘 모르는 PHP와 MySQL을 같이 언급하자니 두서 없이 길어 질것 같고 그래서 초기에 언급했듯이 PHP와 MySQL을 기본적으로 아는 분에 한해서 이해 할 수 있을거라고 했구요.. 여기 입문자용은 플러그인을 처음 만들때 저처럼 해매지 말라고 간단하게 언급 하셨다고 생각하시면 되요 ^^*
  • brainchaos2007년 04월 10일 12시 55분 수정/삭제 댓글주소 댓글달기
    ultraedit가 간혹 BOM 이넘을 UTF-8저장에서 포함 시켜서 난감했던적이 많습니다. 그뒤로는 에디터는 editplus를 쓴답니다.
    eclipse역시 한글이 껄끄러워서요. (저만 그런지 몰라도.. ^^;)
[로그인][오픈아이디란?]




페이지 이동< 1 >