Home > Tags > CakePHP

CakePHP

bake.php を拡張した decorate.php を使おうとしてみた

使おうと思って、decorate.php を実行すると以下のメッセージ

Your database configuration was not found. Take a moment to create one:
---------------------------------------------------------------
Database Configuration:
---------------------------------------------------------------

What database driver would you like to use? (mysql/mysqli/mssql/sqlite/postgres/odbc)
[mysql] > 

当たり前かもしれないけれど、Oracle には対応していません。今開発しているプロジェクトでは Oracle データベースなのでこのままでは使えない。

TODO oracle に対応する方法を調べる

decorate.php 提供サイト
CakePHP のおいしい食べ方: Scaffolding and Decorating your web app with CakePHP

CakePHP のエラー処理

今から考えて作ってみる。
Object::cakeError() はどうだろう?

app/error.phpというファイルにAppError extends ErrorHandlerを作る。
Apperror::foo() jを作る。
app/views/errors/foo.thtml を作る

参考
memo-space :: CakePHP日記:AppErrorで日本語が表示できない

例えば以下のような感じかな、

class AppError extends ErrorHandler{    function errorPatternOne {        // エラー処理    }}

呼び出し方は

$ret = CakeError('errorPatternOne', array(array('message' => 'たいへんエラーが発生')));

$ret の中身は errorPatternOne の返り値が設定される。
エラー処理の際はログも出力したい。
つづきは明日。
つづきはあさって。

bindModel と unbindModel について

参考
New feature: bindModel/unbindModel « cakebaker
A couple Cake tricks in Posts@ rd11, supporters of CakePHP and developers of innovative web applications using php, ajax, xhtml, flash

bindModel と unbindModel は、モデルクラスで “hasOne、hasMany、belogsTo、HABTM” で設定されているアソシエーションを動的に変更する為に使用します。
以下の例は Supportrequest モデルを動的にバインド/アンバインドします。

// unbindModel の使い方

$this->User->unbindModel(array('hasMany' => array('Supportrequest')));debug($this->User->findAll());// bindModel の使い方$this->User->bindModel(array('hasMany' => array('Supportrequest' =>                             array('foreignKey' => 'user_id'))));debug($this->User->findAll());

Oracle with CakePHP でプレースホルダを使うには

#2294: dbo_oracle_diff.txt – CakePHP : The Rapid Development Framework for PHP – Trac

これをうまく組み込めば Oracle でプレースホルダが使えそう。

とりあえず oracle を使いたい場合は、Oracle 9i with CakePHP (Sylvan) の下の方を参照。はじめ dbo_adodb.php を使おうとして失敗、dbo_oracle.php を使うとうまく動きました。

チケット 2294 は 4000 byte を超えるデータの場合エラーになるのでそのための修正パッチでした。このパッチをあててもプレースホルダは使えません。

#2294 (Oracle is limited to 4000 chars in SQL statement strings (ORA-01704: string literal too long))

○追記
最終的には dbo_oracle.php をカスタマイズしてプレースホルダを利用できるようにしました。

Oracle 9i with CakePHP

CakePHP で Oracle を使ってアクセスすると以下のようなエラーが発生して困った。

Fatal error: Call to a member function on a non-object in
/...../cake/cake/libs/model/dbo/dbo_adodb.php on line 298

Oracle 9i with CakePHP でも同じ問題で躓いている人がいたが、解決の手がかりはなし。

CakePHP で
CaekPHP の本家を見ていると、
#1526 (Oracle+ADODB+CakePHP Call to a member function MetaType() on a non-object in dbo_adodb.php) – CakePHP : The Rapid Development Framework for PHP – Trac

・resolution set to wontfix.

 

We are creating a native Oracle driver that will be used instead of Adodb, there are too many changes that are specific to Oracle for us to change the Adodb dbo.

This should be completed shortly and can be placed in your own app/models/dbo

というように、CakePHP としては対応しません、ということになっている。(wontfix)

仕方がないので、いろいろ探していると、バージョン 1.2.x の方に dbo_oracle.php というものがあったので試してみるもやっぱりエラー。

Parse error: parse error, unexpected '&', expecting T_VARIABLE or '$' in
/...../cake/cake/libs/model/dbo/dbo_oracle.php on line 217

もう少し探すと
#2024 (dbo_oracle: Oracle preserved keys and fullTableName) – CakePHP : The Rapid Development Framework for PHP – Trac
にもバグ修正後の dbo_oracle.php があったので使ってみるとエラーはなくなりました。

ただ開発中のソースなのでこのまま問題なく使用できる保障はない。

2007/04/17 追記

オラクルでトランザクションを使いたいので、以下から最新の dbo_oracle.php を取得し置き換えました。
root/branches/1.2.x.x/cake/libs/model/datasources/dbo/dbo_oracle.php
Revision 4620
このままだとエラーになるので、何点か修正。
31 行目ぐらいに

uses('model'.DS.'datasources'.DS.'dbo_source');

を追加。
150、151 行目の execute 文をコメント化

//$this->execute('ALTER SESSION SET NLS_SORT=BINARY_CI');
//$this->execute('ALTER SESSION SET NLS_COMP=ANSI');

217 行目の “&” がエラーになるので削除。※ “&” の意味を調べる必要あり

foreach ($fields as $value) {

これぐらい修正するととりあえず動きます。
トランザクションのテストはまだしてません。

テストしてみてまだエラーだったので、
1.1.x.xの場合 Re: トランザクションを実現するには
にあるように、以下 2 ファイルを修正する
cake/libs/model/datasources/dbo_source.php
cake/libs/model/model_php4.php(サンプルはmodel_php5.php となっているが同じコードを php4 に使っても大丈夫)

ここまでやると、エラーは発生しなくなりました。
あとは複数テーブルのコミット、ロールバックの確認。

2007/04/20 追記

複数テーブルのコミット、ロールバックも OK でした。

ホーム > タグ > CakePHP

ぴくちゃー
ブログパーツ

ページの上部に戻る