Movable Typeのダッシュボードプラグインの作り方

May 15,2024 11:55 PM
Category:[ダッシュボード]
Tag:[Dashboard, MovableType, Plugin]
Permalink

Movable Typeのダッシュボードプラグインの作り方を紹介します。

1.はじめに

ダッシュボードプラグインを作る機会があったので、サンプルを使って作り方をまとめてみました。

ここでは下記のサンプルを紹介します。

ユーザーダッシュボードに「サンプルダッシュボードウィジェット」を表示します。

サンプルダッシュボードウィジェット

選択すると、下記のようにログインしたユーザー名を表示します。

サンプルダッシュボードウィジェット

×印をクリックすると、ウィジェットが削除されます。

このサンプルプラグインの構造は次の通りです。

DashboardSample
 ├ config.yaml
 ├ lib
 │ └ DashboardSample
 │   └ CMS.pm
 └ tmpl
   └ sample.tmpl

サンプルは下記のURLよりダウンロードできます。

DashboardSample.tar.gz

以下、それぞれのファイルについて解説します。

2.config.yaml

下記にサンプルを示します。

name: DashboardSample
id: DashboardSample
widgets:
  DashboardSample:
    label: サンプルダッシュボードウィジェット
#    plugin: $DashboardSample
    template: sample.tmpl
    order: 1000
    singular: 1
    set: main
    handler: $DashboardSample::DashboardSample::CMS::test
    view:
      - user

主な項目の意味は次の通りです。

  • template:ダッシュボード用テンプレートファイル名
  • order:表示順序
  • singular:単独表示("1"固定。プルダウンから選択・表示したあと、プルダウンの候補から外すためのもの)
  • set:表示領域(main:中央/sidebar:右カラム)
  • handler:ダッシュボード表示用ハンドラ名
  • view:表示種別(user:ユーザーダッシュボード/system:システム管理画面/website:親サイト/blog:子サイト)

"plugin"という項目もありますが、記述無しでも動作するようなのでコメントアウトしています。

記述する場合は、サンプルのように「id:」の値を"$"つきで記述してください。

3.sample.tmpl

下記にサンプルを示します。

<mtapp:widget
  id="DashboardSample"
  class="widget DashboardSample"
  label="サンプルダッシュボードウィジェット"
  can_close="1">
<p><mt:var name="name"></p>
</mtapp:widget>

ここではパラメータ「name」の値だけを表示するようにしています。

<p><mt:var name="name"></p>

ダッシュボードを表示したあとに×印で削除できるようにするには、mtapp:widgetタグに「can_close="1"」を付与します。

4.CMS.pm

下記にサンプルを示します。

package DashboardSample::CMS;
 
use strict;
use warnings;
 
sub test {
    my $app = shift;
    my ( $tmpl, $param ) = @_;
 
    my $user = $app->user;
}
 
1;

sample.tmplの"name"に値を渡すために、下記の1行を追加しています。

    $param->{name} = $user->nickname;
Comments [0] | Trackbacks [0]

Movable Type検索結果画面のMTIncludeタグでファイルを読み込む方法

April 18,2024 11:55 PM
Category:[テンプレートタグ]
Tag:[MovableType, MTInclude]
Permalink

Movable Type検索結果画面のMTIncludeタグでファイルを読み込む方法を紹介します。

movabletype

1.はじめに

MTで再構築するファイルの拡張子を".php"にして、そのページの中で頻繁に更新される部分を、

<?php include('foo.html'); ?>

で読み込むことで、ページ全体の再構築不要で情報を更新することができます。

ただ、検索結果ページはPerlのCGIで動作するため、PHPの方法を利用することができません。

ということで、検索結果画面のMTIncludeタグでファイルを読み込む方法を紹介します。

2.検索結果画面のMTIncludeタグでファイルを読み込む

1項のfoo.phpのパスを、仮に「/var/www/html/foo.html」とします。

このファイルを検索結果画面のMTIncludeタグで読み込むには、下記の手順が必要です。

まず、mt-config.cgiに

