BlogTop > MovableType > mt4 Archive

mt4 Archive

Movable type 4.x は、2011/11/26 で製品ライフサイクルを終了しています。
詳しくは、MovableType.jpの Movable Type のプロダクト・ライフサイクルポリシーについて を参照してください。

1 of 5

Next Page >

すべてのページ

キャッシュとSSIでの失敗談

  • Posted by: maRk
  • MovableType | mt4
  • はてなブックマークに追加

Movable Type4.2からのキャッシュとサーバーサイドインクルード機能を利用していて失敗したときのことを記します

キャッシュとSSI(サーバーサイドインクルード)機能の説明はここでは省略します。以下を参照してみてください。

この前サーヴァ間移動をおこなったときのことなのですが、ページを表示するとWarningがでているんですねえ。

でそのWarningの内容を見ると、パスのところに移動もとのほうのアカウントが。インクルードするファイルを読み込めないために警告されているようでした。

サイトパスとかブログの設定で書き換えた(移動のときサーヴァのアカウントも変えたので)ハズなんだけどおかしいなあと思っていたら、SSIのところだったというオチでした。*ヴァージョンは4.27にてということにしておきます。

キャッシュ設定がPHPでおこなわれたとすると、そのモジュールの出力ページは保存用のディレクトリに保存されて、読み込む側のページにおいて以下のように置き換わるようです。

  • <?php include("/path/to/site/includes_c/includemodule.php") ?>

これが静的ページに残ってるということですね。ちなみに保存用ディレクトリincludes_cは環境変数(IncludesDir)により変更可能です。新しいほうのサーヴァのパスになるためにはファイルが更新されないといけないので、結局のところ再構築をおこなう必要があります。

つまるところ、サーヴァ移動をおこなったときの全再構築を執り行うのを怠っていたワタくシのミスでした。

なんというか、テンプレート編集画面を見てもモジュールインクルードの箇所はSSIが展開されて表示されているのではないのでうっかりしてました。サーヴァ移動後の注意点としてはそんなところです。

TemplateShelfプラグインの「All Templates」の選択がワナらしいので

  • Posted by: maRk
  • mt4 | mt5 | plugins
  • はてなブックマークに追加

Movale TypeのTemplateShelfプラグインですがAll Templatesを選択時にテンプレートの数が多いと動作が重くなるとのことなので使えないようにする改造とグローバルテンプレートのIDについてです

Movable Type 5で「TemplateShelfプラグイン」が動作できるとの情報がWolaWolaさまにて紹介されています。不具合の修正や改造方法も掲載されていますので参考になります。

ヴァージョンを4.2にしてから動作しなくなったので放置してしまったのですが、4.2以降でも動作するようにヴァージョンアップされていたようですね。さっそく使ってみましたところ4.261においても動作することを確認しました。

さて、「All Templates」を選択した際に動作が重いとのことです(JSON形式のデータの書き出しか読み込みで時間がかかるのか??)。すべてのテンプレートのショートカットを表示させたい場面は滅多にありませんので要らないものは使わなくて済むように以下のように変更してみました。なお以下のカスタマイズはMovable Type 4.261にて確認をおこないました

<option value="" disabled="disabled"><__trans phrase="All Templates"></option>

template_shelf.tmplファイルのoption要素で当該の箇所にdisabled属性を追加して選択できないようにしています。

余談ではありますが、書いておきますとoption要素のdisabled属性がIE6では選択不可にならなかったとおもいます。その前にIE自体でこのプラグインが動かないですので。。(参考:「Template Shelf」プラグインがIE6では動かない? - ElectricBrain Standard)上記はワタくシがやった方法ですから、その部分を削除するなり、コメントにするなりお好みの方法でよろしいかと。

それと、グローバルテンプレート時の振り分け(blog_id=0のパラメタが機能していない件の対処)についてなのですが、実はモーダルボックスでグローバルテンプレートの表示を試してみると(MT4.261の場合です)、コチラのほうはいちおう表示されているんですね、これが。

ソースを見るとどうやらtmpl.idの値が求めているものそのものらしいです。で、問題の箇所は以下のように変更してみました。createRow()関数の箇所でmt:var name="blog_id"の部分をtmpl.blog_idに置き換えます。そういう意味とは違うようでしたら御免なさい。

?__mode=view&amp;_type=template&amp;blog_id='+ tmpl.blog_id + '&id=' + tmpl.id + '">'

