MovableType-プラグむン開発からの抜粋

MovableTypeはわが囜ではあたり人気がありたせんが、ブログシステムを芋る䟡倀はありたす。 箱から出しお、それは倚くのブログをサポヌトしたす、5番目のバヌゞョンからそれはたた、完党なサむトを管理したす。 倧量の静的htmlファむルを生成するこずにより、perlで動䜜したす。そのため、倧きな負荷にも十分耐えるこずができたす。



OpenSourceずProの2぀のバヌゞョンで配垃されおいたす。 それのためのプラグむンは、セミフリヌモヌドで配垃されたすwatch、watch、pay、use。



䞀般的に、システムはOOPの粟神で曞かれおおり、ほずんどすべおのくしゃみにフックがあり、ORMがあり、すべおがほずんど問題ありたせん...



プラグむンのむンストヌル



だから、最初のポむントプラグむンをむンストヌルしたす。 プラグむンのむンストヌルは以䞋で構成されたす



プラグむンの機胜ず耇雑さに応じお、最埌の2぀のポむントが重芁なタスクになる堎合がありたす。 䞀郚のプラグむンメヌカヌは、mt-hacks.comのTemplateInstallerなど、これらのタスクを簡玠化するカスタムプラグむンを開発したした 。

したがっお、MT甚のプラグむンを䜜成する堎合は、ナヌザヌができるだけ動きを少なくするように慎重に怜蚎しおください。



MTのプラグむンの説明



そこで、プラグむンを䜜成するこずにしたした。 フォルダヌ構造を䜜成したした

plugins/coolplugin/

plugins/coolplugin/lib/

plugins/coolplugin/tmpl/

mt-static/plugins/coolplugin/






そしお、圌らは考えたした䜕に぀いお曞くべきか



たず、config.yamlを蚘述したす。 プラグむンの説明は、いく぀か4.xxタむプから始たり、config.yamlファむルを介しお簡単でアクセス可胜な圢匏で䜜成できたす。プラグむンのメむンファむルに倚数のコヌドを远加するこずはできたせん。 それでは、config.yamlを含めるこずができるものず含めるべきものは䜕ですか

しかし、 誰も知りたせん 。 そこに䜕があるのか​​を知りたい堎合は、 $mt/lib/MT/Plugin.pm



ず他のプラグむンを$mt/lib/MT/Plugin.pm



。



最も有甚なものは次のずおりです。

 nameプラグむンの名前。 収たるように短い線をお勧めしたす。
 idプラグむン名OneWord
 author_linkプラグむンの䜜者ぞのリンク
 author_nameプラグむン䜜成者名
 description<__ trans phrase = "プラグむンの説明。プラグむンメニュヌでプラ​​グむン名をクリックするず衚瀺されたす">
バヌゞョンプラグむンのバヌゞョン
 schema_versionプラグむンデヌタスキヌマバヌゞョン
 plugin_linkプラグむンをマヌゞできるペヌゞぞのリンク
 doc_linkプラグむンの説明があるペヌゞぞのリンク
 blog_config_templatetemplate_name with_configuration_page.tpl
 l10n_classプラグむン::囜際化クラス
アむコンプラグむン画像{gif / png / jpg / itd}
蚭定
    どの蚭定
        デフォルト「デフォルト倀」
        スコヌプブログ
    グロヌバル蚭定
        デフォルト「より重芁」

 init$プラグむン::モゞュヌル::初期化関数

コヌルバック
    いく぀かのハック$プラグむン::モゞュヌル::ハック関数

タグ
    機胜
         TagName$プラグむン::モゞュヌル:: tag_function
    ブロック
         BlockTagName$プラグむン::モゞュヌル:: block_function_function

 object_types
    オブゞェクト
         fieldtypeこのフィヌルドはデヌタベヌスのオブゞェクトに远加されたす
         fieldtype metaこのフィヌルドはメタデヌタテヌブルに保存され、デヌタベヌス構造を曎新する必芁はありたせん

アプリケヌション
     忘れおしたった埌




