Category Archives: Flexy

Flexy

携帯サイトのセッション変数埋め込みのためにFlexyのurl_rewriteオプションを使ってみる

携帯サイトでログイン情報をページをまたいで保持しておくには、何らかのセッション変数をずっと渡して行く必要がある。
AUとvodaの場合は、携帯電話の端末IDがリクエストごとにUserAgentやリクエストヘッダに埋め込まれて送られてくるので、ログイン時にサーバに保存しておいて、あとはリクエストがきた時にそれを参照すればどのユーザのリクエストなのかを判別することができる。

参考: たちばな弁当: 個体識別情報、EZ番号、端末シリアル番号の取得方法

が、問題はドコモ。こいつは端末IDを送信させると警告が出る。なので、毎回端末IDを送ってもらうわけにはいかない。結果として全てのリンクにセッションIDを埋め込む必要がある。

HTMLのタグを最小の単位として処理を行うところが特徴的なテンプレートエンジンFlexyには url_rewrite といういかにもこういう “全てのリンクの最後にセッション変数を埋め込みたい” というニーズをかなえてくれそうなオプションがある。だから使ってみた。
このオプションをオンにすると、テンプレートをコンパイルする時に img, a, srcript の href, src を正規表現に従って書き換えることができる。しかし、正規表現で思い通りにセッションIDを付け足すのはかなり困難。(hrefに?がないときは?k=…..を付加して、あるときには&k=….を、とかはFlexyのurl_rewriteでは書けない。また、正規表現自体に : と , を含めることができない。このへんな制約は HTML/Template/Flexy/Compiler/Flexy/Tag.phpの reWriteURL() の実装がそうなっているから。
なので、さくっと書き換えてコールバック関数を与えてそこで自由に書き換えるように変更した。呼び出し側はこんなかんじ。

  $opts['url_rewrite'] = create_function( '$u', 'return session_rewriter($u);' );
  function session_rewriter ($u)
  {
    $delim = ( preg_match( '/[?&][^\/]+$/', $u) ) ? '&' : '?';
    $u .= "${delim}k=$fingerprint";
  }

で、めでたく最後にセッションIDがつくようになる。

と思ったら、なんか動的に出しているリンクにはセッションIDがつかなくて、どうもFlexyの仕様で reWriteURL() はhrefの中にflexy変数を含まないURL(つまりスタティックなURLだけ)に対してしか呼ばれないようになっているようです。
スタティックなリンクだけ書き換えられてもありがたみが薄いので url_rewrite は使えない、とわかったところで帰ります…..

Flexyでform要素の重複エラーを回避する

Smartyより早いらしいFlexyの話。
Flexyでは、ひとつのテンプレートの中で、同じnameを持つform要素があるとFlexyは文句を言ってコンパイルしてくれない。でも、複数のformの中で、たとえば user id を送るためにuidという要素を複数作りたいとかいうことはよくあって、この仕様はけっこう邪魔になる。これをごまかすにはformの中身を全部外部ファイルにすればよい。で読み込むファイルの中のform要素名はチェックされないようになっていて(コンパイル時間短縮のためにこうなっている?)、nameが重複していても黙っていてくれるようになる。

ただ、外部ファイルにすると compile() を呼び出すようになるからか、同一ファイルに同じことを書いているときよりもパフォーマンスが落ちる。(外部ファイルもいったんコンパイルされるので、最終的にはコンパイルされたPHPファイルをincludeするだけなはずなんだけど実際遅くなる)
それと、確認したわけではないけれど Element->setValue() とかが正しく効かなくなる気がする。