授業評価アンケート: https://unipa.nagoya-bunri.ac.jp/uprx/ 7月22日(火)まで
CakePHPの動作確認で起きるエラーの対応方法はこちらを参照
xampp-controlから apache と mysql を起動する。
次のURLを自分の期末課題用に修正してCakePHPのシステムの動作確認をする。
CakePHP でbakeするテーブルには name または title フィールドという名前のフィールドを用意しておくとよい。
bakeするテーブルにnameやtitleフィールドというフィールドが有ると、scaffoldのWebページ(自動生成するページ)でレコードの表示項目として設定される。
テーブルに表示項目の設定が無い場合はname または title フィールドを追加するか表示項目にするフィールドの名前をname または titleへ変更する。
フィールドの追加や名前の変更をしない場合は、PHPコードを編集して表示項目のフィールドを設定する。
例)
以下のようなplayersテーブルとitemsテーブル※を持つデータベースで name フィールドを使わずに bake するとCakePHPのビューでitemの表示にitem_nameが利用されないので修正する。
※このitemsテーブルは主キーの名前がitem_noとなっておりCakePHPの命名規約に反しているので id に修正した方がよい。
itemsテーブルでは主キーにid フィールドではなくitem_noフィールドを用いているが主キーの設定があるのでCakePHPで正常にbakeできている。
以下の画像は、playersテーブルの一覧表示のビューやレコード追加のビューで外部キーのitem_id の表示項目として item_nameが設定されていない様子。代わりにItemとしてitem_noの値 1 が表示されている。これをitem_nameの値 魔法の杖で表示したい。
XAMPPコントーロールのShellボタンを押してコマンドプロンプト(shell)を開く
cd htdocs\3123888boardgame_rental
modelからbakeし直す方法。
ステップ1/3
itemsのモデルをbakeし直す。上書きの確認(over write ?)には a を選択する。
bin\cake bake model --display-field item_name itmes
ステップ2/3
itemsのビューをbakeし直す。上書きの確認(over write ?)には a を選択する。
bin\cake bake template itmes
ステップ3/3
playersをbakeし直す。上書きの確認(over write ?)には a を選択する。
bin\cake bake all players
phpMyAdminで表示項目にしたいフィールド名を修正する方法。
ステップ1/4
itemsテーブルの item_nameフィールド を name または title に名前を修正する。
ステップ2/4
src/Model/Table/ にある ItemsTable.php を削除
Model はデータベースの操作に関するコード用のフォルダ
Table はテーブルの操作に関するコード用のフォルダ
ステップ3/4
itemsをbakeし直す。上書きの確認(over write ?)には a を選択する。
bin\cake bake all itmes
ステップ4/4
playersをbakeし直す。上書きの確認(over write ?)には a を選択する。
bin\cake bake all players
CakePHPのbakeで生成されたphpのコードを修正して表示項目を設定する方法。
ステップ1/2
Itemsテーブルのモデルを修正する。
表示項目を item_no から item_name に修正する。
src/Model/Table/ItemsTable.php を編集
Model はデータベースの操作に関するコード用のフォルダ
Table はテーブルの操作に関するコード用のフォルダ
ItemsTable.php は Itemsテーブルの操作に関するPHPのコード
CakePHPではコードを配置するフォルダ名やファイル名はこの様に決められている。
次の表示項目の設定のコードでitem_noから表示項目に使用したいフィールド名item_nameに変更する
$this->setDisplayField('item_no');
を
$this->setDisplayField('item_name');
ステップ2/2
Playersテーブルのビューを編集する
templates/Players/index.php を編集する、
templates は View に関する設定ファイルの置き場所
Players は playersテーブルに関する View の置き場所
index.phpはテーブルの一覧表示に関するViewのコード。
他にも、
追加用の add.php
編集用の edit.php
詳細表示用の view.php
が用意されている。
※ index.php の削除用リンクに削除用URLがリンクされているので削除に関するViewは用意されていない。
修正前:
<td><?= $player->has('item') ? $this->Html->link($player->item->item_no, ['controller' => 'Items', 'action' => 'view', $player->item->item_no]) : '' ?></td>
上記のitem_noの部分を以下の様にitem_nameに修正
修正後:
<td><?= $player->has('item') ? $this->Html->link($player->item->item_name, ['controller' => 'Items', 'action' => 'view', $player->item->item_no]) : '' ?></td>
注)上記のこれらのコードで、$player->itemはCONTROLLERのコードからVIEWのindex.phpコードに渡されるplayers変数(複数のplayerを含むリスト)から1レコードを取り出したplayer変数に(CONTROLLERが結合した1つの)itemレコード(itemsではない)のフィールドitem_noをフィールドitem_nameに修正している。
CakePHPのMVCコードとURLの対応について
このチュートリアル bookmarker のWebページから左サイドメニューのリンク List bookmarks をクリックして最初のブックマークの 詳細表示 view をクリックすると以下のURLのページに移動する。
http://localhost/3123888boardgame_rental/rentals/view/1
CakePHPフォルダ/ コントローラ bookmarks/ アクション view / アクションの引数 1
参考: CakePHP、MySQLのビューテーブルでbakeしてみる
ステップ概要
全テーブルの結合、レコードの集計、テーブルの並べ替え、を表示するビューをphpMyAdminに作成
phpMyAdminのビューテーブルをCakePHPでbake
ビューのURLをCakePHPのtemplateをVS Codeで編集して追加
期末課題データベースの企画に応じてSQLでビューを作成する
例1-1) phpMyAdminの クエリ を利用して
例1-2) phpMyAdminの クエリ を利用して
bookmarkerデータベースの「SQL」タブでビューテーブルを作成するコードを実行する。
1つ目のビュー
ビューテーブルの名称 title_users
表示フィールド title と user
ビューの表示内容 テーブルbookmarksとテーブルusersを bookmarks.user_id = users.idで結合し、title順に並べ替えて表示する。
ビューテーブルを表示するSQL
CREATE VIEW title_users (title, user) AS
SELECT bookmarks.title, users.name FROM bookmarks INNER JOIN users ON bookmarks.user_id = users.id ORDER BY bookmarks.title
このような集計クエリをSQLで自分の期末課題データベースについて考えて書く
2つ目のビュー
同様に、以下のビューを作成する。
ビューテーブルの名称 count_tags
表示フィールド tag と count
テーブルbookmarks_tags と tagsを結合し、タグのタイトルでグループ化して集計する
タグが付いたブックマーク数を集計し、多い順に表示するSQLの例)
CREATE VIEW count_tags (tag, count) AS
SELECT tags.title, count(*) as cnt FROM bookmarks_tags INNER JOIN tags ON bookmarks_tags.tag_id = tags.id GROUP BY tags.title ORDER BY cnt DESC
注) as cnt でcountの集計結果のフィールド名(見出し)として cnt を設定して、 ORDER BYで参照している
このような集計クエリをSQLで自分の期末課題データベースについて考えて書く
bake コマンドでビューテーブル(例3の場合 title_users と count_tags)のMVCコードを自動作成する。
Shellを開いて以下の作業を進める。
cd htdocs\3123888boardgame_rental
ステップ(1/3)で作成したビューには主キーが設定されていない。
そのため cake bake all を実行するとView の作成に失敗する。
対処法
bakeコマンドのオプションで all の代わりに--primary-keyで主キーの代用フィールドを指定して model を作成する。
続けて controller と template をbake コマンドで作成する。
例3の1つ目のビューの場合
title_users ビューに対するCRUDを新規作成する。
bake all ではなく、bake model 、bake controller 、bake templateと3ステップでscaffoldを生成する。
ビューには主キーが無い場合がある。このビューではtitleを主キーとして代用する。
Modelを作成。bake コマンドのオプション --primary-key で title を 主キーに指定
bin\cake bake model title_users --primary-key title
Controllerを作成。
bin\cake bake controller title_users
Viewを作成。
bin\cake bake template title_users
例3の2つ目のビューの場合
count_tags ビューに対するCRUDを新規作成
Modelを作成。bake コマンドのオプションで tags を 主キーに指定
bin\cake bake model count_tags --primary-key tags
Controllerを作成。
bin\cake bake controller count_tags
Viewを作成。
bin\cake bake template count_tags
テーブルビューを表示するコントローラーへのリンクをWebページのヘッダー領域に追加する。
vs code で 以下のフォルダに配置された default.php ファイルを編集する。
templates/layout/default.php
41行目の「<div class="top-nav-links">」に続けて次の2行を追加
<a href="http://localhost/3123888boardgame_rental/title-users">title users</a>
<a href="http://localhost/3123888boardgame_rental/count-tags">count tags</a>
※単語を複数繋いだテーブル名のコントローラーのURLは単語をダッシュ(ハイフン記号 - )で繋いだものになる。
例)
テーブル名 title_users のコントローラーのURLは title-users
title usersやcount tags はHTMLのリンク文字列なので適当なキーワードに書き換えておくとよい(日本語もOK)
確認:
以下のURLにアクセスしページのヘッダーに追加されたリンク title users と count tags をクリックして表示を確認する。
残りの時間で以下の課題に取り組む。追加点用の課題とする。第11~15回の演習で時間の余裕があるときに取り組んでおくこと。