文系Webエンジニアの技術メモとたまに旅のメモ

未経験文系エンジニアとして働いてます。アウトプットとして簡単に技術メモを残していきます。たまに旅関係のも趣味で残していこうと思ってます。

【CakePHP3】templateでセレクトボックス用の配列作成方法3パターン!

今回は、CakePHP3系でtemplateのセレクトボックスの選択肢の表示として使う配列の作成方法を
3パターン紹介していきます。

1.やりたい事

下記3パターンをやっていきます。
・マスタテーブルの内容を選択肢として表示する
・定数配列を選択肢として表示する
・for(foreach)で指定の数字を選択肢として表示する。

2.マスタテーブルの内容を取得する条件を記述

DBのマスタテーブルの内容をセレクトボックスの選択肢として使うための記述をします。
任意のテーブルにlist形式でQueryを取得する記述をします。

DepartmentsTable.php
<?php
    public function getListDepartments()
    {
        $query = $this->find('list', [
            'keyField'   => 'id',
            'valueField' => 'name'
        ])
        ->where(['del_flg' => FLG_OFF]);
        return $query;
    }

※keyFieldとvalueFieldを記述しなくても、想定の値が取得できている事がありますが、
後々の修正や、他の方が見たときに、記述した方がわかりやすいので書いておいた方が良いと思います。

3.定数配列の作成

セレクトボックスに表示する定数配列を作成します。

const.php
<?php
return [
    // 都道府県
    define('HOKKAIDO', 1), // 北海道
    define('AOMORI',   2), // 青森
    define('PREFECTURES', [
        HOKKAIDO => '北海道',
        AOMORI   => '青森',
    ]),
];

※まだ定数ファイルを作成していない方はこちらの記事を参考にしてみてください。

44igarashi.hatenablog.com

4.for文で配列の作成

Controller内でfor文を使用して配列を作成します。

UsersController.php
<?php
    // for文もしくはforeachで配列を作成
    $count = [];
    for($i = 1; $i <= 5; $i++) {
        $count[$i] = $i;
    }

5.3パターンの内容をController内に記述し、templateへ渡す

作成した3パターンを任意のControllerのfunction内に記述し、setしましょう。

UsersController.php
<?php
    // パターン1:マスタテーブルから取得
    $departments = $this->Departments->getListDepartments();
    // パターン2:定数から取得
    $prefectures = PREFECTURES;
    // パターン3:for文もしくはforeachで配列を作成
    $count = [];
    for($i = 1; $i <= 5; $i++) {
        $count[$i] = $i;
    }
    // templateへ渡す
    $this->set('departments', $departments);
    $this->set('prefectures', $prefectures);
    $this->set('count',       $count);

※定数を配列に代入している処理がありますが、こちらは見やすく書いているだけなので、
実際の処理を書くときは、set内に記述すれば大丈夫です。

6.templateに記述

Controllerでsetした変数を使ってセレクトボックスの記述をしましょう。

add.ctp
<?php
    echo $this->Form->control('department_id', ['options' => $departments, 'empty' => true]);
    echo $this->Form->control('prefecture_id', ['options' => $prefectures, 'empty' => true]);
    echo $this->Form->control('count_id',      ['options' => $count,       'empty' => true]);

7.画面で確認

ブラウザで該当するURLにアクセスしましょう。
セレクトボックスが3つ正しく表示されていたら完了です!

他にも使用するパターンはあるので、状況に合った方法を使っていきましょう!