2010年10月28日木曜日

MTのsplitプラグインについて

自分で原因調査したわけではないのですが、、、
私ともう一人の方で大分ハマってしまったsplitプラグインの罠について。
というか、報告してあげたほうが良いレベルなんでしょうかね。
それとも仕様なのかな。

MTでsplitというプラグインがあります。
http://www.koikikukan.com/archives/2009/01/20-015555.php

こちらは、カスタムフィールド等にいれた、データを任意の区切り文字で
split した配列変数を返してくれるプラグインで、便利なのでよく使います。
何個入力されるかわからないときとかよく使う。

今回は、splitした内容をMTIfで判定して、合致したら出力を行うみたいなことを
しようとしていたのですが。
改行を区切り文字にしてsplitで区切って配列変数に入れる。
そのあとループで回して変数にセットしてIf文で分岐

【フィールドの入力値】
A
B
C

【テンプレート】

<MTVar name="string" split="\n" setvar="alphabets">
<MTLoop name="alphabets">
<MTSetVarBlock name="result"><MTVar name="__value__"></MTSetVarBlock>
</MTLoop>

<MTIf name="result" eq="●●">
~~処理~~
</MTIf>



上記だと出力したときに、なぜかCの分岐しか出力されない。
一番最後に入っていた値のIf文しか実行されませんでした。

splitで区切っているはずで、試しに
などで出力してみても、
ちゃんと区切れているのですが、だめでした。

私で一日、もう一人の方にも半日以上みてもらったけどだめで
ダメもとで改行区切りをカンマ区切りに変えてみたら全部でました。

【フィールドの入力値】
A,B,C

【テンプレート】

<MTVar name="string" split="," setvar="alphabets">
<MTLoop name="alphabets">
<MTSetVarBlock name="result"><MTVar name="__value__"></MTSetVarBlock>
</MTLoop>

<MTIf name="result" eq="●●">
~~処理~~
</MTIf>


記号でできて文字コードでできないことから、
splitプラグインで区切ったとき、改行コードのようなものは
splitしたときに前の値にくっついてしまうようです。
目には見えないし出力にも現れませんが。

回避方法としては、splitで区切った値を使用して
分岐処理をしたい場合は改行を使わない、または
strip_linefeeds="1" のモディファイアを付けるといいらしい
http://www.movabletype.jp/documentation/appendices/modifiers/strip_linefeeds.html

一時はお客さんに複数入力はあきらめてもらおうかと
思ったくらいだったので奇跡がおきてよかったです。

時には自分らのコードの誤りだけでなくて
MTの機能自体やプラグイン自体の挙動もチェックしたほうが
いいかもっていうおはなしです?

1 件のコメント:

  1. MT触ったことないのですが、
    改行区切りのデータを\\nでsplitしたり
    タブ区切りのデータを\tでsplitしたら
    どうなるのかちょっと気になりますね。

    返信削除