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を必ず指定する様にしたいと思います。。。
自分も前にはまりました><!
そのときはAPPID_ViewClassにこんな感じで書いちゃう手抜きで逃げてみました
function getFormBlock($content, $params)
{
if (isset($params[’action’]) === false) {
$params[’action’] = $this->config->get(’url’);
}
return parent::getFormBlock($content, $params);
}
(実際に使ってるはcsrfidの付与とかもここでやったりしてます :-P)
おぉ。具体的な内容をありがとうございます。
早速、試してみたいと思います〜。これだと、うっかり書き忘れたときも大丈夫ですねぇ。