タグ「movable type」が付けられているもの

MT4.1UPのカスタムフィールドで演算をする

  • 投稿日:
  • カテゴリ:

MT4.1以上は、SetVar name="hoge" value="hoo" で変数を設定し、GetVarで値を取得でき、option機能、opモディファイアを利用することで、簡単な演算をさせられるので、
※MT opモディファイアの基本的用法については、こちら

これを利用して何か試しに作ってみよかな、
と、今回、ブログ記事アーカイブに適当なカスタムフィールドを作成して、カスタムフィールド内の数値を集計(合計)してみることにしました。

ブログ記事に適当な名前でカスタムフィールドを作成。仮にcustomfield1 としますと、通常MTcustomfield1>というタグで値にアクセスできるようになります。MTタグでブログ記事に設定したカスタムフィールドの集計を求める流れとしては、


  1. 変数の設定、初期化
  2. MTEntryタグ内で、opモディファイアを用いて、customfield1の値を加算
  3. 演算結果を取得

<MTSetVar name="var1" value="0"><MTIgnore>//変数の設定、初期化</MTIgnore>
<MTEntries lastn="9999">
<MTSetVarBlock name="var1" value="$var1" op="+"><MTcustomfield1></MTSetVarBlock>
</MTEntries>
合計:<MTGetVar name="var1"> <MTIgnore>//演算結果の取得</MTIgnore>

これで集計した値が取得できます。 (表示サンプル:2008年11月1日現在、当無料素材倶楽部のトップページ右サイドバーで表示している総素材画像数がそれ)

特定フィールドだけの集計なんてのは、需要がありそうな気もするし、ノンプログラマにとっては、プログラムを直接いじらず、テンプレートタグだけでちゃっちゃと計算できちゃうのは楽チン、なはず。

が、問題が。

  1. アーカイブテンプレートに直接記述しないとワタシの環境では動かない。<MTInclude ~>が効かない。
  2. 後からカスタムフィールドを作成した場合、適当にカスタムフィールドの規定値を設定しても、再構築すれば、各エントリーの情報にその規定値を入れてくれるものではない。1個1個記事を保存しなおさないと、だめみたい。(カスタムフィールドについては、 Entry関連のテーブル内のentry_metaにbinaryで保存されるようなんですが、規定値を設定後、再構築しただけでは、カスタムフィールドの設定情報が保存されているテーブル、mt_fieldの、field_defaultという列から値をひっぱってくるだけで、各エントリー記事のentry_metaに情報が保存されません。ダイナミックパブリッシングだけで、静的なファイルについては試してないけども)
  3. カスタムフィールド設定の際、テンプレートの例として、以下のようなものが管理画面に表示される。
    <MTIfNonEmpty tag="customfield1">
    素材画像点数: <MTcustomfield1>
    </MTIfNonEmpty>
    ところが、ワタシの環境ではカスタムフィールドで
    <MTIfNonEmpty>を記述しても効かない。何でかわからない。
  4. そもそも、SQL文には、一発で集計を出してくる構文(sum()関数)がある。直接DBで演算させずに、タグでエントリーの情報を全部引っ張ってきて配列に入れ、ループで演算させるって、無駄じゃ・・・・

共用サーバーで、2のように、後からフィールドに何か特定の値をつけたしたいなら、カスタムフィールド設定するより、EntryMoreあたりが空いているならそれを使用することにして、ローカルでMT形式ファイルを作成、importして値を追加するような流れが楽ですね、きっと。個人的には、4が一番気になってまして。大して記事がない場合は上記でもOKでしょうけども、直接、SQL文を発行して、求めたほうがいいはず。ただ、カスタムフィールドの場合、SELECT SUM(XX) FROM テーブル名 なんて単純な形で一発集計させられない。何とかしようがあるはずなんだけどな。

追記:使用しているのは、テキストフィールドだけなので、Blob型のバイナリデータを文字列変換後、Replaceで置換して必要なとこだけ切り出せば、SQLで演算できないか?と試してみたんですが、MySQLでは正規表現使用で置換ができず(正規表現なしでいける場合は可能かも)、カスタムフィールドの値をSQLだけで一発集計はできんという結論に落ち着きました。かといって、値を加算するためだけにわざわざループさせるのって馬鹿らしい。さらにmt形式でのインポート・エクスポートを考えるとちょっと遊びたい程度の安易な気持ちで作ったこのフィールドが邪魔くさいのなんのって。というわけで、別フィールドにカスタムフィールドの値だけを移し、phpからクエリで一発集計取得後、キャッシュさせるよう変更しました。