CakePHP

【CakePHP2.4】独自コントローラーを継承した際、ComponentとHelperのマージを制御する。

CakePHPはAppControllerで読み込んだComponent、Helperがそれを継承した子コントローラーのそのものと自動的にマージされる。

しかし継承時、親と子の間に独自で定義したコントローラーを挟んだ場合、独自コントローラー内でのComponent、Helperはマージ対象から外れてしまう。

なので、ユーザーの意図した挙動に修正するために独自コントローラー内で下記変数に少々細工を加える。

App::uses('AppBaseController', 'Controller');

class AppBaseController extends AppController {
	public $components = ['hogeComp'];

	// マージ対象の親クラスを変更する
	protected $_mergeParent = 'AppBaseController';
}

上記の通り、「$_mergeParent」にセットする値を変更することでマージの挙動を変更することが可能。

 

【CakePHP2.4】独自で定義したコントローラーを継承する。

AppControllerではなく独自で作成したコントローラーを継承(extends)したい場合、下記の通り継承先のファイルにて用意したコントローラーを読み込んでやる必要がある。

App::uses('ControllerClassName', 'Controller');

例。

App::uses('AdminBasesController', 'Controller');

class AdminsController extends AdminBasesController {

}

こんな感じ。

 

【CakePHP2.x】特殊なmetaタグをhtmlヘルパーで出力する方法。

apple-touch-iconなどの特殊なmetaタグを出力したい場合などの記述方法。

echo $this->Html->meta('apple-touch-icon-precomposed', '/img/apple-touch-icon-144x144.png', [
	'type'=>'icon',
	'size' => '144x144',
	'rel'=>'apple-touch-icon-precomposed'
])."\n";
echo $this->Html->meta('apple-touch-icon-precomposed', '/img/apple-touch-icon-114x114.png', [
	'type'=>'icon',
	'size' => '114x114',
	'rel'=>'apple-touch-icon-precomposed'
])."\n";

こんな感じ。
※第1引数は既知のmetaタグ出ない場合、どこにも出力されない。

 

【CakePHP2.X】モデルのfindメソッドでBETWEENを使う。

めも。

$this->Model->find('all', [
	'conditions' => [
		'Model.col_1 between ? and ?' => [2, 15]
	]
]);

といった感じで指定する。

 

【CakePHP2.x】Modelのfind()メソッド後のコールバック処理を適用する。

モデルごとのfind()処理直後に処理をかましたい場合。

モデルに下記のファンクションを定義すれば良い。
※関数のスコープや引数、引数の初期値まで同一でないと動作しないので注意。

例えば下記のような感じ。

class ModelName extends AppModel {
// find実行後、modelのバーチャルフィールドをリセットする
public function afterFind($results, $primary = false) {
	$this->virtualFields = [];
	return $results;
}

}

ここではfind()後に毎回モデルのバーチャルフィールドをリセットしている。
各モデルメソッドから動的にバーチャルフィールドを設定している場合に便利。

 

【CakePHP2.x】ビューブロックの使い方まる2

使ったことのない方法を使ってみた。

ビュー側にて$this->start(),$this->end()を使ってみる。

<?php $this->start('hoge'); ?>
<div>びゅーぶろっく。</div>
<?php $this->end(); ?>

たとえば上記のようなhogeブロックをビューに記述したとする。
次にこのブロック内($this->end()が宣言されるまで)の内容を出力したいところで、
$this->fetch(‘hoge’)をechoすると内容が出力される。

便利で簡単だね。

 

【CakePHP2.x】アソシエーションの考え方自分用まとめ。

超絶今更シリーズ。

まずは公式より。

+ hasOne (A hasOne B) Aは1つのBを持っている
+ hasMany (A hasMany B) Aは複数のBを持っている
+ belongsTo (B belongsTo A) BはAに従属している
+ hasAndBelongsToMany(HABTM) (A HABTM B) AとBは複数のそれぞれを持っている

最初の3つはいいとして、問題は最後である。
HABTMは多対多の構造上、AとBを結びつけるABテーブルが必要であり、これがbelongsToの部分となる。
よって下記式が成り立つ。

A HABTM B =
(A hasMany AB) and (B hasMany AB) / (AB belongsTo A) and (AB belongsTo B)

ABテーブル内に、AとBの外部キーを保持している形となる。

 

【CakePHP2.4】find()メソッドでorder by句を指定する。

調べてみたら普通にオプションで渡すだけだった。

$options = array(
	'group' => 'col_name'
);

$this->Model->find('all', $options);

意外と今まで知らなかったので戒めも。