改造後はいつもの如しで、MTシステムディレクトリ/plugins/TemplateShelf/tmpl以下にアップロードして管理ページから確認して終了です。これで「むきょー!」の仲間入りですね。

Movable Typeのjsファイル内の関数を利用したShow-Hideのカスタマイズ

Movable Typeが生成する、インデックステンプレートのjsファイルに登録されている関数を利用して特定IDの要素の表示や非表示を実現するカスタマイズです。

ページ内の一部分をクリックで表示させたり、非表示にしたりするのに、自分でJavaScriptを書いて用意するか、prototype.jsやjQueryを利用するなどの方法があります。

さて、ほんの小ネタなのですが、MTのインデックステンプレートのJavaScriptテンプレートには、簡単な要素の表示・非表示をおこなう関数があらかじめ用意されています。簡素な表示切り替えでしたら、このJSファイルを利用する、という手もあります。

今回使う関数は、mtShow()mtHide()です。

なお、上記の関数はMovable Type 4のヴァージョンによってはこの関数が導入されていませんので注意願います。ということで、以下のカスタマイズは、JavaScriptテンプレート内に、function mtHide(id)といったコードが記述されていることを前提として説明していきます。

mtShow()を利用した例

例として、簡単なテンプレートで示します。<$mt:Link template="javascript"$>を使ってMTのJSファイルを呼び出していますが、これはあくまでも例としてのテンプレートです。実際の使用は、individualアーカイブテンプレートのように作りこまれたテンプレート内で利用することを想定しています。

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<style type="text/css">
#show { display: none; }
</style>
<title>MT Template test Show(ID)</title>
<script type="text/javascript" src="<$mt:Link template="javascript"$>"></script>
</head>
<body>
<p><a href="./" onclick="mtShow('show'); return false;">Show List</a></p>
     <div id="show">
     <ul>
         <li>list - 1</li>
         <li>list - 2</li>
         <li>list - 3</li>
     </ul>
     </div>
</body>
</html>

mtShow('show')で表示したい要素のID、showを渡します。記事ページのコメント一覧の表示とか、トラックバックURIを表示させるなどに使えるかと思います。

mtHide()を利用した例

以下は、画面上部に表示された要素を消すボタン用に関数を利用した例です。サイドバーやページの最上部に簡単なお知らせを表示するような場合などに。

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<style type="text/css">
body *{ margin:0; padding:0; }
#hide { display: block;
 margin     : 0;
 border     : 1px solid #CCCCCC;
 background : #FFFFE0 none;
 text-align : right; }
</style>
<title>MT Template test Hide(ID)</title>
<script type="text/javascript" src="<mt:Link template="javascript">"></script>
</head>
<body>
     <p id="hide">This is a test of MT Template !! <a title="Click to hide this message" href="./" onclick="mtHide('hide'); return false;">[ X ]</a></p>
<ul>
<li>list - 1</li>
<li>list - 2</li>
<li>list - 3</li>
</ul>
</body>
</html>

以上です。もっと複雑なことをされたいようなときは、自前で用意されたほうがいいかと思います。

これらのテンプレートをセットしたものは以下にあります。

解凍後の、templatesフォルダ内のファイルをインデックステンプレートで作成すれば試すことができます。

Download

MT:ついでにエディタのツールバーもドラッグ可能にしてみる

Movable Typeの記事編集画面のツールバーをドラッグできるようにしてみました。

以下の内容は、Movable Type 4系に関するものです

Movable Type 4では記事の内容のエリアの縦サイズは可変になるようになっています。ところが、ワタくシのように記事の「続き(extend)」を使わずに、ほとんどが「本文」のみで書いており、長い記事の編集中にテキスト部分をスクロールバーが出ないように長くしていると、ツールバー(テキスト編集のためのボタン群)が上のほうに送られることで画面から隠れてしまうケースがあります。

これを解決する方法で思いつくのはこのようなところです。

そこで、MTのツールバーもドラッグで任意の位置にもっていくことができるようにしてみたというわけです(というのはタテマエでdraggableのオプションを試すのが目的だと言う話もあります)。

方法ですが、先般書いた、「メモ:MTでファイルアップロード等のダイアログが画面内に収まり切らない時の対処」の記事内のダイアログをドラッグする方法にコードを追加します。追加する(している)コードは以下のようになります。

