CakePHP2系あれこれ
セレクトボックスの実装方法
書き方
ビュー側
<?php echo $this->Form->input('セレクトボックスのラベル', array('type'=>'select', 'options'=> 要素の配列 ) ) ?>
- selectedを使えば初期選択状態を作成できる。
- onchangeを使えば「選択後に即POST送信」といった使い方も可能になる。
- nameでセレクトボックスのnameを指定できる。
<?php echo $this->Form->input('セレクトボックスのラベル', array( 'type'=>'select', 'options'=> 要素の配列, 'selected'=> 配列のキー ) ) ?>
例
アクション側
$years = [2016, 2015, 2014]; $selectedKey = 1; $this->set('years', $years); $this->set('selectedYear', $selectedKey);
ビュー側
<?php echo $this->Form->input('対象年度', array( 'type'=>'select', 'options'=> $years, 'selected'=> $selectedKey, 'onchange'=>'this.form.submit()', 'name'=>'yearSelection' ) ); ?>
hiddenタグの実装(Formヘルパーを使って)
<?php echo $this->Form->input( 'MyChuno.id', array( 'type' => 'hidden', 'name' => 'id', 'default' => $data['id'], ) ); /* POST送信するとリクエストパラメータにidが含まれるので、 そのままModelにセットすると更新扱いになる。*/ ?>
現在のURLを取得する
ビュー側
<?php echo $this->Html->url('', true); ?>
チェックボックス
<?php echo $this->Form->input('チェックボックス', array( 'type'=>'checkbox', 'id' => 'chk'.$id, 'value' => $id, 'div' => false, 'label' => false, 'hiddenField' => false ) ); ?>
- 明示的に「'div' => false」等としないと、HTML上で不要なdivタグやlabelタグ等が出力されてしまう。
- デフォルトで余分なhiddenも作られてしまうので、hiddenFieldはfalseにしておくほうが良い。
ラジオボタン
Controller
<?php $options = array(1 => '出席', 2 => '欠席'); $this->set(compact('options'));
View
<?php echo $this->Form->radio( "モデル名.要素名", $options, array( 'legend' => false, 'separator' => ' ', 'value' => 1, 'disabled' => false, 'class' => 'radio-horizontal', // ラジオボタンを横並びにする ) );
モデル内で別のモデルを呼び出して使う
<?php App::import('Model', 'MyChunoModel'); $MyChunoModel = new MyChunoModel;
staticな配列やメソッドを呼び出す方法
Model側
<?php class myChuno { … … static $hoges = array('name' => 'chuno'); }
Controller側
- 単に呼び出すだけだとエラー
<?php $hoge = myChuno::$hoges;
- 本来の呼び出し方(App::usesを使う)
<?php App::uses('myChuno', 'Model'); $hoge = myChuno::$hoges;
- ちなみに、対象のModelを$this->で呼び出してもエラーにならないが…
<?php public $uses = array('myChuno'); $this->myChuno; $hoge = myChuno::$hoges;
Controllerの途中で処理を終わらせてViewにデータを渡したい場合
<?php $this->render(); return;
- if文の入れ子を減らすことができる。
<?php … … set(compact('user', 'items')); if ($is_post) { if(count($items) > 0) { … … } … … } /* ↑このようなif文があった場合、以下のように書き換えられる */ … … set(compact('user', 'items')); if (! $is_post) { $this->render(); return; } if(count($items) > 0) { … … }
IPアドレスの取得
<?php $this->request->clientip();
ユーザーエージェントの取得
<?php env('HTTP_USER_AGENT'); // もしくは以下 $this->request->header('User-Agent');
Modelに設定したはずのバリデーションが効かない
Controller側で以下のように明示的にバリデーションを実行させようとしたが、動いてくれず。
<?php if (! $this->$model_name->validates()) { … …
リクエストパラメータをセットしていなかったのが原因。
<?php $this->$model_name->set($this->request->data); if (! $this->$model_name->validates()) { … …