Smarty がミリ秒を扱わない迷惑さ

/ php

PHPの優秀なテンプレートエンジンとして名を馳せているらしい Smarty が、何かミリ秒に対応していないようでして。今日びミリ秒が扱えないって、「ウチのテレビはリモコンが無いんですのよ、オホホホホ」ってくらい迷惑ですよ。

事の発端は、Flash で日付データを取扱うために、サーバから現在時刻を取得しようと考えたところにある。ローカル時間だと不正が効くからね。普通なら、直接 Flash から CGI にリクエスト投げて終わりなんだけど、今回は好き勝手にプログラムを追加できない事情にさいなまれ、苦心。

ここからが長かった…。(ネズミの時間で1週間くらい)

「よーし、その Smarty ってヤツでサーバ時刻を flash に変数渡ししてやろうじゃねえか。へっへっへ、覚悟しな!」

Smarty では現在時刻を $smarty.now で取れるらしいと聞いたので、早速試してみた。んで、展開されたコードが以下。

コード:<param name="FlashVars" value="ctime={$smarty.now}" />
展開後:<param name="FlashVars" value="ctime=1130580922" />

あのー、桁が足りないんですけど。

マニュアルを見てみると、「この時間にはエポックから経過した秒数が反映されます」とのこと。誰に許可取ってミリ秒切り捨ててんだよ…。ミリ秒を笑う奴はミリ秒に泣くんだよ…。ミリ秒にも五分の魂なんだよ…。勢いで言っているよ…。ううう。

しかし、嘆いても仕様なのだから仕方がない。最大0.9秒の誤差はあれど、耐えがたきを耐え、忍びがきを忍び、1000とか掛けちゃう実験。

コード:<param name="FlashVars" value="ctime={$smarty.now*1000}" />
展開後:<param name="FlashVars" value="ctime=1.130583281E+012" />
flash :ctime = NaN

…ぬるい、仕様がぬるすぎる。こんなぬるい味噌汁食えるかってんだ。コンチキショウ。分かったよ、分かった。flash側で1000掛けてやれば良いんですよね。ASは優秀だもんね。初めからそうすれば良かった。

_root.ctime *= 1000;
trace(_root.ctime);  //1130580922

よしよし…と思ったのも束の間。なんか数フレーム後で MovieClip から _root.ctime を参照したら、1000掛ける前の状態。あれ、FlashVars で渡した値とかって上書きできないのでつか。そうでつか。

いい加減、こんな小さいところでアレコレするの面倒になって、奥の手。

コード:<param name="FlashVars" value="ctime={$smarty.now}000" />
展開後:<param name="FlashVars" value="ctime=1130580922000" />
flash :ctime = 1130580922000

超ズル。でもミッションクリティカル。正常動作を確認して、ほっと一息。こういう場合の一番スマートなやり方は何だろう。教えてエロイ人。

このエントリーのトラックバックURL
http://www.deftrash.com/admin/mt4/mt-tb.cgi/279