jQuery(function(){
     //  エディタツールバーにz-index設定し、テキスト部分に潜り込まないようにする
       $('#editor-content-toolbar').css("z-index","1");
     //  draggable の設定をする
       $('#editor-content-toolbar').draggable({
        snap: ".tab",
        cursor: "move",
        containment: "#content-inner",
        drag: function(event, ui){$(".field-buttons-formatting").css("visibility","hidden");},
        stop: function(event, ui){$(".field-buttons-formatting").css("visibility","visible");}
        });
});

導入までの手順の簡単なオサライです。

  1. https://www.movabletype.jp/faq/modal-dialog.htmlの代替テンプレートをダウンロード
  2. /alt-tmpl/ディレクトリ以下に指定された箇所にアップ。ダイアログの動作を確認。
  3. jQuery本体、jQuery UI(ui.core.js、ui.draggable.js)を用意する
  4. 代替テンプレートを書き換えて再びアップする

動作確認はMTOS4.3-jaとおよびこのブログでのMovable Type Pro 4.261、ブラウザはFirefox3.0.13とIE7です。動作的にはFirefoxのほうを推奨します。

あと、特定の要素を指定していますから、テンプレートの構造とか要素が変更になると動作しなくなります。なお、draggableのオプション設定については以下を参考にしました。

メモ:MTでファイルアップロード等のダイアログが画面内に収まり切らない時の対処

Movable Type 4.54.25以降で、ファイルアップロードなどの画面がモニタの解像度やウインドウサイズによって収まりきらずにボタン類が画面に表示されなくなる問題の対処法です

以下の内容は、Movable Type 4系に関するものです。

この問題は、通常の使用では表面化しない類のものかと思うのですが、画像ファイルなどをアップロードする際に表示される、「ダイアログ」が画面内に入りきらないことで、「キャンセルボタン」や「アップロード」といったボタンが表示されなくなってしまう、というものです。

解決法としてMovable Type.JPにて、代替テンプレートが公開されています。

説明を読んでファイルをダウンロードして、Movable Typeが設置されているディレクトリ内の指定された箇所にファイルを置くだけなのでそれほど面倒ではありません。

それで、適用するファイルのパスは、以下のようになります。

  • MTがインストールされているディレクトリ/alt-tmpl/cms/include/footer.tmpl

適用後、ダイアログが画面に収まりきらないときにスクロールバーが表示される動作になっていれば正常な動作です。

以下は試しにFirefoxでFirebugを起動させてみたときのスクリーンショットです。

mt_dialog.gif

おまけ

それで、「ダイアログ自体をドラッグしてみたらどうよ」、ということで実装してみました。

先ほどの件でjQueryが使われてましたので、DraggableというUIを利用するとします。

jQuery UIからUI coreとDraggableをダウンロードしておきます。ダウンロード後は展開したファイルからui.core.js、ui.draggable.jsをMTのjqueryフォルダ内か自分が管理するJSファイルのディレクトリなどにアップロードしておきます。

先述のfooter.tmplファイルを開いてjQueryの呼び出しの箇所と、スクリプト実行の部分を書き換えをおこないます。

</mt:unless>というコードの下付近から以下のように変更しています。なお、jQueryのヴァージョンで1.3.2を使っている関係で、デフォルトのfooter.tmplのjQuery呼び出しファイル自体も変更しています。

<script type="text/javascript" src="<$mt:Var name="static_uri"$>jquery/jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="<$mt:Var name="static_uri"$>jquery/ui/ui.core_172.js"></script>
<script type="text/javascript" src="<$mt:Var name="static_uri"$>jquery/ui/ui.draggable_172.js"></script>
<script type="text/javascript"><!-- 
    $("head").append('<link rel="stylesheet" href="<mt:var name="static_uri">css/dialog_draggable.css" type="text/css" media="screen" />');
    $(document).ready(function(){
                $('#dialog-container').draggable();
    });
    jQuery(function() {
        jQuery(window).resize(function() {
            var $dialog = $('#dialog');
            var height = jQuery(window).height();
            if ($dialog.length) {
                $dialog.height(height - 60);
                $('#dialog-iframe').height(height - 60);
            }
        });
    });
// -->
</script>

jQueryで、スタイルシートをappendしていて、スタイルシートで使っているのは、カーソルの形を変えるといった程度のものです。mt-static/css/ 以下か自分がわかる任意の箇所に置きます。

/* for draggable dialog */
#dialog-container{ cursor: move; }
#dialog-container:hover { border: 2px solid blue; }

footer.tmplを変更したものに差し替えて、ダイアログを見ますと以下のように、ダイアログの外側のグレーアウトされた部分でドラッグ可能となりました。

