どこかのCTOだった人のブログ

どこかのCTOだった人が書いてます。最近はCakePHP3とConoHaのネタが多いです。

CakePHP3でどこでも使えるグローバル配列を作ってみた。

グローバル配列という音の響きが何だかアレなんですが、あまり気にしないことにします。
CakePHP3を使っていれば大抵「フォームヘルパー」を使うんじゃないかなと思います。
テキストもあればラジオボタンもありますが、自分が多用するのはセレクトボックスです。

何度も書いている通りUIセンスが絶望的なので、Bootstrapばかり使っているのですがセレクトボックスはここ半年ぐらいは「SelectPicker」を使っています。

silviomoreto.github.io


以前書いたselect2もいいのですが、使ってるうちに何かどうも都合よくないことが多く乗り換えました。
使い方はまたそのうち書いてみます。


やりたかったこと

セレクトボックスにいれるリストを使い回したかったのです。
ViewにセットするだけであればControllerにprivateで配列作ってセットすればいいのですが、取得したデータの結果に合致するKeyからValueを取得してdatatablesを読み込んだテーブルに表示したかったのです。
要するにViewにセットする時にEntityで処理をする時に使い回したいなと。

Entityの中でif文で切り分ければできてしまうのですが、リストの中身が増減した時に面倒ですしそもそもあまり美しくない。
というわけでグローバル配列を作ってみました。

やったこと

確かCakePHP2の頃もあったと思うのですが、こういう時はbootstrap.phpにfunctionを作ります。
作成したfunctionの返り値を配列にして、それを使います。
しかし何でbootstrapって名前なんですかね。まぁいいです。

<?php
 // bootstrapの記述

 /**
  * 配列を取得するfunction
 */
 function getSampleList() {

    $sampleList = [
      0 => 'サンプル1',
      1 => 'サンプル2',
      2 => 'サンプル3',
      9 => 'その他'
    ];

    return $sampleList;
  }


雑なfunctionです。
functionにpublicは不要です。
とりあえずこれをグローバル配列とします。


取得したデータは上記functionのキーにあたる、何らかの数値が入っているものと仮定します。
DB定義だと何ですかね。個人的なアレだとtinyint(4)です。
Viewにセットする時はこんな感じになると思います、多分。

<?php
 // Viewにセット
 $this->set('sampleList', getSampleList());


View側は結構端折りますが、こんな感じです。

<?php
 <!-- SelectPickerを使ったセレクトボックスです -->
 <?php echo $this->Form->input('Sample.sample_val', [
        'class' => 'form-control selectpicker',
           'data-live-search' => true,
           'data-width' => '100%',
           'type' => 'select',
           'div' => true,
           'label' => 'サンプルリスト',
           'options' => $sampleList, // ここにセット
           'default' => 0
   ]); ?>


これでセット完了です。
Entityの方は以下のように書いてみました。

<?php
 /**
  * リストの値取得用フィールド
 */
 protected function _getSampleListValue() {
    
    // サンプルリストを取得
    $sampleList = getSampleList();
    
    if (array_key_exists($this->_properties['sample_val'], $sampleList)) {
        // データが存在する場合は配列に対してキーとしてセット
        return $sampleList[$this->_properties['sample_val']];
    } else {
        return '不正データ';
    }
  }


まず、bootstrap.phpに作成したfunctionからリストを取得。
次に「sample_val」という何かのテーブルにあるカラムのデータ($this->_properties['sample_val']部分)が、リストにあるかチェック。
存在していた場合はリストのキーとして「sample_val」のデータを指定して、合致するValueを取得して返しています。


とりあえずこれでやりたいことができました。
リストが増減した時はbootstrap.phpに作ったfunctionを修正すればOKなはずです。

前に書いた定数は配列を指定できません(はず)
いや、指定はできますが使えません。確か。
ですので、今回のような方法を取っています。

Configファイルに書いても同じようなことができると思いますが、あまりConfigファイルに書いていくとワケがわからなくなるのでこういう感じに仕上げました。

とは言え、bootstrap.phpにゴチャゴチャ書きたくないという方ももちろんいらっしゃると思うのでそこは好みということで。