cakephp雑記帳 ITかあさん

ITかあさん

CakePHPのapp_controller.phpのbeforeFilterでModelを使う

CakePHPのapp_controller.phpのbeforeFilterでModelを使う

CakePHPのapp_controller.phpのbeforeFilterでModelを使う

CakePHPのapp_controller.phpのbeforeFilterでModelを使いたい!
findでデータ検索したい!

そんなわけで調べてみましたよ。
うまく出来ればCakePHP全体で定数チックに使えるかな、と。

app_controller.phpではまだModelは呼び出されてないから普通に書いてもダメよ

app_controller.phpではまだModelは呼び出されていないので、普通に書いてもダメみたいです。

CakePHPのClassRegistry::initを使う

以下のようにすると、app_controller.phpのbeforeFilter内でfindすることが出来ます。

class AppController extends Controller
	{
function beforeFilter()
		{
$model = ClassRegistry::init('Model');
$this->set('model', $model->find('first'));
	}
}

app_controller.php内で以下のようなModelの呼び出しをしてもダメですよ、ということで。

var $uses = array('Master');

このネタも1.3ですが、来年はこのブログもCakePHP2に対応したいですね~

CakePHPでorder byソート NULL値を最後にする

CakePHPでorder byソート NULL値を最後にするぞ!

CakePHPでorder by ASC NULL値は最後にしたい

あ、先日今年の更新最後とか言ったのに、うっかり更新してしまった

昇順(ASC)ソートすると、NULLが最小になる

昇順にしてね、あ、でもデータが空の場合は最後に持ってきてね

こんな要望、超超よくあります。

order by 句に IS NULL

IS NULLを使うといいらしいぞ!

MySQL

SELECT * FROM models ORDER BY field IS NULL, field;

CakePHP

$con = array(
  'conditions' => array("Model.permission" => '1'),
  'order'=> array('Model.field IS NULL',"Model.field ASC"),
  );
$this->Model->find('all',$con);
NULL値は最後にしたい時、IS NULL 便利ですね~

CakePHPのformヘルパーでcheckboxを1個だけ表示したい時

騙された!CakePHP formヘルパーの普通に書くとcheckboxは配列で渡ってしまうぞ

CakePHPのformヘルパーでcheckboxを1個だけ表示したい時

本日仕事納めのITかあさん

ITかあさんは本日仕事納め。今日はCakePHPの formヘルパー checkboxについてお送りします

CakePHP formヘルパーで、1個だけのcheckboxを作りたい

『公開する』『承認する』みたいな1個だけのcheckboxを作りたい時、ありますね。

ごく一般的なformヘルパーのやり方ですが、
以下のようにやると、一つ問題が発生します。

$options = array('hoge1');
echo $form->input('Model.field', 
	array('type' => 'select', 
		  'multiple' => 'checkbox',
		  'options' => $options,
		  'label' => false,
		  'div' => false,
          'id'=> false));

配列になってしまうぞ

このように配列で出力されますが、1個しかチェックがない場合でも配列になりますので、
このまま行くとSQLにArrayが渡ってエラーになります。

<input type="checkbox" name="data[Model][field][]" value="0"/>

Checkboxが1個しか無い場合は書き方が違うよ

1個しかない場合は、こんな風にシンプルに書きます。

echo $form->input('Model.field', array(  
  'type' => 'checkbox',
  'label'=> false,
));

あまり使わないかもしれないけど、

boolen型などTRUE、FALSEみたいなデータ値だと有効です

CakePHPの複数OR検索は連想配列を追加という提案

CakePHPの複数のOR検索は連想配列を追加するというご提案


SQLのWHEREにあたる部分はCakePHPのconditionsですが、この条件が

条件がたくさんあるとごっちゃごちゃになって分かり難い!

超複雑なconditionsの例

以下はcakephpのcookbookからの引用です。こちら
前半のORはよいとして、後半のANDはORとNOTの条件両方を満たすもの、ですね。

