Movable Typeのダッシュボードプラグインの作り方
Movable Typeのダッシュボードプラグインの作り方を紹介します。
1.はじめに
ダッシュボードプラグインを作る機会があったので、サンプルを使って作り方をまとめてみました。
ここでは下記のサンプルを紹介します。
ユーザーダッシュボードに「サンプルダッシュボードウィジェット」を表示します。
選択すると、下記のようにログインしたユーザー名を表示します。
×印をクリックすると、ウィジェットが削除されます。
このサンプルプラグインの構造は次の通りです。
DashboardSample
├ config.yaml
├ lib
│ └ DashboardSample
│ └ CMS.pm
└ tmpl
└ sample.tmpl
サンプルは下記のURLよりダウンロードできます。
以下、それぞれのファイルについて解説します。
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;
Movable Type検索結果画面のMTIncludeタグでファイルを読み込む方法
Movable Type検索結果画面のMTIncludeタグでファイルを読み込む方法を紹介します。
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)となっています。
理由は「テンプレート編集の権限だけをもつユーザーが、ファイルシステム上の任意のファイルを読み出せるのは問題であるため」のようです。
このカスタマイズを利用する場合は、上記のセキュリティに十分配慮してください。
ansibleのcopyモジュールでディレクトリを生成する方法
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