Friction River Software

  • お問い合わせ

CakePHP5入門【CakePHP5基礎編④】フォーム送信

B美

今回は、Webアプリケーションでは必須知識となる「フォーム送信」についてよ

C菜

「ユーザID」や「パスワード」を入力してから「ログイン」ボタンを押すことで、Webサーバへユーザ認証のための情報を送ったりするやつですね~?

A子

5chチャンネルなんかの掲示板でもよく使ってるよね

B美

「CakePHP」にはHelperヘルパーという仕組みがあって、HTMLタグを知らなくてもフォームを作れるの

それでは、まずはViewビューファイルを編集していきましょう
(前回の「testapp/templates/PostTest/index.php」を書き換えます)

<?= $this->Form->create(null, ['id' => 'test_form', 'url' => ['controller' => 'PostTest', 'action' => 'send']]) ?>
  <?= $this->Form->textarea('textfield', array('id' => 'textfield', 'label' => false, 'div' => false, 'style' => 'width: 500px;height: 300px;resize: none;')) ?>
  <br />
  <?= $this->Form->button(__('送信'), ['type' => 'submit', 'id' => 'submit_btn']) ?>
<?= $this->Form->end() ?>

ちょっと長いけど頑張って入力してね
(コピペでも良いけど…)



(上記の2行目と3行目が表示上は改行されていますが、実際は一行で入力してください)


C菜

複数行入力できるテキストエリアってやつですね~

あ、「testapp/src/Controller/PostTestController.php」の書き換えは良いんですか~?

B美

もちろん必要よ

まずは前回使った「index」メソッドだけど、別にそのままでも良いわ
んで、フォームの送信先である「send」メソッドを新たに作ります

public function send()
{
  $res = "";

  if ($this->request->is('post')) {
    $textfield = $this->request->getData('textfield');
    $res = nl2br(htmlspecialchars($textfield, ENT_QUOTES));
  }

  $this->set('result', $res);
}

もしも(GETリクエストではなく)POST送信であれば、「textfield」という名前で送られてきたデータを取得し、それをサニタイズ及び改行コードのbrタグ変換を行ってから変数$resに代入する
それを「result」という名前でビューへ受け渡す
…って意味ね

C菜

複数行入力のテキストエリアじゃなくて、パスワード入力みたいな一行入力だったり、あとラジオボタンやチェックボックスの場合はどうなるんですか~?

B美

フォームの要素が何であろうと、「$this->request->getData('○○')」という形で受け取れるわよ

あ、あとフォームのmethodが「POST」であることを指定してないけど、「'type' => 'get'」を指定しない限り、自動的にPOST送信になるわね

A子

結果を表示するためには「send.php」というViewビューファイルも要るんじゃないの?

B美

もちろん!

testapp/templates/PostTest」の中に空のファイルとして「send.php」を作ってね
その内容としては、タイトル(【送信データ】ってやつ)とControllerコントローラーから渡された値($result)を表示するコードだけで良いでしょう

【送信データ】
<br /><br />
<?= $result ?>

B美

さて、それでは動作確認してみるわね
(プログラマとしては最もワクワクする瞬間よ)

これはテストです。
これは2行目です。
不等号「<」と「>」を表示できるか試してみます。

…って入力してみましょう
(入力する文字は別に何でも良いんだけど…)

B美

んで、「送信」ボタンを押すと…

下の赤色で囲んだところが結果表示の箇所になります

C菜

すごいです~

感動です~

A子

なんかあっさり成功したね

プログラムって、意外と簡単なんじゃないか…って錯覚しちゃいそう(苦笑)

B美

いや実際、簡単よ
(特にWebフレームワークを利用するのなら…)

結局のところプログラミングって…
多くの成功パターンを積み重ねていけば、あとはそれをコピペしていけば良いだけ」なのよね
(要するに、それらのパターンを暗記する必要は無いってこと)

A子

ん?
「index.php」のフォーム生成の記法とか、「send」メソッド内の書き方とかって、もしかしてコピペ?

B美

あったりまえじゃん!

憶えてるわけないっつーの

C菜

そんなものなんですね~

B美

そんなものよ!

あと、参考までにほかのフォーム部品も示しておくわね
注:ファイルをアップロードしたいときは、「Form->create」に「'type' => 'file'」が必要)

<?= $this->Form->create(null, ['id' => 'test_form', 'type' => 'file', 'url' => ['controller' => 'PostTest', 'action' => 'send']]) ?>
  <?= $this->Form->textarea('textfield', array('id' => 'textfield', 'label' => false, 'div' => false, 'style' => 'width: 500px;height: 300px;resize: none;')) ?>

  <br />
  一行入力:<?= $this->Form->text('text01', ['label' => false, 'div' => false]) ?>
  <br />
  パスワード:<?= $this->Form->password('password02', ['label' => false, 'div' => false]) ?>
  <br />
  ラジオボタン:<?= $this->Form->radio('radio03', ['value1' => 'A子', 'value2' => 'B美', 'value3' => 'C菜'], ['value' => 'value1']) ?>
  <br />
  <?= $this->Form->checkbox('check04', ['checked' => true]) ?>チェックボックス
  <br />
  セレクトボックス:<?= $this->Form->select('select05',['A子', 'B美', 'C菜']) ?>
  <br />
  ファイル:<?= $this->Form->file('file06', ['label' => false, 'div' => false]) ?>
  <br /><br />

  日付入力:<?= $this->Form->date('date07', ['label' => false, 'div' => false]) ?>
  <br />
  時間入力:<?= $this->Form->time('time08', ['label' => false, 'div' => false]) ?>
  <br />
  日付及び時間入力:<?= $this->Form->datetime('datetime09', ['label' => false, 'div' => false]) ?>
  <br />
  数値入力:<?= $this->Form->control('number10', ['type' => 'number', 'label' => false, 'div' => false, 'min' => 50, 'max' => 300, 'value' => 100]) ?>
  <br />
  メールアドレス:<?= $this->Form->control('email11', ['type' => 'email', 'label' => false, 'div' => false]) ?>
  <br />
  色指定:<?= $this->Form->control('color12', ['type' => 'color', 'label' => false, 'div' => false]) ?>
  <br /><br />

  <?= $this->Form->button(__('送信'), ['type' => 'submit', 'id' => 'submit_btn']) ?>
  <?= $this->Form->button(__('リセット'), ['type' => 'reset', 'id' => 'reset_btn']) ?>
<?= $this->Form->end() ?>



B美

上記のコードをブラウザで表示したものはこうなるわ



A子

すごいな

色々できそうだね

C菜

ですです~

B美

この下に入力したものがテストデータね

あ、もちろん「PostTestController.php」と「send.php」も修正してるんだけど、その表示は省略します
(あなたたちはコードを打ち込まなくても良いわ)



C菜

「送信」ボタンを押すと、こんなの出ました~

B美

パスワード属性の入力欄があると自動的に出現するのよ
(ブラウザの機能として…)

んで、以下が処理結果よ


B美

どういう値が送信されたのかが一目瞭然でしょ?

C菜

これって
こんなこともできるんだ~

…って思っておくだけで良いんでしょうか~?

B美

その通り

必要になったら、そのつど調べていけば良いのよ
(プログラミングなんてそういうもんだからね)

A子

なんか作りたいものが色々と頭に浮かんでくるよ

ただ…
もしも独学だったら絶対途中で挫折する自信がある!

B美

いやな自信ね(苦笑)