CakePHP モデルのvalidates()に注意 | Shin x blog には対応する必要がありそう。
このままだと空っぽのデータをバリデーションにかけると OK になる。
CakePHP モデルのvalidates()に注意 | Shin x blog には対応する必要がありそう。
このままだと空っぽのデータをバリデーションにかけると OK になる。
使おうと思って、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
今回行ったのは、Subversion のキーワード置換用の “$Id$” という文字列が入っていないファイルに対して一括で挿入する処理です。
ほんとうは実行結果のログも取得したいところですが、時間がなかったのでログはなしで。
for i in `find -name "*.php"`; do sed -e 's/@version.*$/@version $Id$/' $i > $i.new && mv $i.new $i; done
SqlPlus で HELP コマンドを実行すると以下のようなエラーが発生しました。
SP2-0171: HELPにアクセスできません。
単純に HELP をインストールしていないだけなのでインストールします。
SQL> connect system/xxxxx
接続されました。
SQL> @/xxx/xxx/xxx/hlpbld.sql;
1に値を入力してください: helpus.sql
system ユーザーで hlpbld.sql を実行します。実行すると入力プロンプトが出るので helpus.sql と入力します。
普通に sqlplus に接続して、
SQL>select * from sample;
とかを実行すると実行結果がとても見づらい。
SQL>set line 200
と設定すると多少見やすくなる。
でもそれでも見づらい。
今から考えて作ってみる。
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 の返り値が設定される。
エラー処理の際はログも出力したい。
つづきは明日。
つづきはあさって。
複雑な仕様の場合、SQL も同じように複雑になってしまうことがよくある。
Java や PHP といった言語なら複雑にならないように部品化したり、コンポーネント化したりするリファクタリングといった手法がある程度確立されてきているが、SQL に関してそういったものはあまり見たことがない。
まぁ、とりあえず複雑になるのは仕方がないとして(そのうち勉強する)、レスポンスや負荷に関しては仕様を満たす範囲で最適化したい。そういった場合に活用するのが 実行計画。
実行計画は、1.EXPLAIN PLAN といったコマンドを使って取得する方法と、2.AUTOTRACE を有効にして取得する方法がある。
1.は SQL を実行せずに解析する為、実行計画は取得できるが SQL の統計情報は取得できない。
2.は SQL を実行し解析するので SQL の統計情報も取得できる。
とりあえず1.の方法だけ説明。
EXPLAIN PLAN FOR SELECT * FROM HOGE;
SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());
上記 2 行で実行計画が取得できる。
実行計画の読み方についてはまたこんど。
参考
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());
ファイルをメンテナンスする度にヘッダーコメントを修正するのは非常に手間だし修正忘れもよく起こりいいことがない。
以下の例のようにヘッダーコメントを自動で設定するようにしたい。
@version $Id: xxxxx.php 391 2007-01-01 18:36:59Z xxxxx $
調べてみるとこれはキーワード置換という CVS や SVN のようなバージョン管理ツールが持っている機能を使っているらしい。
以下はキーワード置換を有効にする方法。
Subversion の propset コマンドを使います。
find . -name "*.php" -exec svn propset svn:keywords "Id" {} ;
Id 以外のキーワードも使いたい場合は、ダブルコーテーションでくくって以下のようにします。
find . -name "*.php" -exec svn propset svn:keywords "Id Revision LastChangedBy Date" {} ;
あとは普通にコミットすれば自動で、$Id$ という文字列が展開されます。
あと毎回 propset コマンドで設定するのはめんどくさいので、ファイルを追加する時に自動で propset を設定するようにします。
どこでもいいのでディレクトリを右クリックします。※TortoiseSVN がインストールされているのが前提
で、右クリック->TortoiseSVN->設定->一般->Subversion の編集ファイル->編集 を実行。すると設定ファイルが開かれるので、
[miscellany]
enable-auto-props=yes
[auto-props]
*.php = svn:keywords=Id
*.tpl = svn:keywords=Id
*.thtml = svn:keywords=Id
を追記します。
これで次回から追加するファイルは自動でキーワード置換が有効になります。