ログ日記

作業ログと日記とメモ

loop機構を追加したものを上げた

http://github.com/nishimura/Fly

自分で書いてるコードは全てforeachじゃなくてloopになってるから、取り敢えずloop追加だけやった。


loopはFlexyの前に使っていたPHP4 テンプレートクラスライブラリ改 - tmpl2.class.phpに影響されてる。
変数が少なくてコンパイル不要な場合なら今でもそこそこ使えると思う。


プログラムを書かない人がぱっと見ただけだと、foreachは意味不明だけどloopなら何となく分かる、という視点。

JavaScript連携できたのね & PEAR依存なしのFlexy

もう3、4年Flexyを使っているが、ベータ版の頃からJavaScript連携はできたらしい。
JavaScriptPHPの変数を入れたいけどFlexyだとスクリプトタグの中は見てくれないんだよなーと思っていたところ。

Release date: 2003-12-19 21:52 UTC
Release state: beta

(snip)

New features

  • <flexy:include src="xxx.html"/> to include other templates
  • <flexy:toJavascript flexy:prefix="js_name_prefix_" jsvar="php_flexy_var" ....>
HTML_Template_Flexy :: 0.6

この頃ってテンプレートエンジンの考え方も知らなかった頃というか…PHP書き始めたぐらいか。



マニュアルにも書いてるのに…。
http://pear.php.net/manual/ja/package.html.html-template-flexy.attribute.tojavascript.php
使い方を調べてた頃はJavaScriptを書いてなかったからスルーしてたっぽい。


2008年にはtoJsonがサポートされてる。2006年で開発終了かと思ってたよ。
バージョンを上げたいところだけど、独自カスタマイズの反映がめんどい…。
PEAR依存が嫌だからテンプレートエンジンも自作したいんだよね。機能的にFlexyで足りないところはないし、むしろHTMLを解析してくれるっていうのが気に入ってるんだけども…。自作して似たようなものを作るならHTMLパーサ書かないとダメだな。そうなるとPHPである必要すらなくなってくる…どうしよ。



これ書きながらキーワードリンク見てたら、PEAR依存を切って公開してる方を発見!
http://d.hatena.ne.jp/noopable/20091008/1254992477
http://github.com/noopable/Fly
Tokenizerもいじるみたい。素晴らしい。
Compiler_Flexy_FlexyのtoJavascriptToStringもうまく変更してある。見間違い…。
これをcloneして移植しようかなぁ。

FlexyのtemplateDirは複数指定できる

templateDirを複数指定したい場合はどうすればいいのか…独自にfile_existsで調べていってファイルが存在したディレクトリをtemplateDirに指定すればいいのか…とか色々考えてたけど、ソースを見たら元々複数指定できるようになっていることに気付いた。なんて今更orz
templateDirsとかにしてくれれば…。

Behaviour changed

  • templateDir can be an array, or string seperated by the system path seperatory

(; on windows,: on unix)

  • If a file exists in multiple paths, then The LAST FOUND template will be used.

(previously this emited an error)

  • If you use multiple paths in the template_dir, then the path will be modified to

write to {compileDir}/{basename(actualTemplateDir)}_{md5(actualTemplateDir)}/...template..

HTML_Template_Flexy :: 0.7

これで、フレームワークのテンプレートを調べてプロジェクトのテンプレートを調べて、ある方を使うっていうのが簡単にできそう。取り敢えず思い付くのはエラーとdefault indexだけなんだけど。

flexy改造動画

巷では1000人スピーカプロジェクトというのが流行ってるらしい。
そっち方面のことはあまり知らなかったんだけど、flexyの話が出るということなのでちょっと調べてみた。
もう3回目になるんだね。
http://ja.doukaku.org/wiki/index.php/1000speakers


phpLexで字句解析に挑戦 - maru_cc [3-36] - ニコニコ動画
PHPからQIQへ - rsk [3-34] - ニコニコ動画
Partty!.orgでペアプログラミング - frsyuki [3-33] - ニコニコ動画
IT屋よりもスイーツ(笑)のほうがすごい件 - tokoroten [3-40] - ニコニコ動画
結構面白そう。


flexyスライドの一枚。

  • 変数
<span id="hoge">a</span>
    • idで置換
  • foreach
