ラベル CakePHP2 の投稿を表示しています。 すべての投稿を表示
ラベル CakePHP2 の投稿を表示しています。 すべての投稿を表示

2017年12月13日水曜日

CakePHPでコントローラーから呼び出したコントローラーのコンポーネント呼び出し

How to call the controller's component called from the controller with CakePHP


ControllerAから呼び出したControllerBに $components で宣言されているコンポーネントFooのメソッドbarを呼び出すときは手動でloadする必要があります。
ざっくりと。。。

ControllerAはこんな感じ
$B = new BController;
$B->hoge();
ControllerBはこんな感じ
$componets = ['Foo']; // コンポーネントを使うよ
function hoge() {
  // newされたときはコンポーネントを手動で読み込むよ
  if (newされたとき) {
    $this->Foo = $this->Componet->load('Foo');
    $this->Foo->startup($this); // startup()を使うときはこれも手動で
    return $this->Foo->bar();
  }
}
https://book.cakephp.org/2.0/ja/controllers/components.html

#PHP #cakephp

2015年4月9日木曜日

CakePHP アソシエーション備忘録

CakePHP のアソシエーションでjoinするモデルに対してコールバックなどで自前のjoinを追加すると、joinの順番や結合するカラムによってはうまくいかないときがある。
そう、アソシエーションで指定するモデルは、最後にjoinされる。
また、外部キーで削除されるとき、recursive=-1となりアソシエーションは適用されない。
そしてhasManyはjoinではない。

2014年5月1日木曜日

PHP:配列の空要素を削除する

remove the empty element of the array.

PHPです。

一般的にはこちら
$dst = array_filter($ref, 'strlen');
CakePHPならこちら
$dst = Hash::filter($ref);

2013年7月25日木曜日

cakephp と MySQL の tinyint(1)

MySQL の tinyint(1) にデータを登録するとき、
$model->save() すると、0 以外は 1 で登録される。

データ読み込みのテストで、直接 2 をセットし、findすると当該フィールド値が 1 となっている。

CakePHPの仕様とのこと。
以前にもハマって思い出したので備忘録として。

2013年1月29日火曜日

user agent のチェック

アクセスしてくるブラウザによって処理を分けたいときがあります。
スマホやら、システム要件やら、

例えば、InternetExploere 7以降が対象という場合です。
ユーザエージェント文字列を取得し、バージョントークンを判定します。

$userAgent = env("HTTP_USER_AGENT");
if (mb_ereg('MSIE', $userAgent)) {
  preg_match("/(MSIE)(\s([\d]+))/is", $userAgenet, $versionToken);
  if ((int)$versionToken[3] >= 7) {
    // IE7以上のときの処理
  }
}

(参考)マイクロソフト社のユーザーエージェント
http://msdn.microsoft.com/ja-jp/library/ms537503(v=vs.85).aspx


2013年1月6日日曜日

CakePHP2 同じフィールドをDB検索条件に指定するとき

DBを検索するとき検索条件で、以下のような指定(SQLを生成)をしたいときがあります。
WHERE foo <> 1 AND foo <> 2 …(a)
CakePHP2のfind()メソッドを使用するとき、こんな感じで条件を書いて
$conditions = array('foo <> ' => 1, 'foo <> ' => 2);
どうも思った結果が取れない???
生成されたSQLを確認すると、
WHERE foo <> 2
となっています。

どうやら同じフィールドを指定するのはうまくいかないみたいです。
で、以下のようにしてみました。
$conditions = array('foo NOT ' => (1, 2));
こうすると IN句を生成します。こんなふうに、
WHERE NOT IN (1, 2) …(b)
これで思った結果が取得できました。

先に(a)を思い浮かべてしまうのがダメだったみたいですね(^^;


2012年12月8日土曜日

setFlash()されたかどうだか

いろいろとメッセージを表示したいものです。
そんなとき setFlash() って便利!
$this->Session->flash() する前に中身を確認したいときってあると思います。

$this->Session->setFlash('ホニャララ');
$hoge = $this->Session->read('Message.flash');

とすると、

$hoge['message'];

で確認できます。
他にもパラメータを渡せるようです。

http://book.cakephp.org/2.0/en/core-libraries/components/sessions.html
SessionComponent::setFlash(string $messagestring $element = 'default'array $params = array()string $key = 'flash')


2012年11月18日日曜日

CakePHP2で一覧形式のデータを保存する

こんな感じです。

foreach($data as $rec) {
  $this->Model->create();
  $this->Model->id = $rec['id'];
  $this->Model->save($rec, false);
}

ループの数だけSQLを発行するのですね。
フレームワークの魔法はなかったのです。

create()を忘れずに!

2012年11月8日木曜日

cakePHP2 「設定より規約」

CakePHP2です。

「設定より規約」

"convention over configuration"

なるほど、わかります。
これにピッタリハマる案件は幸せです。保守も楽チン???

さて、既存システムのリプレース、やり方はいろいろとあると思います。

予算などなどいろいろな制約の都合上、既存システムからの移行でDBはそのままでいくぜ。
ということもあると思います。結構あると思います。

こんなとき、この「規約」がフレームワークを使用する上でのメリットと、まさにトレードオフになったりならなかったり。

親子関係を持つレコードセットを取得するとき、規約に則っていれば、

find('threaded',…)

などで簡単に取得できます。(これスゴイ!)
がしかし、既存DBレイアウトのままのときはそうもいきません。

join して、find('all', …) で取得したレコードセットを親子関係になるように整形する必要があります。
 ここのコストが結構なものだったりします。
どうせビューでforeachするからそこでやっちゃえよ。というのもわかります。
でもモデルで親子関係の配列を返してやればメンテナンスも楽チンなのです。

実装するとき、SQLがスッと頭に浮かぶのだけれども、せっかくのフレームワーク、ここは「規約」にのっとって、fields/conditions/join/order などを find()メソッドに渡すように書こうとすると結構時間がかかります。(慣れですかね。)

求めるSQL文は頭にあって、それを生成するような、「規約」にのっとった書き方をするのは、ううむ、と思うこともあります。
生成されるのは、結局SQL文です。なので素のSQLをイメージできなきゃ、「規約」も絵に書いた餅ということですね。