Movable Typeの管理画面をJavaScriptでカスタマイズする方法を試してみました。
設定方法
まず、Movable Typeを設置したディレクトリ内にある 「/tmpl/cms/layout/common/footer.tmpl」 をコピーします。
「/alt-tmpl/cms/layout/common/」 の階層でディレクトリを作成して、その中に先ほどコピーした「footer.tmpl」をペーストします。
alt-tmplディレクトリはカスタマイズしたテンプレートファイルを設置するディレクトリで、このディレクトリ内にファイルがある場合、元のtmplディレクトリの内容をオーバーライドして表示します。
これでカスタマイズ用のテンプレートが用意できたので、alt-tmpl配下に複製したfooter.tmpl内にJavaScriptのファイルを読み込む記述を追加します。
<mt:if name="mt_debug"><mt:Include name="include/debug_hover.tmpl"></mt:if> <script src="/js/admin.js"></script> </body> </html>
「/js/admin.js」を作成して、以下のように記述します。
console.log('admin test');
管理画面にログインして、各ページのconsoleに「admin test」が出力されていればOKです。
ページの判別
先ほどの設定で管理画面上でJavaScriptが使えるようになりましたが、実際に使う場合は特定のページ内のみJavaScriptを実行したいということも多いです。
そのため次は、記事・ウェブページ・コンテンツデータの一覧ページ・新規作成 / 編集ページを判別して、それぞれでconsoleを出力するようにしてみます。
admin.jsを以下のように変更します。
var param = location.search.substring(1).split('&'); var params = new Object; var p; for(var i = 0; i < param.length; i++) { p = param[i].split('='); params[p[0]] = p[1]; } console.log(params); // 記事一覧 if(params['_type'] === 'entry' && params['__mode'] === 'list') { console.log('記事一覧'); } // 記事の新規作成・編集 if(params['_type'] === 'entry' && params['__mode'] === 'view') { console.log('記事の新規作成・編集'); } // ウェブページ一覧 if(params['_type'] === 'page' && params['__mode'] === 'list') { console.log('ウェブページ一覧'); } // ウェブページの新規作成・編集 if(params['_type'] === 'page' && params['__mode'] === 'view') { console.log('ウェブページの新規作成・編集'); } // コンテンツデータ一覧 if(params['_type'] === 'content_data' && params['__mode'] === 'list') { console.log('コンテンツデータ一覧'); } // コンテンツデータの新規作成・編集 if(params['_type'] === 'content_data' && params['__mode'] === 'view') { console.log('コンテンツデータの新規作成・編集'); }
ページの判別はURLに付与されるパラメータの「__mode」や「_type」の値を使うことでできます。
ただ、これだけだと他の子サイトやコンテンツデータが複数ある場合には判別されません。
例えば、特定の子サイト(blog_idが1)の記事の新規作成 / 編集ページのみJavaScriptを実行したい場合、以下のようになります。
// 記事の新規作成・編集 if(params['_type'] === 'entry' && params['__mode'] === 'view' && params['blog_id'] === '1') { console.log('blog_idが1の記事の新規作成・編集'); }
判別の条件にblog_idが1かどうかを追加しています。
特定の子サイト(blog_idが1)内の特定のコンテンツデータ(content_type_idが2)の新規作成 / 編集ページのみJavaScriptを実行したい場合、以下のようになります。
// コンテンツデータの新規作成・編集 if(params['_type'] === 'content_data' && params['__mode'] === 'view' && params['blog_id'] === '1' && params['content_type_id'] === '2') { console.log('blog_idが1でcontent_type_idが2のコンテンツデータの新規作成・編集'); }
判別の条件にblog_idが1かどうかとcontent_type_idが2かどうかを追加しています。
最後に実際の例として、blog_idが1の記事の新規作成 / 編集ページのタイトルに補足文を追加してみます。
// 記事の新規作成・編集 if(params['_type'] === 'entry' && params['__mode'] === 'view' && params['blog_id'] === '1') { var title = document.getElementById('title-field'); title.insertAdjacentHTML('beforeend', '<p style="margin-top: 5px; color: gray; font-style: italic;">タイトルは必ず入力してください。</p>'); }
これで指定したページのタイトルのみ補足文を追加することができました。
注意点として、Movable Typeをアップグレードした際に元のテンプレートが変更される可能性があるので、アップグレードの際にテンプレートの変更がないかチェックする必要があります。
コメントが承認されるまで時間がかかります。