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' => '&nbsp;',
        '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()) {

…
…