質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

5048閲覧

cakephp3 formhelperのcreate()メソッド、第一引数(コンテキスト)の理解ができない

kipipipi

総合スコア60

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/09/10 01:51

編集2019/09/10 02:57

こんにちは。
現在cakephp3を覚えなくてはいけない状況なので、学び始めた者です!

個人学習で、
名前やメルアドを入力してもらい、同時に画像(動画)もアップしてもらう仕組みを作ってみています。

そこでform helperを使ってビューにformを作ってコントローラーで仕組みをいじっている段階です。

(不細工なのはご了承ください。。。)

php

1 public function check(){ 2 $this->set("message","アップロードするファイルを選んでください"); 3 $usersTable = $this->UsersTables->newEntity(); 4 5 if ($this->request->is('post')) { 6 $usersTable = $this->UsersTables->patchEntity($usersTable, $this->request->getData()); 7 $uploaddir = WWW_ROOT; 8 $uploadfile = $uploaddir.basename($this->request->getData('UploadData.name')); 9 10 if (move_uploaded_file($this->request->getData('UploadData.tmp_name'), $uploadfile)) { 11 if ($this->UsersTables->save($usersTable)) { 12 $this->Flash->success(__('保存が完了しました')); 13 return $this->redirect(['action' => 'index']); 14 } 15 $this->Flash->error(__('保存が失敗しました')); 16 } 17 } 18 $this->set(compact('usersTable')); 19 }

html

1<?php 2/** 3 * @var \App\View\AppView $this 4 * @var \App\Model\Entity\UsersTable $usersTable 5 */ 6?> 7<nav class="large-3 medium-4 columns" id="actions-sidebar"> 8 <ul class="side-nav"> 9 <li class="heading"><?= __('Actions') ?></li> 10 <li><?= $this->Html->link(__('List Users Tables'), ['action' => 'index']) ?></li> 11 </ul> 12</nav> 13 14 15<div class="usersTables form large-9 medium-8 columns content"> 16 <?= $this->Form->create($usersTable,['enctype' => 'multipart/form-data']) ?> 17 <fieldset> 18 <legend><?= __('下記に必要事項を入力してください') ?></legend> 19 <?php 20 echo $this->Form->control('company_name',["label" => "会社名"]); 21 echo $this->Form->control('deps_name',["label" => "部署"]); 22 echo $this->Form->control('registrant_name',["label" => "登録者"]); 23 echo $this->Form->control('mail',["label" => "メールアドレス"]); 24 echo ($message); 25 echo $this->Form->control('UploadData',['type'=>'file','accept'=>'video/*',"label" => ""]); 26 ?> 27 </fieldset> 28 <?= $this->Form->button(__('確認')); ?> 29 <?= $this->Form->end() ?> 30</div> 31

まずつ目の疑問ですが、html(ビュー)のform作成始めに

html

1$this->Form->create($usersTable,['enctype' => 'multipart/form-data'])

と記入していますが、createの第一引数はモデルクラスと同名にするという認識で合っていますか?
ドキュメントには

// /articles/add において

// $article は、空の Article エンティティーである必要があります。
echo $this->Form->create($article);

とあるのでモデルクラスのエンティティーが関係しているのだとは予想できます。(記入されたデータを使ってエンティティー(レコード)を作成する?)

しかし、書籍やネットで見るコードの中には$usersTableという書き方と'usersTable'という書き方があります。
どちらの書き方でも保存できてしまうので、後々これが足を引っ張るようなことが無いように理解したいです。
※もちろん空欄で書くと”Unable to find table class for current entity”と怒られます。

どちらが一般的な認識でしょうか?

つ目にphp(コントローラー)の末尾に

php

1$this->set(compact('usersTable'));

と書いてありますが、なぜこの変数を再度同じビューに投げているのでしょうか?色々参考に書いたため意味が理解できていません。また、このコードを書かないと一つ目の疑問のところと同じ段で

Undefined variable: usersTable

とエラーが出ます。この二つの関係性が理解できません。

周りに聞くことができる環境でもないため、途方にくれています。
協力お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/09/10 01:55

タイトルには要件を書いてください。 cakephpについての質問であることはタグで分かります。 もっと質問内容に寄せたタイトルにしてください。
m.ts10806

2019/09/10 02:01

