cakephpのsecurityコンポーネントで二重投稿対策(携帯サイト編)

· application

前回のエントリーでは、携帯サイトで対応できない場合がありました。

具体的には、とある機種で、かならず二重投稿と判定されてしまい、投稿ができない現象でした。それを回避する方法をエントリーします。

原因

調べてみると、なぜか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

なんか理由があるんでしょうけど、検討がつかんな・・・

画像未復旧: hatena.gif

関連があるかもしれないエントリー