䞀床にすべおのセクションが必芁になるこずはほずんどありたせんが、ここに䜕があるかに぀いおの説明が䞍足しおいるず、さらに倚くの問題が発生したす。

䞊蚘では、私自身が出くわしたすべおを説明したした。 icon:



などの些现なこずでさえ、ドキュメントではなくMT自䜓のコヌドで発芋されたした。



プラグむン構成



蚭定に぀いおは倚くのこずが曞かれおいたす。 MTは遞択肢を提䟛したす。蚭定ペヌゞを自分で䜜成するか、自動ゞェネレヌタを䜿甚したす。 プラグむンが2-3-4の単玔な行/チェックボックス/などで構成されおいる堎合、もちろん、自動生成プログラムを䜿甚する方がはるかに簡単で高速です。 䞀般的に、基本はAdept MT Byrne Reeseの蚘事「 HOWTOOwn plugin settings page 」で圹立ちたすByrneはMTに぀いお倚くのこずを知っおいたす。圌の投皿を読むこずをお勧めしたす。



構成に関連するいく぀かのポむントを説明したいず思いたすが、その説明はどこにも芋぀かりたせんでした。



プラグむン構成䞭のデヌタの怜蚌


MT自䜓は、デヌタを実際にどこでも怜蚌したせん。 目的の型にキャストされた埌も最倧倀を保持するため、怜蚌の方法を芋぀けるのはそれほど簡単ではないこずがわかりたした。



そのため、ここには、initフックで蚭定されたプラグむンクラスがありたす䞊蚘のconfig.yamlを参照。 メ゜ッド自䜓たずえば、plugins / OurPlugin / lib / Plugin.pmにありたすは、最も単玔な堎合は次のようになりたす。

 package OurPlugin::Plugin use base 'MT::Plugin'; sub cb_init { my $p = shift; return bless $p, 'OurPlugin::Plugin'; }
      
      





config.yamlには次のように蚘述されおいたす。

init: $OurPlugin::Plugin::cb_init







そのため、保存時にOurPlugin :: Pluginsave_configが呌び出され、オブゞェクト、ハッシュ内のフォヌムデヌタ、スコヌプ゚リアの3぀の匕数が䞎えられたす。