$conditions = array(
'OR' => array(
array('Company.name' => 'Future Holdings'),
array('Company.city' => 'CA')
),
'AND' => array(
array(
'OR'=>array(
array('Company.status' => 'active'),
'NOT'=>array(
array('Company.status'=> array('inactive', 'suspended'))
)
)
)
)
); 
これをどう…理解しろとっ!!

条件にorとかnotとか含まれると、もうね、訳わかんない。ここまで来るとSQL直接書いたほうがよっぽどいいんでないの?と。
Cakeを主食のかあさんも、この超複雑な配列構造には頭を悩ませてました。

複雑な条件の時は、連想配列として代入していけばいいよ!

例えば、先ほどの前半のORも十分分かり難いですが、

$conditionsという配列に、連想配列を追加してゆくという考え

をすると、だいぶすっきりまとめることが出来るじゃないか、と気がつきました

$conditions = array();//配列を追加してゆく考えなので、先に空の配列を代入
//ORの条件
$city_con = array(
array('Company.name' => 'Future Holdings'),
array('Company.city' => 'CA')
);
$conditions[]['or'] = $city_con;

//2つの条件がまっちした時だけのAND
$conditions[]['AND'][]['or'] = array('Company.status' => 'active');
$conditions[]['AND'][]['NOT'] = array('Company.status' => 'active');
空の[] が無いと、常に上書きになってしまうので注意が必要

さらに各条件が後から追加された場合(後半の複雑なAND検索)、
以下のようにしてもいいんですが、

//2つの条件がまっちした時だけのAND
$conditions[]['AND'][]['or'] = array('Company.status' => 'active','Company.area' => 5);
$conditions[]['AND'][]['NOT'] = array('Company.status' => 'active','Company.hoge' => 'hoge');

array_push(配列の末尾に配列を追加)するみたく、

//2つの条件がまっちした時だけのAND
$conditions[]['AND'][]['or'][] = array('Company.area' => 5);
$conditions[]['AND'][]['NOT'][] = array('Company.hoge' => 'hoge');

こんな風に書いてしまうことも出来ますね。

複雑な検索フォームからの条件検索ではけっこう使えますよん。

CakePHPにWordPressのようなエディタ機能が付けられるCKEditorとCKFinder

CakePHPにWordPressのようなエディタ機能が付けられるCKEditorとCKFinder

CakePHPにCKEditorとCKFinderを設置して、ブログ風エディタを手に入れよう
CakePHPに限らず、自作でCMSを作っているとブログのように自由にフォントカラーを変更したい、自由に好きな箇所に画像を入れたいなどまるでWordPressの記事投稿のように行いたいケースもあるかと思います。

そこで大変便利なのがCKEditorCKFinderです。

CakePHPをWordPressのようなエディタ機能が付けられるCKEditorとCKFinder

CKEditorはJavascriptベースで動き、まるでブログCMSのようなプラットフォームを提供してくれます。
これだけすぐれたUIでしかも無料なので 使わない手はありません。

CakePHP以外にも使えるよ

CKEditorはCakePHPはもちろん、WordPressやEC-CUBEなんかにも導入できます。CakePHPに導入するのはあくまでも一例にすぎません。

CKEditor

CKEditorは入力内容をいかにもブログのようなプラットフォームから入力できるようにしてくれます。
つまり、テキスト入力用ですね

CKFinder

CKFinderはブログっぽい画像のアップローダーのプラットフォームを提供してくれます。
つまり、画像のアップローダーですね

CKEditorとCKFinderの2つを組み合わせると簡単に最強ブログエディタがCakePHPにも導入出来てしまうわけです。

CakePHPにCKEditorとCKFinderを導入する手順

それぞれの導入手順を解説していきます。

CKEditorのダウンロード

まずはエディタ側のCKEditorから。

CKEditorのダウンロード

Basic package
Standard package
Full package
この3つからパッケージ内容を選ぶことが出来るんですが、Full packageでないとエディタ中に自由にフォントカラーを変更したり、いかにもブログエディタっぽいことは出来ません。

