たびたび すいません。。。
正しく動いてくれて良さそうなものの動かない。。という状況にまたしても当ってしまったので(涙)、みなさまのご意見をいただけたらと思います。
現在書いてるプラグインで、
・新規にテーブルをつくり、
・格納されるデータの型はinteger
・ファンクションタグでは格納された数字をかえす
というのを作っており、テンプレートで、
<mt:SetVarBlock name="hoge">
<mt:ReturnInteger>
</mt:SetVarBlock>
<mt:If name="hoge" eq="0">
ゼロならこっちを表示したいのだ。
</mt:If>
<mt:If name="hoge" eq="1">
ゼロならこっちを表示したいのだ。
</mt:If>
といういう処理をさせようとしています。
<mt:var name="hoge">
とやると、0、1、2、とかえってくるので、数字は返してくれてますから上記の処理は実現できるとウキウキしてしてたわけですが、ところが、mt:Ifが効いてくれない(eq
と解釈してくれない)のです(泣・mt:elseで確認すると見事にelse側が返ってくる)。
でいろいろ例によって試してる内に、<p><mt:Var name="hoge"></p>とやると、、、
<p>
1
</p>
と改行が入った形でかえってきてるみたいで、、、
そこで、タイトルの質問になるのですが、mt:Ifがeqになる条件って、単純に返ってくる値を見てるだけじゃないんですかね? 改行とかも含まれちゃうのか。。。
もし数字かえす側のファンクションタグの実装で、mt:Ifに優しいような、なにか処理をしてやったほうが良いようなことってあるもんでしょうか?
もし、なにか御知恵があればお貸しいただければ幸いです。
どうぞよろしくお願いします。
--
hiroshi yamato / Alliace Port, LLC.
yam...@gmail.com
eqは単なる文字列比較です。mt:ReturnInteger側では対処できません。
<mt:SetVarBlock name="hoge"><mt:ReturnInteger></mt:SetVarBlock>
とか、
<mt:SetVarBlock name="hoge" trim="1">
<mt:ReturnInteger>
</mt:SetVarBlock>
とか、もう試してみたでしょうか。
いろいろやってみて結局解決したのですが、、、
「どうやら変なところにタブらしきものが混っていた」
というのお粗末な結果になってしまいました(苦笑)。
現在trim=1なしでも問題なく動いております。
ただ、MT4のテンプレートエディタ(で今回はずっと作業してるのですが)が良くなった分、そういう変なスペースやタブが入ることがあるよう(別の箇所でもどうしても半角スペースが消えない。とかがあった)で、Setvarblockみたいなブロックタグに関しては、改行ナシで記述してたほうが安心かもしれませんね。
というわけで、trim="1"
があることには気がついていたけど「えーと前後の余計なもの消すやつあったはず。。消すやつがあったはず。。。」と悩んでいたのは内緒です(涙)。
というか、ありがとうございました。
モジュール関係の入れ込みに関して、MT4はとても便利になったんですけどねー。
エディタでテキストエディタでテンプレートの編集を行うか悩むなぁ。。。
--tab--<mt:SetVarBlock name="hoge" trim="1">
--tab----tab--<mt:ReturnInteger>
--tab--</mt:SetVarBlock>
とか
<mt:SetVarBlock name="hoge" trim="1">
<mt:ReturnInteger>
</mt:SetVarBlock>
なんていう書きかたしてると、mt:ifでちゃんとeq=してくれないみたいです。
かわりに、、
<mt:SetVarBlock name="hoge" trim="1"><mt:ReturnInteger></mt:SetVarBlock>
と書いたら問題なしですら、どうもsetvarblockは改行をなんらかの情報として格納しちゃうみたいですね。
というわけで、setvarblockは改行なし。が良いみたいです。
やまと
<mt:SetVarBlock name="hoge" trim="1">
<mt:ReturnInteger>
</mt:SetVarBlock>
のtrim modifierが機能するかどうかは分かりません。多分しないのでしょう。であるならバグであるとして改善方法を検討するのがよいと思い
ます。
>setvarblockは改行なし。が良いみたいです。
は一面正しいのですが、eqの代わりにlikeを使えば(正規表現を使って)文字列部分一致を検出できます。
<mt:If name="hoge" like="0">
ゼロならこっちを表示したいのだ。
</mt:If>
<mt:If name="hoge" like="1">
ゼロならこっちを表示したいのだ。
</mt:If>
と書いておけば、hogeが"0"や"10"や"100"や"12032"や"Movable Type 4.0"のとき前者が真に、hoge
が"1"や"10"や"100"や"12032"や"Web 1.5"のとき後者が真になるでしょう。
推測ですが、「モディファイアはテンプレートタグの『出力』をモディファイするものなのではないでしょうか。
MTSetVarBlockタグは変数に値をセットしますが、それ自身は何も出力しないので、モディファイアが利かないのではないかと思います。
> > > ただ、MT4のテンプレートエディタ(で今回はずっと作業してるのですが)が良くなった分、そういう変なスペースやタブが入ることがあるよう(別の箇所でもどう しても半角スペースが消えない。とかがあった)で、Setvarblockみたいなブロックタグに関しては、改行ナシで記述してたほうが安心かもしれませんね。
> > > > > yam...@gmail.com- 引用テキストを表示しない -
>
> - 引用テキストを表示 -
いやはや面目ないです。その通りですね。
やまとです。
こんにちわ。
On 9/5/07, 壱 <in...@h-fj.com> wrote:
>
> こんにちは。藤本です。
>
> 推測ですが、「モディファイアはテンプレートタグの『出力』をモディファイするものなのではないでしょうか。
> MTSetVarBlockタグは変数に値をセットしますが、それ自身は何も出力しないので、モディファイアが利かないのではないかと思います。
そうです。効きませんでした。報告するのわすれてました。
> On 9月5日, 午後1:53, Hirotaka Ogawa <hirotaka.og...@gmail.com> wrote:
> > ちょっとくどいかもしれませんが、mt:ifが機能してないってことはないし、eqは正しく文字列比較として機能しています。単に改行コードやタブを含
> > んだ文字列とそうでない文字列を比較して条件が偽になっているだけです。
はい。機能してない。は人聞きがわるかったですね(反省)。
ただユーザーサイドからはそこな機能してないように見える。というだけです。
条件とマッチするパラメータはSetVarBlockで一件格納できてるように見えるので。
> > <mt:SetVarBlock name="hoge" trim="1">
> > <mt:ReturnInteger>
> > </mt:SetVarBlock>
> >
> > のtrim modifierが機能するかどうかは分かりません。多分しないのでしょう。であるならバグであるとして改善方法を検討するのがよいと思い
> > ます。
ですね。trim="1"が効くと万事解決。という気がします。
> >
> > >setvarblockは改行なし。が良いみたいです。
> >
> > は一面正しいのですが、eqの代わりにlikeを使えば(正規表現を使って)文字列部分一致を検出できます。
> >
> > <mt:If name="hoge" like="0">
> > ゼロならこっちを表示したいのだ。
> > </mt:If>
> > <mt:If name="hoge" like="1">
> > ゼロならこっちを表示したいのだ。
> > </mt:If>
> >
> > と書いておけば、hogeが"0"や"10"や"100"や"12032"や"Movable Type 4.0"のとき前者が真に、hoge
> > が"1"や"10"や"100"や"12032"や"Web 1.5"のとき後者が真になるでしょう。
うーん。。。これはなんとなく、解決感が僕にしてみると薄いなぁーと思います。
やはり、if eq=ってやってるときには心情的にはがっちりイコールかを判定させたいのだ。ということですので、期待通り(一番良いのは、setvarblockはデフォルトでtrim="1"が効いていて、改行のことなど考えずに値がセットできることかなと思います)にeq=が正解をみちびいてくれていることだろうかと思います。
でもlikeも良いですね。現状の解決には非常に良いかなーと思いました。
とはいえ、自分は、eqを使う解決の方法を使うと思いますが(それに不安要素を感じられないので、実装の要求を満す方向を選択する。という訳です)。
提案ありがとうございます!!!
とっくに藤本さんがプラグインを書き上げている頃じゃないかと思いますが(笑)
SetVarBlockでmodifierを使えるようにするだけなら下のようなパッチがあればいいかも。
--- ContextHandlers.pm.bak 2007-08-04 06:20:03.000000000 +0900
+++ ContextHandlers.pm 2007-09-05 16:09:45.000000000 +0900
@@ -2118,6 +2118,9 @@
} elsif ($tag eq 'setvarblock') {
$val = _hdlr_pass_tokens(@_);
return unless defined($val);
+ if (my $ph = $ctx->post_process_handler) {
+ $val = $ph->($ctx, $args, $val);
+ }
} elsif ($tag eq 'setvartemplate') {
$val = $ctx->stash('tokens');
return unless defined($val);
採用してもらえればうれしい...かな。
On 9月5日, 午後2:46, "Hiroshi Yamato" <yam...@gmail.com> wrote:
> 藤本さん
>
> やまとです。
> こんにちわ。
>