SHIFTRA

電車の暇つぶしでblogしてみる
2012年02月
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
Small Services...
カップラタイマー
計測サービス

パスワード自動生成サービス
ブログ内コンテンツ一覧
- コンテンツのカテゴライズ -
NEW ENTRIES
ARCHIVES
- 他へのリンクなど -
エコ親子~夏休み省エネチャレンジ

LINK
Release Contents
このサーバからは、こんなコンテンツが発信されています。(アイウエオ順)
etc.
Googleにはこれだけ登録されてます。
Related Links...

Powered by
BLOGN(ぶろぐん)
 

Flexy で チェックボックス/ラジオチェックの動作がおかしい点について


PHP/PEARライブラリの Flexy というテンプレートエンジンを触って見ました。

Flexyの特徴としては、タグの中に属性値として if処理と foreach処理が指定できるので、WYSIWYGソフトでHTML編集をした際にレイアウトが崩れにくいというのがあげられます。
詳しい内容とインストール手順は、他サイトに任せます。

その際に、いくつか動作がおかしい点を見つけデバッグしました。
バグというよりは、PHP5での動作を考慮していないのだと思います。ファイルの先頭に、「PHP Version 4」と書かれていますし。

---
追記&再編集: 08/02/24
08年1月末に、まさかの新バージョン(v1.31)リリースです!^^
ちょっとびっくりしました。もう保守されないのだとばかり思っていたので。ただ、まだ PHP4 向けのようですが。
---

■ところで、HTML/Template/Flexy/Compiler/Flexy/Tag.php の先頭に、PHP4 では clone()関数を定義する処理が書かれています。
 どうせなら HTML/Template/Flexy.php で書けばいいのに。
 PHP4でも PHP5でも利用したい人は、このページで書かれている修正について、clone()関数を利用するようにしてください。


■ちなみに、この文章は以下のような場合を想定しています。

 checkbox / radio とも id と name の値が違います。
 name は [] で配列送信ができるようにし、id は <label>でも利用できるよう独立させています。
 <input type="checkbox" id="favorite_apple" name="favorite[]" value="りんご"><label for="favorite_apple">りんご</label>
 <input type="checkbox" id="favorite_orange" name="favorite[]" value="オレンジ"><label for="favorite_orange">オレンジ</label>


 radioの場合は 配列送信でもそうじゃなくても大丈夫です。
 <input type="radio" id="sex_male" name="sex" value="男性"><label for="sex_male">男性</label>
 <input type="radio" id="sex_female" name="sex" value="女性"><label for="sex_female">女性</label>


---



PEAR/HTML/Template/Flexy.php mergeElement()
    function mergeElement($org, $new)
{
// no original - return new
if (!$org) {
return $new;
}
// no new - return original
if (!$new) {
return $org;
}

$original = clone $org;



(※この修正は、PHP5で利用する場合に限ります。PHP4で利用する分には問題ないはずです)
Flexy全体でそうなんだと思いますが、オブジェクトのコピーの処理が修正されていません。
オブジェクト以外は、 = で右辺から左辺へ「複製」が行われますが、オブジェクトは「参照渡し」が行われます。
複製を行いたい場合は = clone $object としてください。

念のため、オブジェクト以外で「参照渡し」をしたい場合は =& $another です。




PEAR/HTML/Template/Flexy/Compiler/Flexy/Tag.php 770行目あたり
    if (!isset($this->elements['.$printfvar.'])) {
$this->elements['.$printfvar.'] = clone $this->elements[\''.$id.'\'];
}
$this->elements['.$printfvar.'] = $this->mergeElement(
$this->elements[\''.$id.'\'],
$this->elements['.$printfvar .']
);



上記の変更点は2箇所で、clone と、mergeElement()関数に渡す第2引数を修正しています。

第2引数のほうは、たぶん単純ミスでしょう。修正前でも、エレメントで name属性とid属性の値が同じ場合は問題になりません。
しかし、チェックボックスとラジオチェックでは、id属性とname属性に違う値を設定することが多いので、ここの動作が問題になるはずです。




PEAR/HTML/Template/Flexy/Compiler/Flexy/Tag.php 759行目あたり
            if ((strtolower($this->element->getAttribute('TYPE')) == 'radio')
|| (strtolower($this->element->getAttribute('TYPE')) == 'checkbox')
)
{



最初の修正を行わないと radioでの動作がおかしく、修正すると checkboxでの動作がおかしくなります。
個人的には、どうして radioとcheckboxの動作を切り分けする必要があるのかなぁ なんて思います。
| プログラムの話 | 03:02 AM | comments (0) | trackback (0) |
コメント

コメントする









この記事のトラックバックURL
http://www.shiftra.jp/shounari/tb.php/66
トラックバック
PAGE TOP ↑