Full packageをダウンロードして、必要の無い機能を削っていくのがベストだと思います。(私はパッケージ内容を選べることに気づかず、え?フォントカラーとかエディタで変更できないの?ダメじゃん!って勘違いしてました)

ダウンロードはこちらから出来ます。
Download | CKEditor.com

CKEditorのパッケージをwebrootのjsフォルダにアップロード

ダウンロードしたら、丸ごとwebrootのjsフォルダにアップロードします。

CKEditorを設置

ckeditor.jsの呼び出し

view側でHTMLのheadなどにckeditor.js呼び出します。
まあ、普通のJavascriptファイルの呼び出しですね。

<script src="/js/ckeditor/ckeditor.js" type="text/javascript"></script>

ヘルパーで呼び出すならこうですね

echo $javascript->link('/js/ckeditor/ckeditor.js');

Viewファイルの修正

後は任意でこのエディタ機能を設定してあげたい部分を指定してあげればよいだけです。

ほとんどのケースはフォームのtextareaとかこのCKEditorを反映させたいかな~と思いますので、

以下のようなフォームのテキストエリアを

echo $form->input('text',array(
'label'=> false,
'size' => false,
'div'=>false,
'class'=>'form-textarea required',
'id'=>false
)
);

↓↓↓↓↓↓

echo $form->input('text',array(
'label'=> false,
'size' => false,
'div'=>false,
'class'=>'form-textarea required',
'id'=>'ckeditor'
)
);
//直後にJavascriptで追記します
<script type="text/javascript">
var editor = CKEDITOR.replace('ckeditor');
</script>

やり方がどうあれ、最終的にこんな感じのソースになればOKです。

<textarea name="data[hoge][text]" id="ckeditor" cols="30" rows="6" ></textarea>
<script type="text/javascript">
var editor = CKEDITOR.replace('ckeditor');
</script>
エディタを反映させたいtextareaタグにidをふって、CKEDITOR.replace(‘指定したID’);となればOKです。

Before



After



フルパッケージにしたら、デフォルトだと幅ありすぎ・・
でもいかにもブログエディタっぽくて最高ですね!

CKEditorのカスタマイズ

ckeditorフォルダの中のconfig.jsの設定を変更することで、色々カスタマイズできます。

ここでは最低限、CKEditorの幅や高さを変更して、必要の無いツールバーの項目は表示しないようにしました。
(エディタにフォームタグの項目や、コピペやカット、ペーストなども必要ないかと思い、コメントアウトしました)

CKEDITOR.editorConfig = function( config ) {
// Define changes to default configuration here. For example:
// config.language = 'fr';
//config.uiColor = '#3399CC';
CKEDITOR.config.width = '820px'; //横幅
CKEDITOR.config.height = '500px'; //高さ
CKEDITOR.config.resize_enabled = ture;

//CKEDITORのツールバー一覧。必要の無いものはコメントアウトする
CKEDITOR.config.toolbar = [
['Source','Save','NewPage','Preview','Templates']
/*,['Cut','Copy','Paste','PasteText','PasteFromWord','-','Print','SpellChecker']*/
,['Undo','Redo','Find','Replace','SelectAll','RemoveFormat']
/* ,['Form','Checkbox','Radio','TextField','Textarea','Select','Button','ImageButton','HiddenField']*/
,['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock']
,['Bold','Italic','Underline','Strike','Subscript','Superscript']
,['NumberedList','BulletedList','Outdent','Indent','Blockquote']
,['Link','Unlink','Anchor']
,['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak']
,[/*'Styles',*/'Format','Font','FontSize','TextColor','BGColor']
/* ,['ShowBlocks']*/
];
};

表示例


幅を調整しました

CKFinderで記事中の画像挿入も簡単!

CKEditorの設定が終わった段階で、画像の挿入ボタンを押しても、画像のアップロードが出来ないと思います。

あれ?画像のアップロードが出来ない

画像のアップロードボタンなるものが、どこにもありません!

そこでCKEditorに気軽に画像が入れられるよう、CKFinderを設置・設定しましょう!

