カテゴリー
コンピューター

CakePHP2 フォームで別ページにデータを送る勉強します♪

CakePHP ビュー関係のこれまでの基本まとめ | oki2a24 の続きとなります。

まとめ

  • $_GET、$_POST は使わない。ビューで指定するのみ。
  • ビューファイル名は「アンダースコア記法」。複数単語がある場合はアンダースコアでつなげる。
  • GET の場合の送信されたフォーム情報の取得方法。
    • $this->request->query[‘text1’]
    • $this->request[‘url’][‘text1’]
  • サニタイズ(送信情報のエスケープ)に使うもの。
    • PHP の htmlspecialchars 関数。入力した内容はそのまま出力される。
    • CakePHP の Sanitize::stripAll 関数。「Strips extra whitespace, images, scripts and stylesheets from output」。使用前に読み込む必要あり。App::uses(‘Sanitize’, ‘Utility’);
  • コントローラーからビューへ情報を渡すときは $this->set(‘result’, Sanitize::stripAll($result)); のように指定する。
    これをビューで表示するときは echo $result; などとすればよい。
  • チェックボックス、ラジオボタンはチェックされていないと値そのものが送信されない。
  • POST の場合の送信されたフォーム情報の取得方法。
    • $this->request->data(‘text1’) ← 関数
    • $this->request->data[‘text1’ ] ← 連想配列

前提

  • CakePHP 2.1.3 導入済み。
  • ドキュメントルート/cake/sample/(ここにCakePHP が入ってます。app ディレクトリとか、.travis.yml ファイルとか。)

勉強ソースの動き

  1. http://localhost/cake/sample/haskap/
    テキストを入力、送信(GET)。
  2. http://localhost/cake/sample/haskap/sendForm1
    入力されたテキストを表示。
    チェックボックス、ラジオボタン、セレクトボックスを選択、送信。(GET)
  3. http://localhost/cake/sample/haskap/sendForm2
    選択された情報を表示。
    テキストを入力、送信。(POST)
  4. http://localhost/cake/sample/haskap/sendForm3
    入力されたテキストを表示。

ソース

ソース一覧。コントローラー1つに対して、ビューが4つあります。

  • cake/sample/app/Controller/HaskapController.php
  • cake/sample/app/View/Haskap/index.ctp
  • cake/sample/app/View/Haskap/send_form1.ctp
  • cake/sample/app/View/Haskap/send_form2.ctp
  • cake/sample/app/View/Haskap/send_form3.ctp

各ソースの中身です。

cake/sample/app/Controller/HaskapController.php

<?php

class HaskapController extends AppController {

	// コントローラー名
	public $name = 'Haskap';
	// モデルを指定しない
	public $uses = null;
	// レイアウトとして使用するものを指定。Layouts フォルダの、haskap.ctp を使う。
	public $layout = 'Haskap';

	public function index() {
	}

	public function sendForm1() {
		App::uses('Sanitize', 'Utility');

// 		$text1 = $this->request->query['text1'];
		$text1 = $this->request['url']['text1'];
		$result = '';
		if ($text1 != ''){
			$result = 'あなたが入力したもの→' . $text1;
		} else {
			$result = 'あなたは何も入力していないねっ!';
		}
// 		$this->set('result', htmlspecialchars($result));
		$this->set('result', Sanitize::stripAll($result));
	}

	public function sendForm2() {
		App::uses('Sanitize', 'Utility');

		$result = "※送信された情報<br />";
		$query = $this->request->query;
		foreach($query as $key => $val) {
			$result .= $key . " => ". $val . "<br />";
		}
		$this->set('result', Sanitize::stripAll($result));
	}

	public function sendForm3() {
		App::uses('Sanitize', 'Utility');

		$text1 = $this->request->data('text1');
// 		$text1 = $this->request->data['text1'];
		$result = '';
		if ($text1 != ''){
			$result = 'あなたが入力したもの→' . $text1;
		} else {
			$result = 'あなたは何も入力していないねっ!';
		}
		$this->set('result', Sanitize::stripAll($result));
	}

}

?>

ポイントは、まとめを見てください。補足として、35~37行目の foreach でフォームから送信した情報をすべてビューで出力させるよう処理しています。デバッグしたいときなどに使えるでしょう。

cake/sample/app/View/Haskap/index.ctp

<h1>サンプルのハスカップ見出し!</h1>
<p>フォームの送信 GET 文字列 サニタイズ</p>
<br /><br />
<form method="get" action="./sendForm1">
	<input type="text" name="text1" />
	<input type="submit" />
</form>

このビューでは GET で送信しています。

cake/sample/app/View/Haskap/send_form1.ctp

<h1>送信結果</h1>
<p><?php echo $result; ?></p>
<br />
<br />
<br />
<p>フォームの送信2 GET チェックボックス ラジオボタン セレクトボックス</p>
<br /><br />
<form method="get" action="./sendForm2">
	<input type="checkbox" name="check1" />チェック<br />
	<input type="radio" name="radio1" value="No.1" />ラジオ1<br />
	<input type="radio" name="radio1" value="No.2" />ラジオ2<br />
	<select name="select1">
		<option value="Windows">Windows</option>
		<option value="Linux">Linux</option>
		<option value="MacOSX">MacOSX</option>
	</select>
	<input type="submit" />
</form>

<a href="./send_form2">send_form2へ</a>

コントローラーの index アクションで ‘result’ として set した情報は、ビューで $result と指定するだけで取り出すことができます。

cake/sample/app/View/Haskap/send_form2.ctp

<h1>送信結果</h1>
<p><?php echo $result; ?></p>
<br /><br /><br />
<p>フォームの送信 POST 文字列 サニタイズ</p>
<br /><br />
<form method="post" action="./sendForm3">
	<input type="text" name="text1" />
	<input type="submit" />
</form>

このビューでは POST で送信しています。

cake/sample/app/View/Haskap/send_form3.ctp

<h1>送信結果</h1>
<p><?php echo $result; ?></p>

ポイントは特にありません。表示しているだけです。

「CakePHP2 フォームで別ページにデータを送る勉強します♪」への1件の返信

コメントを残す