a-blog cmsでpost_includeにコールバックを仕込む+追記でキャッシュコントロールについて

post_includeの完了を待ってから処理を挟む

a-blog cmsのpost_includeと呼ばれる機能(平たく言うとHTML的にはformで書いておくと,jQueryでゴニョって勝手にajaxリクエスト化してくれる)で,callbackをさせたかった.そいで,jsファイルのナマAPIを見ても引数にcallbackがなくて(´・ω・`) としてたのですが・・・.

スクリプトベースならjQuery.ajax使えばいいじゃんという向きもございますが,それはそれな都合がございまして(略)

あるじゃないのー

コードちゃんと読んだらonresetに仕込めるみたい.

<!-- 例えば処理を関数にしておいて -->
<script type="text/javascript">
function onPostIncluded() {
    // post_includeで読み込まれた要素の操作とか
}
</script>

<!-- onresetに仕込んでおくとよい -->
<form action="" method="post" class="js-post_include" onreset="onPostIncluded();">
     <input type="hidden" name="tpl" value="/include/partial.html" />
     <input type="hidden" name="bid" value="%{BID}" />
     <input type="submit" name="ACMS_POST_2GET" />
</form>

ニッチな小ネタということで.

追記 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();