CKFinderのダウンロード


CKFinderのダウンロード

ダウンロードはこちらから出来ます。
Download | CKFinder.com

CKEditorのパッケージをwebrootのjsフォルダにアップロード

ダウンロードしたら、丸ごとwebrootのjsフォルダにアップロードします。

CKFinderをwebrootのjsフォルダに設置

ckfinder/config.phpを変更

function CheckAuthentication()
  {
  // WARNING : DO NOT simply return "true". By doing so, you are allowing
  // "anyone" to upload and list the files in your server. You must implement
  // some kind of session validation here. Even something very simple as...
// return isset($_SESSION['IsAuthorized']) && $_SESSION['IsAuthorized'];

// ... where $_SESSION['IsAuthorized'] is set to "true" as soon as the // user logs in your system. To be able to use session variables don't // forget to add session_start() at the top of this file.

return true;//false→trueに変更 }
『単純にtrueにしないで下さい。あなたは全ての人にファイルのアップロードを許可することになる』とかなんとか。
なので、マスター管理者とか、ログインを通して画像のアップローダーを触らせることにするべきですね。
ここをtrueにしないと、画像のアップロードが出来ないのでtrueに変更してください
$baseUrl : the base path used to build the final URL for the resources handled
in CKFinder. If empty, the default value (/userfiles/) is used.

Examples:
	$baseUrl = 'http://example.com/ckfinder/files/';
	$baseUrl = '/userfiles/';

ATTENTION: The trailing slash is required.
*/
$baseUrl = 'http://example.com/ckfinder/files/';//最後はスラッシュで終わる
$baseUrlを変更して、アップロード画像のURLを繋ぎます。デフォルトだと『/ckfinder/userfiles/』ですが、URL形式で書いたようがよさげ。
なお、今回の例ですと、webrootのjsをフォルダを指定したので、
/app/webroot/js/ckfinder/userfiles/』として、/app/webroot/もちゃんと書いてあげます。
フォルダを指定したら、フォルダのパーミッションを777にします。

保存ディレクトリの設定

画像の保存先をURL形式で指定するとCKFinderがresolveUrl()関数を通してサーバーディレクトリを見つけてくれるんですが、
これは必ずしも利用しなくても大丈夫です。先ほどの$baseUrlの変数の中身をURLで指定したほうがいいのはこのためです。
URL形式でファイルのパスを指定しなかった人や、自分の好きなディレクトリに画像を保存させたい場合はここで保存ディレクトリを指定します。

//$baseDir = resolveUrl($baseUrl);
$baseDir = '/home/example.com/public_html/app/webroot/img/hoge/';

サムネイル関連の設定

CKFinderはサムネイルの生成もやってくれます。ナイスです。
デフォルトでもOKですが、サムネイルサイズや、フォルダ名、画像URLを指定できます。

$config['Thumbnails'] = Array(
'url' => $baseUrl . 'thumbs/',
'directory' => $baseDir . 'thumbs/',
'enabled' => true,//ここがtrueでサムネイル生成
'directAccess' => false,
'maxWidth' => 150,//サムネイルサイズ
'maxHeight' => 150,//サムネイルサイズ
'bmpSupported' => false,
'quality' => 80);//サムネイルのクオリティ。MAX100

以上で設定は完了なので、画像もアップロードして動作を確認してみます。

CKFinderの動作テスト


CKFinderの動作テスト

イメージプロパティーを選択し、画像をサーバーに送信します。なんかちょっとイイ感じです。OKを押すと、エディタ上に画像が設置されます。

いや~、終わった終わった!とおもったらサムネイルが生成されない!

と、ここまで順調でしたがサムネイルが生成されず、数時間悩みます。
パーミッションも問題ない、ディレクトリもあっている、なぜ??

で、しばらくすると指定フォルダに生成される??

で、画像の情報を良く見ると・・・

サムネイルの生成日時が全て同じ

ちょ・・おまっサムネイルの生成日時が全て一緒??

と、いうことはあるページにアクセスされた時にはじめてこのサムネイルが生成されることが容易に想像付くわけで、
じゃあ一体どこのページよ??
と、しばらくエディタ内をうろうろしていると見つけました

サムネイルの生成はこのページにアクセスされた時に行われる


サムネイルが生成されるページ

サーバーブラウザにアクセスします


サーバーブラウザーのページ

このページにアクセスすると、一度にサムネイルが生成されますが、
さきほどアップロードボタンからでは直接サムネイルの生成は行われません。都度サムネイルを確実に生成したいなら、このページから画像のアップを行う必要があるようです。

なお、このページからだと、WordPressみたく様々な大きさのサムネイルを一度に生成することも出来るみたいです。

んもうっ!早く言ってよ!
要望として、サムネイルの生成を携帯ように行いたいようなので、ここからアップしてくださいって言うしかなさそうだな。

CakePHP Pagination のHTMLカスタマイズメモ


CakePHPのPagination、生成されるHTMLがちょっと分かりにくくてカスタマイズに困っていたのですが、よいコードを見つけましたので、メモ。
ページングでデータ取得したら、viewファイルに以下を直接かけばOKです。

特に注意するところはありません。このままコピペでOKです。シンプル。

//戻るリンク
echo $this->Paginator->prev('前へ', array('escape'=>false), '前へ', array('escape'=>false, 'class' => 'disabled'));
//件数(○件中、○○件)
echo $paginator->counter(array('format' => '%start% ~ %end%件/%count%件'));
//次へリンク
echo $this->Paginator->next('次へ', array('escape'=>false), '次へ', array('escape'=>false, 'class' => 'disabled'));

号泣。CakePHPでSessionが突如切れるのはfaviconのパスが問題でした

号泣。CakePHPでSessionが突如切れるのはfaviconのパスが問題でした

号泣。CakePHPでSessionが突如切れるのはfaviconのパスが問題でした
まさかメールフォームのSessionデータの受け渡しで躓いて丸一日潰すハメになろうとは・・・
でもこれで原因がちゃんと分かりましたし、今後Sessionが突如切れた場合、他のケースでもどのように対応したらよいのかが分かっただけでもよしとします。

CakePHPで突如Sessionが切れる原因

どうやら、CSSや画像関連で実際に存在しないパス&URLを指定していると、サーバにHTTPアクセスを行い、そしてSessionが切れるという問題が発生するようです。

app/webroot/.htaccess

そこで、webroot下の.htaccessにこのように記述すればよいらしいのですが、

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\.(cgi|css|gif|jp?g|png)$
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

・・・ダメでした。

Controllerを疑う、いっそsession_start()を記述してみるなど色々ためすけどいずれもダメ。

viewを疑うなら、layoutsをはずす

一度冷静になろうと思い、layoutsをはずして、CakePHPのデフォルトレイアウトにしてみて、再度メールフォームをテストしたところ、
無事Sessionが引き継がれていることが確認でき、
やはりlayouts関連が怪しいのだとここで確定しました。

そこで対象のlayoutsファイルをよく確認してみるとfavicon.icoはwebrootの直下にあるのに、このようになっていました。

<link rel="shortcut icon" href="favicon.ico" />

ややや・・・お前かい!!

先頭にスラッシュをつけてあげると、無事Sessionの引継ぎを確認出来ました!

<link rel="shortcut icon" href="/favicon.ico" />

Sessionの引継ぎがうまくいかないほかの事例

今回海外のサイトも、日本のサイトも調べまくって、最後はfaviconかいっ!!っていうお粗末な結果になりましたが、
Sessionが突如切れてしまうケースが他にも色々な事例が報告されており、

大きく別けて3つがあげられるようです。

  • ブラウザ依存
  • core.phpのSecurity.level
  • view側で何らかのCSSや画像関連の取得ミス

Sessionの引継ぎがうまくいかなかったら

1.他のブラウザで試す
2.core.phpのSecurity.levelをlowにする
3.view側を疑って、デフォルトレイアウトに変更する

この3つの順番で試してみるといいと思います。

まさかfaviconたった一個でここまで悩むことになろうとは思いもしませんでしたが、Session引継ぎトラブル回避のよい勉強になりました

追記:Sessionの名前変更したら無事動いたよ!

追記2012/11/07

再びCakePHPのSession問題で悩んでいました。今回は上記3つにはいずれも当てはまりません。
自分がCakeで以前作ったプログラムを基本全てコピーして、新しいサイトを作っていたのですが、コピー元は動くのに、複製版は動きません。
Sessionの書き込みは確認できるのに、読み込まれずにいつも新規でSessionを生成してしまうので、全くSessionの意味を果たしていません。

で、腹が立ったのでSessionの名前を変更してみたら何と動きました!

//元
$this->controller->Session->read('seed');

//こちらにSession名を変更
$this->controller->Session->read('seed_id');

なんと、これで動くようになったんです。
原因は不明ですが、どうしてもSessionが動かないとき、いっそSessionの名称を変えるのも一つの選択かも!

CakePHPでベーシック認証を使うなら、Securityコンポーネントが超便利

CakePHPでベーシック認証を使うなら、Securityコンポーネントが超便利

え?CakePHPって最初からベーシック認証のコンポーネントがあるの?

どうやらあるみたいですね。Caker歴2年ちょい。今日まで知りませんでしたのでメモ。

appフォルダ直下app_controoer.php

app_controoer.phpは無ければ作ってください。appフォルダの直下ですよ。

class AppController extends Controller
  {
  
  var $components = array('Security');//Securityコンポーネントの呼び出し
  
  //beforeFilterで最初にこの処理を実行する
  //今回だと、最初にベーシック認証を指定する
  function beforeFilter()
  {
  parent :: beforeFilter();
 $this->Security->loginOptions = array('type'=>'basic');
  $this->Security->loginUsers = array('ユーザー名'=>'パスワード');
  $this->Security->requireLogin(array('Hoge'=>'index'));//Hoge_controller.phpのindex function にベーシック認証をかける
  //$this->Security->requireLogin('*'); アスタリスクで全てのcontrollerとfunctionにベーシック認証をかける 
  }
  }

開発途中でまだ誰にも見せたくない場合は全体にベーシック認証をかけるのもいいし、
マスター管理画面を簡易的に持たせるなら、マスター管理のcontrollerにだけ、ベーシック認証をかけるのもいいと思います。

一部訂正

CakePHPで作られたアプリケーション内全てをベーシック認証をかけるなら、以下で問題ないですが、

class AppController extends Controller
  {
  var $components = array('Security');//Securityコンポーネントの呼び出し
  //beforeFilterで最初にこの処理を実行する
  //今回だと、最初にベーシック認証を指定する
  function beforeFilter()
  {
  parent :: beforeFilter();
 $this->Security->loginOptions = array('type'=>'basic');
  $this->Security->loginUsers = array('ユーザー名'=>'パスワード');
  $this->Security->requireLogin('*'); アスタリスクで全てのcontrollerとfunctionにベーシック認証をかける 
  }
  }

マスター管理など、CakePHPのアプリケーションのうち、特定のコントローラー内だけこのベーシック認証かけるなら、app直下のapp_controller.phpに記述するのではなく、ベーシック認証をかけたいコントローラーだけに直接書きます。

例:マスター管理admins_controller.phpにだけベーシック認証をかける

つい忘れがちなのですが、class AdminsController extends AppControllerとなっているように、通常のコントローラーはAppControllerのextends(拡張)であるので、AppControllerに書けることは、通常のコントローラーにも書くことが出来るのです。

class AdminsController extends AppController {
  var $components = array('Security');
  var $uses = array();
 function beforeFilter() {
  
  $this->Security->loginOptions = array(
  'type'=>'basic'
  );
  
  $this->Security->loginUsers = array(
  'ユーザー名'=>'パスワード'
  );
  
  $this->Security->requireLogin();
  
  }
}

ある単体のコントローラーに対してベーシック認証を入れるならこちらが正解でしょう。

Security コンポーネントを使うと、formにワンタイムトークンがhiddenで入る

こちらのページを見るまで気がつかなかったのですが、確かに自動で入っているようです。

<div style="display:none;"> <input type="hidden" name="key" value="d2743d9299948ad1c47d3675377a41ed8c7ae33c" id="Token836315228" /> </div>

私はこのトークンが入ったからと言って 特に不具合は発生しなかったのですが、もしこのトークンによる不具合が発生した場合、

先ほどの function beforeFilter()の中にこちらを書き加えてトークンの生成を止めさせることも出来るそうです。

$this->Security->validatePost = false; 

CakePHPで複数のデータベースを扱う方法と切り替え

CakePHPで複数のデータベースを扱う方法

CakePHPは一つのCakeのアプリケーション内でデータベースを複数扱うことが可能で、
database.phpに配列形式でいくつも設定できます。

データベースの複数定義

app/config/database.php

以下のように全く違う場所にあるデータベースを扱うことも可能です。

//一つは設定しなきゃだめ
class DATABASE_CONFIG {

	var $default = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => '123.123.456.789',
		'login' => 'hoge.com',
		'password' => 'hoge2012',
		'database' => 'hogehoge',
		'prefix' => '',
		'encoding' => 'utf8',
	);
    
//今回追加した別のデータベース
	var $hoge = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'hoge',
		'password' => 'hoge2012',
		'database' => 'hoge',
		'prefix' => '',
		'encoding' => 'utf8',
	);
}

