【CakePHP2.3】単独動作するサブミットボタンを出力する。

FormHelper::postButton()メソッドを使う。
フォーム入力の確認画面やAjaxを用いたサブミットボタンなどを実装したい場合にとても便利。

■関数定義

$this->Form->postButton($title, $url, $options)

■引数詳細

プロパティ 初期値 詳細
$title 省略不可 ボタンに表示する文字列を指定
$url 省略不可 値のサブミット先URLを指定。例の如くRouter::url()形式のフォーマットで指定可能
$options array() オプション値。フォームオプションの他、array(‘data’)に入力データを渡してやることでhiddenタグを吐かせることも可能

 

以下例。

まずは入力欄のビューで以下のようなフォームを生成したと仮定。
※項目は超適当。

<?php echo $this->Form->create('Hoge'); ?>

<?php echo $this->Form->input('name', array('type' => 'text')); ?>

<?php echo $this->Form->input('password', array('type' => 'password')); ?>

<?php echo $this->Form->input('url', array('type' => 'url')); ?>

<?php echo $this->Form->end('Send'); ?>

上記で出力されたフォームより送信された値を処理するアクション内(確認画面を想定)で以下のように値をそのままビューに渡してやる。
※ここでは省略しているが、バリデーション処理をしないと脆弱性の塊なので注意。

$this->set('data', (!isset($this->data['Hoge'])) ? null : $this->data['Hoge']);

そして確認画面のビューでは下記の通り。

<?php echo $this->Form->postButton('Submit', array('controller' => 'Hoges', 'action' => 'confirm'), array('data' => $data)); ?>

すると一気に以下のようなHTMLを吐き出してくれる。
※実際は改行とインデント無しの一行で出力される。

<form action="/Hoges/confirm" method="post" accept-charset="utf-8">
	<div style="display:none;">
		<input type="hidden" name="_method" value="POST">
	</div>
	<input type="hidden" name="data[name]" value="hoge">
	<input type="hidden" name="data[password]" value="fuga">
	<input type="hidden" name="data[url]" value="http://google.com">
	<button type="submit">Submit</button>
</form>

「hidden」属性で入力値を保持してくれているので、出力されたボタンをクリックすれば次のアクションへ値をそのまま送信できるのである。
ユーザーへのプレビューはビューにセットされた$dataを好きに調理して表示してやればよい。

今までは確認画面での値保持をSessionでやっていたが、Sessionの有効期限が切れてしまった場合を考慮するのであればこっちのほうが親切なのかもしれない。hiddenのvalueを悪意ある文字列に直接書き換える輩がいるとも考えられるが、CakePHPを使っていればsave()メソッド前にどうせ自動的にバリデーションがかかるので、モデルさえしっかり設計しておけばなんら問題はないであろう。

 

One Comment

  1. […] 【CakePHP2.3】単独動作するサブミットボタンを出力する。 […]

Comments are closed.