CakePHP3・4でFormHelperのlinkメソッドの基本的な使い方
360 回閲覧されました
みなさんこんにちは、jonioです。
CakePHPにFormHelperのlinkメソッドがありますが基本的な使い方をまとめた記事が見つからなかったのでメモとしてこの記事を残します。
目次
CakePHPのバージョン
3と4に対応していますが3で説明します。
1部がバージョン4だと廃止の警告が表示されるのでそこの補足はします。
ベースにするコントローラー
何でもいいですがUsersコントローラーとします。
同じコントローラーの別のアクションのビューへのリンク
Usersコントローラーに追記の必要がなくindexアクションで表示するビューに下記の記述をします。
<?= $this->Html->link('リンク', ['action' => 'add']) ?>
これでUsersコントローラーのaddアクションで表示するビューにアクセスします。
別のコントローラーのアクションのビューへのリンク
Usersコントローラーのindexアクションで表示するビューに下記の記述をします。
<?= $this->Html->link('リンク', ['controller' => 'Reviews', 'action' => 'index']) ?>
第二引数に「’controller’ => ‘Reviews’」がありますが他のコントローラーのアクションに遷移する場合はコントローラー名を記載しないといけません。
これでビューにリンクができるのでアクセスするとReviewsコントローラーのindexアクションで表示するビューにアクセスします。
アソシエーションしていないパラメーター付きのリンク
同じコントローラーでのリンクの場合か他のコントローラーのリンクの場合かでコードが変わってきます。
まずは同じコントローラー(Usersコントローラー)でのビューへのリンクを見ていきます。
同じコントローラーのビューへのリンク
Usersコントローラーのview.php(view.ctp)へのリンクで説明します。
他のビューで下記の記述をします。
<?= $this->Html->link('リンク', ['controller' => 'Users', 'action' => 'view'], $id) ?>
パラメーターを付ける場合は第三引数をつければいいです、$idはusersテーブルのidカラムのことです。
これで$idをUsersコントローラーのviewアクションに渡します。
下記がviewアクションのデフォルトのコードですがメソッドの引数の$idに渡します。
public function view($id = null)
{
$user = $this->Users->get($id, [
'contain' => [],
]);
$this->set(compact('user'));
}
これでリンクにアクセスすると「http://localhost/reviews/view/idカラムの値」にアクセスします。
他のコントローラーのビューへのリンク
アソシエーションはしていないテーブルを使ったとします、テーブル名はreviewsとします。
UsersController.phpのindexアクションに下記の記述をしたとします。
public function index()
{
$this->loadModel('Reviews'); //この行を追加
$users = $this->paginate($this->Users);
$reviews = $this->Reviews->find(); //この行を追加
$this->set(compact('users', 'reviews'));
}
この書き方はCakePHPのバージョン3の場合です、4の場合は下記の記述を追記しないと警告が表示されます。
・
・
・
class UsersController extends AppController
{
public $Reviews = null; //この行を追加
・
・
話を戻して3行目で「reviewsテーブル」を使えるようにして7行目でreviewsテーブルの値を取得します。
そしてビューでreviewsテーブルのデータを使う為に9行目にcompact関数を書いています。
そしてindexアクションで表示するビューに下記の記述をします。
<?php foreach($reviews as $review): ?>
<td><?= $this->Html->link('リンク', ['controller' => 'Reviews', 'action' => 'view', $review->id]) ?></td>
<?php endforeach ?>
2行目の「$review->id」の「id」がreviewsテーブルのidカラムのことです。
これでリンクにアクセスすると「http://localhost/reviews/view/idカラムの値」にアクセスします。
idカラムの値は上記の例だと1・2・5・6・7です。
whereを使って絞り込みをする
アソシエーションを使ってない場合はwhere句を使って条件の絞り込みができます。
今出てきたidカラムの値で1だけを使ってリンクを作るとします。
その場合のビューはコードが同じですがコントローラーは下記になります。
public function index()
{
$this->loadModel('Reviews');
$users = $this->paginate($this->Users);
$reviews = $this->Reviews->find()->where(['id' => 1]);
$this->set(compact('users', 'reviews'));
}
7行目の「->where([‘id’ => 1])」でidが1のレコードの情報を取得します。
リンクのコードは先ほどと同じです。
<?php foreach($reviews as $review): ?>
<td><?= $this->Html->link('リンク', ['controller' => 'Reviews', 'action' => 'view', $review->id]) ?></td>
<?php endforeach ?>
アソシエーションしているパラメーター付きのリンク
ある人に紐づく部署へのリンクを作りたいとします。
usersテーブルとdepartments(部署)テーブルをアソシエーションします、今回はusersテーブルが子テーブルでdepartmentsテーブルが親テーブルとします。
下記がusersテーブルの情報になります。
下記がdepartmentsテーブルの情報になります。
アソシエーションをする為の設定をします。
モデルに下記の記述をします。
//UsersTable.php
$this->belongsTo('Departments', [
'foreignKey' => 'department_id'
]);
//DepartmentTable.php
$this->hasMany('Users');
コントローラーに下記の記述をします。
public function index()
{
$associations = $this->Users->find('all', ['contain' => 'Departments']);
$this->set(compact('associations'));
}
アソシエーションする時はfindメソッドの第二引数に必ず「[‘contain’ => ‘紐づけるテーブルのモデル名‘]」をつけないといけません。
紐づけるテーブルのモデル名は今回はUsersモデルにDepartmentsモデルを紐づけるのでDepartmentsになります。
ビューを下記にします。
<?php foreach($associations as $association): ?>
<?= $this->Html->link('リンク', ['controller' => 'Departments', 'action' => 'view', $association->department->id]) ?>
<?php endforeach ?>
2行目の「$association->department」にアソシエーションを使っていてdepartmentに続く「->id」でユーザーに紐づく部署idの詳細にアクセスできます。
条件で絞り込み
先程はusersテーブルの全てのユーザーの部署の詳細のリンクを作りましたが次は特定のユーザーのリンクのみを作るとします。
この場合はコントローラーを下記にします。
public function index()
{
$associations = $this->Users->find('all',['contain' => 'Departments', 'conditions' => ['Users.id' => 1]]);
$this->set(compact('associations'));
}
アソシエーションをした時に条件を付けて取得情報を絞り込む時は「’conditions’ => [条件]」をつけます。
条件に当たるのが「’Users.id’ => 1」で「’Users.id’ => 1」はusersテーブルのidカラムの値が1を選択するという意味です。
とりあえずこれ位ができればFormHelperのlinkメソッドの使い方は大丈夫だと思います。