mt_dialog_draggable.gif

それと注意点としてですが、MTのヴァージョンをあげた、などに起因して動かなくなってしまった場合は、この代替テンプレートファイルを削除されるとよろしいかと。

今月のいらんことしい(2009年6月)

今月(2009年6月)、サイトのテンプレート等をカスタマイズしたところをまとめた記事です。

今月は、Movable Typeのマイナーアップデートがありました。

このほかには、これといって目立ったところを弄っていないのですが、とりあえず記しておきます。

  • 4.25から4.261へアップグレードした
  • 各記事ページでコメンテーターのアンカーを付けた
  • アーカイブページにAjax検索の仕組みを採用した
  • Open Searchプラグインを導入
  • カテゴリアーカイブでパラメタ(page=)の付くページはNOINDEXとしてみた

4.26へのアップグレードは順調に問題なく進みましたが、不具合に遭遇。その後、早急に修正ヴァージョン4.261がリリースされました。

コメントされる方のリンクですが、コメントのテンプレートにはもともとIDがMTCommentIDが付与されてましたので、それを利用したというだけです。

アーカイブインデックスですが、詳細は以下にて記載してあります。

Open Searchプラグインについては、以下に記しておきました。

MTPaginateプラグインをカテゴリーインデックスページに採用していますが、 phpでパラメタの付いたページには、metaタグで、下記のような出力となるようにしてみました。

  • <meta name="robots" content="noindex" />

アーカイブインデックステンプレートでパラメタのないトップページにはコレがでないように振り分けしてあります。今現在その結果どうなるのか様子を見ているといった状況です。

今月のカスタマイズは以上です。2009年6月のアーカイブは以下から閲覧することができます。

メモ:trim toとencodeの組み合わせで気をつけること

  • Posted by: maRk
  • mt4
  • はてなブックマークに追加

Movable Typeのグローバル・モディファイアのtrim_toを使うとき、エンコードすべき文字の途中でトリムされる場合の検証と対処について

説明がわかりにくいと思うので、いきなりですが、やりたいことをテストテンプレートにて示します。

test template 1
<mt:setvars>data=0123456789&ABCDEF</mt:setvars>
<?xml version="1.0" encoding="<$MTPublishCharset$>" standalone="yes" ?>
<data><mt:var name="data" encode_xml="1" trim_to="11" /></data>

上に示したテンプレートでは、0から&(アンパサンド)までを指定して出力するものです。

このテンプレートをそのまま出力(XMLファイルとして)させてブラウザで見ると、パースエラーとなってるはずです。

では、trim_toの値を15にしてみるとどうでしょうか。これはエンコード後のアンパサンドの文字数を含める数値です。

test template 2
<mt:setvars>data=0123456789&ABCDEF</mt:setvars>
<?xml version="1.0" encoding="<$MTPublishCharset$>" standalone="yes" ?>
<data><mt:var name="data" encode_xml="1" trim_to="15" /></data>

今度は、モディファイアの順番をいれかえして、trim_toを先に記述してみます。

test template 3
<mt:setvars>data=0123456789&ABCDEF</mt:setvars>
<?xml version="1.0" encoding="<$MTPublishCharset$>" standalone="yes" ?>
<data><mt:var name="data" trim_to="11" encode_xml="1" /></data>

この場合だと、問題なく表示されます。

日本語の場合でテストしてみます。下のテンプレートではどうでしょうか。

test template 4
<mt:setvars>data=あいうえお&かきくけこ</mt:setvars>
<?xml version="1.0" encoding="<$MTPublishCharset$>" standalone="yes" ?>
<data><mt:var name="data" encode_xml="1" trim_to="9" /></data>

まとめのようなもの

以上のテンプレートは故意にエスケープすべき場所を指定してトリムをおこなっていますが、普通に記述していて予期しない箇所でパースエラーを引き起こす原因になっていることがありうるかも。

回避の方法としては、先にtrim_toを記述してから、encodeをおこなう形にするか、それが具合悪いのであれば、setvar、getvarで変数に渡してから処理するとか、XMLならば当該箇所をCDATAにするか、でしょうか。

それと、グローバル・モディファイアの処理を先に書いたものが先に実行されるらしいというかそういう仕様っぽいです。

Index of all entries

BlogTop > MovableType > mt4 Archive

Feeds
Elsewhere

Action Streams

logo

Comment powered by DISQUS

Return to page top