a-blog cmsでpost_includeにコールバックを仕込む+追記でキャッシュコントロールについて
Posted: Updated:
post_includeの完了を待ってから処理を挟む
post_includeのナマAPIにcallbackない…(´・ω・`) って思ったら,form.onresetにセットすればいいのか.なるほど.
— 荒ぶるあほう (@ahomu) March 6, 2012
a-blog cmsのpost_includeと呼ばれる機能(平たく言うとHTML的にはformで書いておくと,jQueryでゴニョって勝手にajaxリクエスト化してくれる)で,callbackをさせたかった.そいで,jsファイルのナマAPIを見ても引数にcallbackがなくて(´・ω・`) としてたのですが・・・.
スクリプトベースならjQuery.ajax使えばいいじゃんという向きもございますが,それはそれな都合がございまして(略)
あるじゃないのー
コードちゃんと読んだらonresetに仕込めるみたい.
ニッチな小ネタということで.
追記 post_includeで読み込む部分のキャッシュ更新間隔
a-blog cmsにおいて、キャッシュを無視した最新情報の表示で、よくやるのはこういうコードです。ただし、これだと誰かがページを開くたびにpost_includeによってページキャッシュが生成されるので、下記のデメリットが考えられます。
- サーバはキャッシュを利用せずにレスポンスを返すので、どうしても応答が遅くなる
- 表示するたびに新しいキャッシュ(恐らく2度と使われない)を生成することになる
<form action="" method="post" class="js-post_include">
<!-- リクエストのパラメータに ?hash=(ランダムな数字)を付与して、
URLを一意にすることで、キャッシュを無視してページを新規生成させる -->
<input type="hidden" name="hash" value="Math.random()" class="js-post_include-eval_value" />
<input type="hidden" name="query[]" value="hash" />
<input type="hidden" name="tpl" value="include/partial.html" />
<input type="hidden" name="bid" value="%{BID}" />
<input type="submit" name="ACMS_POST_2GET" />
</form>
js-post_include-eval_value
というクラスが付与されたinput要素は、自身のvalueをevalで評価したあとの値に置き換えられます。
別に毎回超新鮮じゃなくてもよい
サーバサイド(CMS)のキャッシュの更新周期をコントロールできないから、都度post_includeで取りに行くというアプローチですが、何も常に超あたらしい情報を取得しなくても良いケースは少なくありません。
たとえば、post_includeで読み込むにしても更新は1時間に1回でよいとすれば、js-post_include-eval_value
の値は、このように表現すればよいでしょう。
<input type="hidden" name="hash" value="var d = new Date(); new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), 0, 0).getTime();" class="js-post_include-eval_value" />
簡単ですね、hashを日時を元に生成して、分と秒は0で揃えています。
さらに次のようにやれば、1日に1回になります。時と分と秒を0で揃えています。
<input type="hidden" name="hash" value="var d = new Date(); new Date(d.getFullYear(), d.getMonth(), d.getDate(), 0, 0, 0).getTime();" class="js-post_include-eval_value" />
同じ要領で手を加えれば、もう少し細かい制御も可能です。これで、post_includeによって生成されるキャッシュの分量をコントロールできるんじゃないでしょうか。グローバル変数で、何月何日の何時のときの情報です、と但し書きを沿えればより丁寧ですね。
蛇足
うーん、サンプルが微妙だったのですが、さらに微妙なのも。
// 変数なしならこういうの・・・きしょいか
new Date(String.prototype.replace.call(new Date(), /(\d{2}):(\d{2}):(\d{2})/, '$1:00:00')).getTime();