テンプレートにスコープ解決演算子が欲しい
例えばこんなの。
<?php class ItemChangeConfirm { public $oldItem; public $newItem; public $itemId; public function execute(DaoFactory $factory){ $itemDao = $factory->get('item'); $item = $itemDao->getVo($this->itemId); $this->oldItem = clone $item; // $item->itemValue = 'old value'; if (!ItemChanger::change($item)) return 'error'; // $item->itemValue = 'new value'; などに変更されるものとする。 $this->newItem = $item; } }
<p>変更前のアイテム</p> {begin:oldItem} <ul> <li>名前 {itemName}</li> <li>コード {itemCode}</li> <li>値 {itemValue}</li> </ul> {end:} <p>変更後のアイテム</p> {begin:newItem} <ul> <li>名前 {itemName}</li> <li>コード {itemCode}</li> <li>値 {itemValue}</li> </ul> {end:}
こういうことをしたい。
・・・って書いてたら現状で出来る解決方法を思い付いた。
<?php class ItemChangeConfirm { public $ITEMS; public $itemId; public function execute(DaoFactory $factory){ $itemDao = $factory->get('item'); $item = $itemDao->getVo($this->itemId); $ITEMS = array(); $oldItem = clone $item; $oldItem->subject = '変更前のアイテム'; $ITEMS[] = $oldItem; if (!ItemChanger::change($item)) return 'error'; $newItem = $item; $newItem->subject = '変更後のアイテム'; $ITEMS[] = $newItem; $this->ITEMS = $ITEMS; } }
{loop:ITEMS} <p>{subject}</p> <ul> <li>名前 {itemName}</li> <li>コード {itemCode}</li> <li>値 {itemValue}</li> </ul> {endloop:}
これで出来ちゃうや。
チェックボックスを配列で扱う場合
<input type="checkbox" name="checkA[]" value="A1"> <input type="checkbox" name="checkA[]" value="A2"> <input type="checkbox" name="checkB[]" id="check1" value="B1"> <input type="checkbox" name="checkB[]" id="check2" value="B2">
こういう場合。
flexyではname属性値の最後二文字が[]の場合、setValue()の引数が配列でなかったら何も処理が行われない。
例えidを指定して一つの値を設定する時でも配列でなければいけない。
という動作にハマった。checkboxを配列として扱う場合は $element->setValue((array)$var); とやれってことかな。
ただし
<input type="checkbox" name="checkA[1]" value="A1"> <input type="checkbox" name="checkA[2]" value="A2">
などとすると、また話が違ってくるので注意。
idとname属性を両方有効にした場合に同じ値を設定できるようにした
なんでHTML_Template_Flexyでid属性を読み取るように改造したのか忘れてしまった。
当時日記に書いてたよなーと思って検索してみるとやっぱり書いてた。
こういうとき日記に自分用メモがあると考え方が分かって便利。
○○前のコードは他人のコード。と同じように、○○前の考え方は他人の考え方、だ。
http://d.hatena.ne.jp/katase_n/20051026
フォームが2つ以上ある場合、nameが同じものが複数有る場合だとエラーになるからidで区別したい。
あぁそうか。
ログインフォームと登録フォームを同じページに配置した場合、name="mail" とかがかぶるからか。
今作ってるページは無意識にname属性を別の値にしていた・・。
でもこの仕様だと不都合だということに気付いた。
<form name="login" action="login.php"> <input type="text" name="mail" id="loginMail"> <input type="submit" value="login"> </form> <form name="regist" action="regist.php"> <input type="text" name="mail" id="registMail"> <input type="submit" value="regist"> </form>
このようにすれば確かに同じname属性値を使ってもエラーは出なくなったんだけど、リクエストパラメータがmailで来てるのにflexyではloginMailやregistMailで識別されるから初期値の設定がややこしくなる。
なのでここはname属性値をloginMailのようにするのが吉だと思った。
一番の問題は name="mail" id="mail" としたときにエラーが出ていたこと。これは考え方をミスっていただけなので直したんだが・・結局idはradioとcheckboxのみ解析するデフォルトの動作に戻した方が使いやすいのかも。
idはjavascriptで使うんだよね。だからflexyで操作する識別子としてはidを使いたくなくなってきた。
あの頃はバージョン管理をやってなかったので元に戻すのは手作業になるな・・。まぁテキストボックスを複数配列にまとめたいときがあるかもしれないから残しておいてもいいか。
ループ中のフォーム操作
せっかくフォームを操作できるflexyを使っているのに、ループ中だと使えないのが困る。
foreach中で
{loop:forms} <tr> <td><input type="text" name="foo" value="{foo}"></td> <td> <select name="bar"> {loop:bar} <option value="{valueKey}">{valueText}</option> {endloop:} </select> </td> </tr> {endloop:}
とかやらなくちゃいけない。
# {loop:var}は独自拡張なので{foreach:key,value}の代わりと思ってもらっていい。
textはまだ良いとしても、selectのoptionを手動(?)で書くのがスマートじゃない。
flexyを使ってるんだからelement->setOptions()を使いたい。
でもループ中だからといってループの数だけelementオブジェクトが存在するわけではないのでループ毎に違う値を設定できない。
ループ毎に違うelementを自動で設定するように改造するのは結構苦労しそうな予感がする。
どうしたものかなぁ・・。
flexyを使ってる人はどうやってるんだろう。
ループ中にelementと対応する変数を発見したら毎回setOptions()を呼び出すとか?それでうまくいくのかな。
flexyのelementの設定はoutputの前に行って、ループ中の変数はoutput時に行われるから、普通に考えると実装できないような・・。
mapleのflexyビューを見ても、単純にelementの数だけチェックしてループ中のelementは考慮に入れてないような感じ。そもそもflexyビューは$foo_optionsに反応するからループ中に配列があったからと言って関係ないのか。うーむ。
キーワード
HTML_Template_Flexyのキーワードを作ろうとしたけどちょっと迷った。
「site:d.hatena.ne.jp HTML_Template_Flexy」で検索したら自分の日記出過ぎorz
あまり需要ないんかな・・。
まぁ作ってみるか。。
〜〜〜〜
ということで作った。
日本語がおかしいような。あとふりがなが途中で切れちゃう。
まぁ誰かが直してくれるでしょう。。
Flexyの使い方
http://pc8.2ch.net/test/read.cgi/php/1118799352/126-127
freeze()は使わない方が良い、と。
http://pc8.2ch.net/test/read.cgi/php/1118799352/656-664
scriptタグも厳しいよ、と。
[Maple-user: 207] Re: Flexyの使い方について
{foreach:action.getBrandlist(), value} <option value={value[0]}>{value[1]} {end:}
selectタグの設定は $element->setOptions() を使うのがスマートだと思う。
ってML投稿から時間が経ちすぎているな。
あとoptionタグって閉じないもんなの?私は気持ち悪いから閉じているんだが・・。