AllowFileInclude 1

を設定します(注:4項参照)。

次に、ファイル読み込み部分を次のようにします。

<$mt:Include file="/var/www/html/foo.html"$>

これで、検索結果画面でも情報を更新する部品を利用することができます。

3.サイトパスにテンプレートタグを使用する

2項ではファイルパスに「/var/www/html」を直接記述しましたが、テンプレートタグでサイトパスを取得するには次のように記述します。

<mt:Setvarblock name="foo"><$mt:SitePath$>/foo.html</mt:setvarblock>
<$mt:Include file="$foo"$>

1行目のMTSetVarBlockタグで、サイトパスとファイル名を文字列結合したものを、変数fooに設定します。

2行目のMTIncludeタグで、fileモディファイアに「$foo」と書くことで、変数fooの内容が展開され、

<$mt:Include file="/var/www/html/foo.html"$>

と同じ結果となります。

4.注意事項

AllowFileIncludeはセキュリティ対策として、デフォルトで無効(=0)となっています。

理由は「テンプレート編集の権限だけをもつユーザーが、ファイルシステム上の任意のファイルを読み出せるのは問題であるため」のようです。

このカスタマイズを利用する場合は、上記のセキュリティに十分配慮してください。

Comments [0] | Trackbacks [0]

ansibleのcopyモジュールでディレクトリを生成する方法

March 19,2024 12:03 AM
Category:[ansible]
Tag:[ansible]
Permalink

ansibleのcopyモジュールでディレクトリを生成する方法を紹介します。

1.問題点

ansibleのcopyモジュールでファイルをコピーしたいのですが、コピー先のディレクトリがなく、エラーになります。

試したのは下記の2種類です。

test.yml

---
- name: テスト
  copy:
    src: /tmp/hoge.txt
    dest: /tmp/aaa/bbb/hoge.txt2
    remote_src: yes

または

---
- name: テスト
  copy:
    src: /tmp/hoge.txt
    dest: /tmp/aaa/bbb
    remote_src: yes

これを実行すると、下記のように"Destination directory /tmp/aaa/bbb does not exist"というエラーになります。

$ ansible-playbook -i inventory test.yml
 
PLAY [act] ***************************************************************************************************************************************
 
TASK [Gathering Facts] ***************************************************************************************************************************
ok: [server]
 
TASK [test : test.ymlをインクルード] *************************************************************************************************************
included: /var/tmp/ansible/roles/test/tasks/test.yml for server
 
TASK [test : テスト] *****************************************************************************************************************************
fatal: [server]: FAILED! => {"changed": false, "msg": "Destination directory /tmp/aaa/bbb does not exist"}
 
TASK [test : エラーが発生したため停止] ***********************************************************************************************************
fatal: [server]: FAILED! => {"changed": false, "msg": "ロール実行中にエラー発生"}
 
PLAY RECAP ***************************************************************************************************************************************
server               : ok=2    changed=0    unreachable=0    failed=1    skipped=0    rescued=1    ignored=0

ということで、ansibleのcopyモジュールでディレクトリを生成する方法を紹介します。

2.ansibleのcopyモジュールでディレクトリを生成する

ansibleのcopyモジュールでディレクトリを生成するには、destオプションを"/"で終わらせます。

---
- name: テスト
  copy:
    src: /tmp/hoge.txt
    dest: /tmp/aaa/bbb/
    remote_src: yes

このansibleを実行すると正常にディレクトリを生成してくれます。

$ ansible-playbook -i inventory test.yml
 
PLAY [act] ***************************************************************************************************************************************
 
TASK [Gathering Facts] ***************************************************************************************************************************
ok: [server]
 
TASK [test : test.ymlをインクルード] *************************************************************************************************************
included: /var/tmp/ansible/roles/test/tasks/test.yml for server
 
TASK [test : テスト] *****************************************************************************************************************************
changed: [server]
 
PLAY RECAP ***************************************************************************************************************************************
server               : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
Comments [0] | Trackbacks [0]
 1  |  2  |  3  |  4  |  5  | All pages