Home> Internet >  MovableType >  list_actionsのconditionはcode実行時にもチェックされる

list_actionsのconditionはcode実行時にもチェックされる

ふと思いたち、以下のプラグインを現在のMT環境での動作用に修正してみた。
byrnereese/mt-plugin-batchtmploptions
まぁ、機能的には同じものがすでに以下のように存在するのだが、自分の勉強も兼ねてやってみました。
alfasado/mt-plugin-set-template-build-type

このプラグインは、テンプレートのプラグインアクションに、テンプレートの公開設定を直接変更するプルダウンを追加するもので、オリジナルのままだと、公開設定が行えないモジュールやシステムテンプレート等に対しても表示されています。
表示制限のために「condition」を付けてみることにしました。意外と情報ないなぁ。
探してみた「リストアクションの追加 · movabletype/Documentation Wiki」も、あまり参考になりません。

applications:
  cms:
    list_actions:
      template:
        publish_static:
          label: Publish Statically
          order: 105
          code:  $BatchTmplOpts::BatchTmplOpts::Plugin::itemset_stc
          permissions: can_edit_templates
          condition: $BatchTmplOpts::BatchTmplOpts::Plugin::is_publish

「condition」は該当するアクションが、表示されるかされないかを設定するもので、「return 1;」の場合に表示「return 0;」で非表示です。上記で言うとプラグイン内の「lib/BatchTmplOpts/Plugin.pm」の「is_publish」がソレを返します。

どうやら、テンプレート表示時には「filter_key」というパラメータで、各テンプレートの表示を絞り込んでいるようです。
なので、以下のようにすると「インデックステンプレート」と「アーカイブテンプレート」の時のみ表示されるようになります。

my $tmpl_type = $app->param('filter_key') || '';
if (($tmpl_type eq 'index_templates')||($tmpl_type eq 'archive_templates')) {
    return 1;
}
return 0;

これで、うまく表示が制限されるようになりました。
さて、念のためと思って実際に使用してみると、何故かエラーが発生します。メッセージは以下のとおりです。

アクション(publish_static)が実装されていません。

イロイロ原因を調査してみて、どうやら上記の「condition」が影響しているようでした。
どうも、結果から考えると、管理画面の表示のタイミングだけでなく、コードの実行時にも「condition」の評価は行われるようです。その時に渡されている変数などが、管理画面表示と異なるため「return 0;」が戻ることが原因のようです。

「意外とめんどくさいのね」とか思いながら、他のプラグインの対応を見てみたら、「SetTemplateBuildType」ではconditionでの制限はせずに、出力されたものを管理画面上で置換処理を行い削除しているようです。
なるほど、それではMT本体のコードはどの様に処理しているかを見てみようと思いました。

「lib/MT/App/CMS.pm」「core_list_actions」の「template」部分を見ると、どうやら以前使用されていた公開プルダウンのコードが残っており(小粋空間: テンプレート一覧のアクションに「テンプレートの再構築」を追加する)、ソレを追いかけると、どうも「$app->mode eq 'itemset_action'」の時は無条件で「return 1;」になっているようです。プラグインアクションを実行した場合は無条件で正しいものとして扱うということですね。
うーん、それは・・・
それなら、そもそもプラグインアクションの実行時に、「condition」を見る必要はないのではとか思っちゃいました。まぁ中には有効なケースも存在するということなのかなぁ・・・

sub is_publish {
    return 0 if (MT->version_number < 5);
    my $app = MT->app
      or return 0;
    my $blog = $app->blog
      or return 0;
    return 1 if $app->mode eq 'itemset_action';
    my $tmpl_type = $app->param('filter_key') || '';
    if (($tmpl_type eq 'index_templates')||($tmpl_type eq 'archive_templates')) {
        return 1;
    }
    return 0;
}

とりあえず、以上で完成しましたので、プラグイン公開します。元プラグインはライセンス指定書いていないんだよねなぁ。たぶんGPL v2.0では無いかと思います(ここは特に根拠なし)。
naoaki011/mt-plugin-batchtmploptions」です。
気が向いたら使ってください。
まぁ、サイトの構築中のような、頻繁に公開設定を変更する場合以外は、あまり出番がないプラグインですけどね。
ついでにここでも、権限チェックしたほうがいいのかなぁ。まぁでも表示に関しては「permission」で絞り込まれるしな。

Comment:0

Comment Form

Trackbacks:0

TrackBack URL for this entry
http://www.zelazny.mydns.jp/cgi-bin/MT/mt-tb.cgi/2276

Home> Internet >  MovableType >  list_actionsのconditionはcode実行時にもチェックされる

CC Licence

Creative Commons License

このブログはクリエイティブ・コモンズでライセンスされています。

Feeds

Return to page top