2009/04/21

htmlテンプレート置換表示時の特性

コメントアウトした部分を対象に置換命令などを行っていると、
思わぬ所で通常起こりえないバグが発生するw

例えばトップページからリンク先に行き、トップページに戻った時だけ、
テーブルタイトルが増殖したり、そんな根拠ははっきりしてるが、
同じページに対して同じ処理をしているはずなのに!

という、厄介な事が起きる場合がある。

無駄な処理はちゃんと消しておきましょう。

php-textareaの特性

※textareaからマルチラインで渡される引数はhiddenフォームに埋め込むと持ち運びできない。
確認画面で一度表示するのであれば、潔く一度確認画面の時点で何かに記録するしかない。

環境依存かもしれないが、\r\nを
に置換しようが何をしようが、入らないものは入らない。
[]や【】が含まれている場合だけかもしれないが、hiddenに入らないことがある。

2009/04/15

htmlテンプレートやdbのカラム名の重要性

今までは、手書きでちまちまと、置換対象の文字列を、php側とhtml側、db側の要素名をそれぞれある程度、適当につけてきたので、そりゃーもう面倒な毎日だったが、

頭の中をよく整理してみれば、ルールをいくつか決めるだけで、
いろーんな事が手軽になる。


たとえば、htmlテンプレート上の置換は、
$arg$
みたいな感じだが、
特にinputフォームの要素には、
$input_arg$
みたいにしておくと、同じ画面で登録済みのデータも列記する場合に
$arg$と書いてて同じ変数名なので同時に消えましたみたいな事を回避できる。
ので、
$list_arg$としておくと便利。
さらに、意味を含ませていけば、セレクトボックスなんかはもちろん
$select_arg$にしておくとよい。
また、マスターテーブルから取得するような値は、格カラム名にselectを意味するものをつけておくとよい。
$list_real_arg$とか$list_select_arg$とか。

そうやっとけば、mysql_field_nameなどでカラム名がある間ループさせ、
$arg = mysql_field_name($i);
$_SERVER["INPUT"]["input_".$arg] = $tmp[$arg];
$i++;
終わったら、テンプレートファイルをfile_dataとして、置換関数を用意しておき、
array_walk($file_data,'input_replace');
とかで対応できるだろ?

イチイチ$_SERVER["INPUT"]["INPUT_M_ADMIN_name"] = とか書くのは卒業したかったんだ、ほんと。
人の皮向けました。

htmlテンプレート置換処理時間の検証

fileでテンプレートのhtmlを取得し、埋め込まれた変数を置換する場合、array_searchでとか書かれた部分の位置を取得し、forでfileで取得したテンプレートの該当部分だけを置換するのは良いとして、array_walkで、arrayに対して$_SERVER["arg"]とかで総当り置換をかける場合と、fileで取得したarrayを通常の変数に.=してしまってから、str_replaceやpreg_replaceした方が早いか気になっていたので検証してみた。

やることはそのまんまで、置換要素をfor1~1000で用意して、array_walkする場合と、fileを通常変数化してからforの中でstr_replaceしてみると、

array_walkのが早かった。
step数はかなり多いのになぁ。

厳密にはfileじゃなくてfopenとかfile_get_contentsでやってみたが、array_walkに負けた。

テンプレート配列への1000個の要素置換で0.18秒 と0.14秒ぐらいの差。

よほど他の処理が重くなければ、テンプレート置換処理自体はさほどの処理影響を与えないともいえる。
というか1000個も要素あっても画面的にみにくくてしょうがないので、現実的にはもっと置換要素は少ないはずでしょぅ。

うまー。