タイトルだけだと↑(ドキュメント読んでください)になりますけど、それで良ければ。 form helperについての質問を今後する可能性がないというのでしたらそれでも良いです。 要は、タイトルだけで自分や他の人に何が問題か伝わるかが大事です。 https://teratail.com/help/question-tips#questionTips3-1
kipipipi

2019/09/10 02:29

アドバイスありがとうございます!ドキュメントは目を通すようにしているのですが、理解がうまくできない段階でした。うまく噛み砕いているサイトはないか巡っていると書き方が複数あったり、クラス名ですと言い切っていたのですがそれでもスッキリ消化できないでいませんでした。 タイトル変更しましたが、いかかでしょうか??
m.ts10806

2019/09/10 02:31

ドキュメントで理解できなかったところや読んで試したことを記載すると回答を得やすくなると思います
guest

回答2

0

CakePHP に限らず、MVC モデルのフレームワークですと、View とは「何らかの Model を表示し、編集するためのもの」です。つまり View は Model と結びつきます。
なので、その View 上に form を作る場合、当然ながら「View と結びついている Model を編集するための form」になることが多いので、model を指定してやる方が都合がよいのです。

PHP

1$this->Form->create($usersTable, [...

新規に作成するための form なら中身は全部空でも問題ありませんが(select などの選択肢は別として)、既存のデータを編集する場合はそれでは困りますよね?
そこで、form を作成する際に「初期値として与えたいデータ」を ORM エンティティーの形で設定することができます。
普通はエンティティという実体なので、 $usersTable という書き方になります。
'usersTable' というのは、後に出てくる compact() を呼び出すときだけの書き方の筈です。

末尾

PHP

1$this->set(compact('usersTable'));

の意味ですが、これを設定しておかないと、View を表示する php に $usersTable の内容が渡りません。もしこれがないと実際に試したように、$usersTable という変数が View からは見えないので、エラーになります。

コントローラーとビューは別の物ですから、受け渡すデータを指定しないと、データが渡らないのです。
この辺は両者がどう連携しているかを理解しないとわかりにくいかも知れません。

投稿2019/09/10 02:54

編集2019/09/10 03:04
tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kipipipi

2019/09/12 21:52

お返事が遅れ大変失礼しました。初心者用に噛み砕いて教えて頂けて大変ありがとうございました!!のみ込みやすく、スッと気持ちが軽くなりました。もっと深く理解したいと思います!!ありがとうございました!
guest

0

ベストアンサー

createの第一引数はモデルクラスと同名にするという認識で合っていますか

違います。第一引数はエンティティ(\Cake\ORM\Entity)、または Modellessフォーム(\Cake\Form\Form)を指定します。
(正確には、あと二つ許可される形式がありますが、ほぼ使用しないので省きます。

しかし、書籍やネットで見るコードの中には$usersTableという書き方と'usersTable'という書き方があります。

いずれも間違いです。公式ドキュメント以外のネットの記事は間違いを含むものや、バージョンを明示していないため現在のバージョンでは動かないものが多くあります。できるだけ公式ドキュメントを参照するようにしてください。

文字列での指定の方はCakePHPのバージョン2以前の書き方です。

参考:
フォームの開始 | Form - 3.8

$this->set(compact('usersTable'));

コントローラーでこう書くと、テンプレート側で $usersTable を使用できるようになります。
CakePHPはMVCフレームワークですので、コントローラーからテンプレートへ明示的に変数をセットしないと、テンプレート側で変数を利用できません。

参考:
ビューとの相互作用 | コントローラー - 3.8

補足として、$usersTable という変数名を使用されていますが、これが混乱の元になっています。
$this->UsersTables->newEntity() の戻り値はエンティティオブジェクト(\App\Model\Entity\User)となりますので、Tableという接尾詞は不適切です。この場合であれば、$user がふさわしいでしょう。

テンプレート側のアノテーションも以下となります。

php

1/** 2 * @var \App\View\AppView $this 3 * @var \App\Model\Entity\User $user 4 */

投稿2019/09/10 05:01

nojimage

総合スコア957

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kipipipi

2019/09/12 21:47

お返事が遅れ申し訳ありません。なんとなくの理解ではうまくいかないなと反省しました。 最後のアドバイスもとても参考になりました!データベースから作り直して再度挑戦したいと思います! ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問