各データベースの呼び出し

controllersにDBの切り替えを記述

普段は$defaultを扱い、たまに別のデータベースを扱うならコントローラーに書きます

$this->Model->setDataSource('hoge');//DB変更
$this->Model->setDataSource('default');//DBを元に戻す

componentsにDBの切り替えを記述

controllersにデータベースの切り替えが書けるなら、componentsにだって書けます。
変数や渡されたパラメータによってデータベースの切り替えます。

function hoge_func($hoge) {
if($hoge == '1'){
	$this->controller->List->useDbConfig = 'default';
	$this->controller->Item->useDbConfig = 'default';
	}elseif($hoge == '2'){
	$this->controller->List->useDbConfig = 'hoge';
	$this->controller->Item->useDbConfig = 'hoge';
	}
}

ModelにDBの切り替えを記述

これはModel(テーブル名)によって、完全にデータベースを分離させたい時に使えますね。
データベースが肥大化してしまった時などによさそうです。(まあそうなったらデータベースの構造を見直すべきだけど)

class Item extends AppModel{           
var $useDbConfig = 'hoge';
}

こんなカンジで簡単にデータベースの切り替えがCakePHPでは行えます。

CakePHP環境にWordPressをインストールする

CakePHP環境に何かCMSをインストールしたいということ、やや規模の大きなサイトを作っているとたまにあると思います。そこで今回は海外の記事を参考にWordpressをCakePHP環境にインストールする方法を紹介します。Wordpressは一つの例で、この方法はあらゆるCMSに対応出来ます。

CakePHPのwebrootディレクトリにWordPressを設置する

CakePHPのwebrootディレクトリにWordPressを設置します。

/public_html/app/webroot/blog/

webrootディレクトリにblog というディレクトリを作って、そこにWordpressの必要ファイルをアップロードして下さい。

CakePHPのapp直下.htaccessを変更する

設置したWordpressを

http://ドメイン名/blog/

で、アクセス出来るように、CakePHPのapp直下に元々ある.htaccessを変更します。
赤字の部分を追加して下さい。

RewriteEngine on
RedirectMatch temp ^/blog/wp-admin$ http://ドメイン/blog/
RewriteRule ^blog$ blog/ [L]
RewriteRule ^blog/wp-admin$ blog/wp-admin/ [L]

RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]

たったこれだけでCakePHPに設置したWordpressが通常のWordpressと同じように使えるようになりました!めでたし!

今回参考にした記事はこちら