cakephpのsecurityコンポーネントで二重投稿対策(携帯サイト編)
前回のエントリーでは、携帯サイトで対応できない場合がありました。
具体的には、とある機種で、かならず二重投稿と判定されてしまい、投稿ができない現象でした。それを回避する方法をエントリーします。
原因
調べてみると、なぜかhiddenではちゃんとトークンが書かれているのに、次の画面にPOSTされていないことが原因でした。それはなぜかを調べて分かったこと。
携帯の特定の機種ではdisplay:none; が利いたinputタグは値が飛ばない
ということでした。情報ソースはこちら(cake.jp:携帯のblackhole 対策)
解決方法
そこで、display:none; が書き出される、$form->create() と $form->end() をmobileutilsクラスを作ってオーバライドしました。
先のリンク先を参考にこんな感じにしました。
class MobileutilsHelper extends Helper {
var $helpers = array('Form');
function create($model = null, $options = array()) {
return strip_tags($this->Form->create($model, $options), '<form><input>');
}
function end($options = null) {
return strip_tags($this->Form->end($options), '<form><input>');
}
}
あとはこのファイルをapp/views/helpers/mobileutils.php として保存します。
利用法
対象のフォームがあるコントローラで、ヘルパーとして読み込み
class HogeController extends AppController {
var $helpers = array('Mobileutils');
・・・(省略)・・・
フォームを出力する際に
echo $mobileutils->create('Hoge');
echo $mobileutils->end('submit');
このように出力すると、display:none;を指定しているfieldsetタグが除去され、無事値がPOSTされました。
感想
ハマって調べてやっと分かったときは、まず、なんで特定の機種で値とばないの!って思いましたが、
いやその前にfiledsetタグってなんなの!?とか、突込んでしまいましたw
なんか理由があるんでしょうけど、検討がつかんな・・・