<tr class="fuga">
    • PG側で配列をassign
  • 便利かも!

確かに便利かも!
でもタグ属性に flexy:dynamic="yes" を入れていないとコンパイル時に解析対象にならないからなあ。全タグをdynamicと同じ扱いにするのはやりすぎな気がするし。
flexy->compile()の時点で動的エレメントが決まってしまうから、その時点でclassやid解析が出来てないと駄目だよね。


やっつけ的でいいなら

<?php
$flexy = new HTML_Template_Flexy(...);
$flexy->setDynamicElements(array(array('id' => 'hoge'),
                                 array('class' => 'fuga')
                                 ));
$flexy->compile('template');

とか新しい関数作れば出来そうだけど、スマートにやる方法は簡単には思い付かないや。
コンパイル時にオプション配列を受け取って、それを元にコンパイルの動作が変わるとかやったら面白いかも。



・・・ていうか、PEARに依存しないflexyクローンを作りたい。
PEARの機能をほとんど使ってないのに依存してるのはいただけない。それにC#で解析機構を作ってるなら、extensionで提供してくれてもいいと思ったりもする。


ともかく、flexyは便利だしHTMLを崩さない思想がいいのでみんなもっと使うと良い。




最近気付いたけど、hawkさんのサイトが見れなくなってた。
私の知ってる限りflexyの情報が一番分かり易かったのに・・・なくなる前にローカルに落としてミラー作ってもいいか聞いとくべきだった。


困ったときのwebarchive・・と思ったけどイマイチ。
http://web.archive.org/web/20051220153126/http://www.hawk.34sp.com/stdpls/php/flexy/


tracwikiは割と好きなので http://code.google.com/p/laiz/wiki/HTML_Template_Flexy こっちにまとめ直すという手もあるな。
# なんか今見てみたら本家マニュアルが分かり易くなってた。まぁとりあえず色々保留。

久しぶりにflexyキーワードを見てみると・・

何気なく HTML_Template_Flexy のキーワードを見ていたら、パーサを解析している人を発見した!

http://d.hatena.ne.jp/maru_cc/20080316/1205690507


どうやら2005年からTokenizer.lexをいじる日本人は増えていない模様。
私の場合はloop作ってid属性の動作変えてhidden属性の挿入やって、満足してしまったのであれからいじってないなぁ・・。


一応 Nishimura's Site ここのコードは

svn co http://laiz-source.googlecode.com/svn/Laiz/trunk/laiz/HTML/Template/ Template

でDLできるけど、随分前のコードなので解説できるほどでもなしorz


ちなみに http://d.hatena.ne.jp/katase_n/searchdiary?word=Tokenizer ここに書いてある通り、オプションで

<?php
$options = array('compiler'    => 'FlexyEx',
                 'compileDir'  => 'compiled',
                 'templateDir' => 'templates');
$flexy = & new HTML_Template_Flexy($options);

このようにFlexyExを指定した場合のみカスタマイズ動作になるようにしている。

チェックボックスの操作でsetValue(true)としてはいけない

勘違いしてた。

<?php
...
$radioElement->setValue(true);

でチェックがオンになるんじゃないんだな。動いてたのは偶然。


flexy内部では

<?php
// Element.php
...
if ($this->attribute['value'] == $value){
    $this->attribute['checked'] = true;
}

という操作が行われている。


どういうことかと言うと、idでエレメントを判断できるにもかかわらず、setValue()の引数はvalue値と同じ値でないといけないのだ。
今までたまたま動いていたのは

<?php
if ('radioValue' == true)

がtrueを返すからだ。普通にradioのvalueにテキストを入れていればsetValue()でtrueを設定しても問題ない。
問題が起こるのはradioのvalueで数値の0などを記述していた場合。

<?php
if ('0' == true)

これはもちろんfalseになるので、checkedにならない。
なので、radioボタンに対するsetValue()はvalue値にするように統一した方がいいな。


どこを見てtrueを設定すると思ったんだろう・・。


もし
Nishimura's Site
ここを見て勘違いした人が居たらスミマセン・・。
検索で上位に出てくるようにしていたので、間違って覚えられていたら申し訳ないな。。
該当の部分はたった今直した。