Hatena::ブログ(Diary)

テノニッキ このページをアンテナに追加 RSSフィード

2007-10-09(Tue)

Underworld

| 22:33 | Underworldを含むブックマーク

懐かしかったのでiTunesで購入。

個人的にはこういうの聞くとプログラム書きやすい。

2 Months Off

2 Months Off

Ethnaのフォームヘルパ

| 23:38 | Ethnaのフォームヘルパを含むブックマーク

EthnaにはフォームヘルパがあるのでActionFormに定義した内容を基に自動的にHTMLタグ(formとかinput)を出力してくれるのだけど、Ethnaのバージョンによる出力内容で少しトラブったのでメモ

なお、元々書き方が甘かったということを前提に書きます。

しかも、今の最新バージョンは2.3.2であることを併せて書いておきます。(なぜか2.3.1と比較...)


早速。

ActionFormでは次の様に定義。

<?php
$form = array(
    'hoge' => array(
         'type'        => VAR_TYPE_STRING,
         'form_type'   => FORM_TYPE_TEXT,
         // 以下省略
    ),
);
?>

で、テンプレートに次の様に書くと...

{form ethna_action="main_foo"}

{form_input name="hoge"}

{/form}

HTMLヘルパが解釈してHTMLを出力してくれるのだけど、この出力結果がEthnaのバージョンによって微妙に違った。

Ethna2.1.2(class/Ethna_SmartyPlugin.php (rev1.14))のときは、

<form action="" method="post">
   <input type="hidden" name="action_main_foo" value="true">
   <input type="text" name="hoge" value="" />
</form>

これが、Ethna2.3.1(class/Ethna_SmartyPlugin.php (rev1.21))では、

<form method="post">
   <input type="hidden" name="action_main_foo" value="true">
   <input type="text" name="hoge" value="" />
</form>

となっていた。action属性がテンプレートに「{form ethna_action="main_foo" action="index.php"}」などと明記しない限り出力されなくなった。

一応、Ethna本体のソースを読むと、2.1.2の頃は、

<?php
     // class/Ethna_SmartyPlugin.php (rev1.14)の一部

     if ($action !== false) {
         if (isset($action) == false) {
             $action = basename($_SERVER['PHP_SELF']);
         }
         $s .= sprintf(' action="%s"', htmlspecialchars($action, ENT_QUOTES));
     }
?>

となっていて、未指定の場合でも入る様になっていたのだけど、レンダラをSmarty以外にも使える対応が行われたとき修正された?のかもしれない。

もっとも自分がテンプレートにきちんとactionを明記しておくべきなのだけど、うっかり抜けている箇所があった…。と。

で、これでEthna2.1.2をEthna2.3.1に上げたときに一般のPC向けブラウザだと確認した限りでは問題なく動いてたり。

ドキュメントを開いたコントローラと同じ箇所にaction属性が指定されたことになるみたい?)

ただ、問題があるのがケータイ

iモード用ブラウザだと、出力HTML中にformタグにaction属性が抜けていると、formタグに挟まれた間にあるinputタグで表現される入力フォームが全く表示されない。(PCブラウザだと出力される)

2.1.2の頃は未記述でも空の「action=""」という属性がformタグに出力されていたので表示されていたのかなぁ。


ともかく、フォームヘルパで{form}と書くときにはactionを必ず指定する様にしたいと思います。。。

riafriaf 2007/10/10 20:37 自分も前にはまりました><!
そのときはAPPID_ViewClassにこんな感じで書いちゃう手抜きで逃げてみました
function getFormBlock($content, $params)
{
if (isset($params[’action’]) === false) {
$params[’action’] = $this->config->get(’url’);
}

return parent::getFormBlock($content, $params);
}
(実際に使ってるはcsrfidの付与とかもここでやったりしてます :-P)

hideackhideack 2007/10/11 00:14 おぉ。具体的な内容をありがとうございます。
早速、試してみたいと思います〜。これだと、うっかり書き忘れたときも大丈夫ですねぇ。