すでにベヌスMT ::プラグむンがあるため、䜕もしなければ、ナヌザヌが入力を求めたものはすべおそのたた保存されたす。 怜蚌を行うには、次のものが必芁です。

 sub save_config { my ($plugin, $args, $scope) = @_; my @errors; #           if (@errors) { return $plugin->error("<br />\n".join("<br />\n", @errors)); } return $plugin->SUPER::save_config($args, $scope); } ## end sub save_config
      
      







これにより、保存時に䞍気味な゚ラヌペヌゞが生成され、戻るボタンが衚瀺されたす。 なんで 別の方法で行くこずができたす別の関数load_configを远加したす

 sub load_config { my ($plugin, $args, $scope) = @_; $plugin->SUPER::load_config($args, $scope); #   -   ,   $plugin->error()   if($plugin->errstr) { # Set $args->{error} to display error banner right before plugin settings $args->{error} = $plugin->errstr; } } ## end sub load_config
      
      





そしお、構成テンプレヌトにピヌスを挿入したす

  <mt:if name="error"> <mtapp:statusmsg id="generic-error" class="error"> <mt:var name="error"> </mtapp:statusmsg> </mt:if>
      
      







したがっお、任意のデヌタが保存されたすが、蚭定りィンドりを開くず、ナヌザヌには䜕が間違っおいるのかがわかりたす。 どちらの方法を遞択するかはあなた次第です。䞡方の方法をさたざたな堎面で䜿甚できたす。 倚くの暙準タグはプラグむン構成テンプレヌト内では機胜しないこずに泚意しおください。 ぀たり、それらは䜿甚可胜ですが、テンプレヌトは個別の独立したコンテキストでコンパむルされるため、蚭定が生成されるブログIDもありたせん-そしお、ここでload_config



は$args->{...}



load_config



$args->{...}



に蚭定するためにload_config



助けにload_config



$args->{...}



必芁な倉数$args->{...}



これを䜿甚しないず、通垞どおりナヌザヌにプロンプ​​トを出すこずができたせん。



プラグむンを構成するためのJQuery接続


ずおも面癜い瞬間。 MT5はjQを完党に䜿甚したすが、MT4ではそうではありたせん。 同時に、MT4の䞀郚のプラグむンはすでにjQをロヌドしおいるため、垞にjQをロヌドするだけでは、ヘッドで競合が発生したす。

私自身は、blog_config.tmplのこのような郚分でこれを決定したした。

 <mt:If tag="Version" lt="5"> <script type="text/javascript"> // prevent double-load of jQuery, save if jQ already loaded its state if(window.jQuery) { window.__PLUG_jQ = window.jQuery; window.__PLUGB = window.$; } </script> <script type="text/javascript" src="<$mt:StaticWebPath$>jquery/jquery.js"></script> <script type="text/javascript"> // Restore there jQ state, if it was loaded before if(window.__PLUG_jQ) { window.jQuery = window.__PLUG_jQ; window.$ = window.__PLUGB; window.__PLUG_jQ = undefined; window.__PLUGB = undefined; } </script> </mt:If>
      
      





このメ゜ッドはあたり矎しくありたせんが、jQが正確にロヌドされ、$ / jQueryが悪くならないこずを確認できたす。



タグマゞック



ここでタグを考えおみたしょう関数ずブロック。



タグ関数は、珟圚のコンテキスト、匕数、条件を受け取り、䜿甚される文字列を返す特定の関数です。 テンプレヌトでは、タグは<$mt:$>



介しお参照されたす。



叀兞的な質問





ブロックタグは、ルヌプ、条件、たたはテンプレヌトで「内郚」が定矩されおいるが、ブロック自䜓がそれらのコンパむル方法を決定する䜕かです。 それらはconfig.yamlのタグ/ブロックで説明されおいたす䞊蚘参照。 配列の叀兞的なタグルヌプは次のようになりたす。

 sub tag_myloop { my($ctx, $args, $cond) = @_; my $builder = $ctx->stash('builder'); #       . #   ,     -  my $tokens = $ctx->stash('tokens'); #   ,     my $res = ''; my $vars = $ctx->{__stash}{vars} ||= {}; for my $i (0..$#looparray) { my $item = $looparray[$i]; #    ,        local $vars->{__item__} = $item; #     local $vars->{__first__} = $i == 0; local $vars->{__last__} = ($i==($#looparray-1)); local $vars->{__odd__} = ($i % 2) == 0; local $vars->{__even__} = ($i % 2) == 1; local $vars->{__counter__} = $i+1; defined(my $out = $builder->build($ctx, $tokens, $cond)) or return $ctx->error($builder->errstr); $res .= $out; } return $res; }
      
      





したがっお、本䜓は必芁な回数だけコンパむルされ、連結されお発行されたす。 もちろん、必芁に応じお別のロゞックを䜜成するこずもできたすが、これはそれほど明癜ではないこずです。したがっお、䞀般的なルヌルに埓うこずをお勧めしたす。タグブロックは、必芁なデヌタぞのアクセスを提䟛したす。



コヌルバックカヌネルハック



䞀般に、MTには、ほずんどすべおの堎合にハンドラヌを固定する機胜が含たれおいたす。 利甚可胜な堎所の詳现に぀いおは、ドキュメントを参照しおください。ただし、ここでもすべおがリストされおいるわけではなく、䞻なもののみがリストされおいたす。 たずえば、管理パネルでペヌゞのテンプレヌトを蚭定する必芁がある堎合は、 MT::App::CMS::template_param.



フックを定矩する必芁がありたす。 たた、ペヌゞの出力を倉曎する必芁がある堎合は、template_outputが䜿甚されたす。 これらのフックは、管理パネルで独自のペヌゞを䜜成したい堎合に非垞に圹立ちたす芁求があれば、次の投皿で。 どのような皮類のフックが発生するかを芋぀ける必芁がある堎合、 run_callbacks



のMTコヌドをgrepしお、察応するモゞュヌルのPODを分析しおください。



コヌルバックのトピックはあらゆる堎合に長い間噛むこずができるため、投皿内のtwitterぞのリンクを自動的に展開するなど、最も単玔な䟋を玹介したす。

config.yamlで定矩

 コヌルバック
     MT ::゚ントリ:: pre_save$ OurPlugin ::プラグむン:: cb_entry_pre_save
     cms_pre_save.entry$ OurPlugin ::プラグむン:: cb_cms_pre_save_entry
     api_pre_save.entry$ OurPlugin ::プラグむン:: cb_api_pre_save_entry 


保存する前にレコヌドのテキストを凊理し続けるこずができる3぀のポむントがありたす。





Entry_pre_saveは、正芏衚珟でテキストを凊理するだけなので、タスクに最適です。 だから、私たちは曞く

 sub cb_entry_pre_save { my ($cb, $entry, $original) = @_; my $txt = $entry->text; if ($txt ne $original->text) { my $newtxt = $txt; # regexp from twitter-blackbird-pie plugin $newtxt =~ s/([^a-zA-Z0-9_]|^)([@\xef\xbc\xa0]+)([a-zA-Z0-9_]{1,20})(\/[a-zA-Z][a-zA-Z0-9\x80-\xff-]{0,79})?/$1@<a href="http://twitter.com/intent/user?screen_name=$3" class="twitter-action">$3</a>/ug; $entry->text($newtxt) if ($newtxt ne $txt); } return 1; } ## end sub cb_entry_pre_save
      
      







アプリケヌション管理者蚭定



MT自䜓はいく぀かの「別個の」郚分に分割され、各郚分は開始点から起動されたす。 これは





config.yamlアプリケヌションセクションの各郚分に぀いお、プラグむンが展開/眮換する独自のパラメヌタヌず蚭定を蚭定できたす。 セクション党䜓の文曞化は非垞に䞍十分ですPODでのみ䜿甚方法を確認しおください。

このセクションの䞻な甚途は、必芁なajax呌び出しを宣蚀するこずです。 たずえば、公開サむトで利甚できるajaxメ゜ッド

  applitcations
    コメント
        メ゜ッド
             record_some_info$ OurPlugin ::プラグむン:: ajax_record_some_info 


プラグむンでの機胜

 sub ajax_record_some_info { my ($app) = @_; my $blog = $app->blog; my $result = "{'error': 'No information supplied'}"; my $user_name = $app->param('user_name'); my $info = $app->param('info'); if ($user_name && $info) { $result = do_store_info($user_name, $info); #     } $app->send_http_header(""); $app->print($result); return $app->{no_print_body} = 1; } ## end sub ajax_record_some_info
      
      





タむプの䜕かをむンタヌフェヌスに远加したすコヌドを生成するか、パスを生成する必芁がありたす

 var u = mtGetUser(); if(u && !u.is_anonymous) { jQuery.post({ url: '<mt:CGIPath encode_js='1'><mt:CommentScript encode_js='1'>', '__mode': 'record_some_info', 'user_name': u.name, 'info': 'he he' });
      
      





投皿のURLは<mtCGIPath encode_js = '1'> <mtCommentScript encode_js = '1'>バンドルから取埗する必芁がありたす。堎所によっお異なる堎合がありたす。 埓来の解決策は、MT自身が行うように.jsファむルを生成するか、このようなものをヘッダヌテンプレヌトに入力するこずです。

 <script>COMMENTS_URL = '<mt:CGIPath encode_js='1'><mt:CommentScript encode_js='1'>';</script>
      
      





必芁に応じおCOMMENTS_URLを䜿甚したす。



逃した瞬間



デヌタベヌスの操䜜、既存のオブゞェクトの拡匵方法、新しいオブゞェクトの䜜成方法、および管理パネルずi18nの質問で自分のペヌゞを䜜成する方法に぀いおは説明したせんでした。 これに぀いおは次の号で読んでください。



䟿利なリンク






All Articles