アーカイブ

‘cakePHP’ カテゴリーのアーカイブ

jQuery書籍購入

2010 年 3 月 4 日 Jiro コメントはありません

たまたま、本屋に行く機会があったのでちょっと立ち読みしてたらjQueryの本を見つけました。

基本的な使い方はWebで調べると色々出てくるのですが、この本はサンプル集が多くて「メニュー」「グリッド」「ツールチップ」などが

掲載されていたので思わず購入してしまいました。

プラグインの使い方はWebで調べるの結構面倒なんですよね。まあ、例に漏れずすべてのプロパティやアクションを紹介している

わけではないのですが、とりあえず使ってみるきっかけにはいいですよね。

それに、度忘れしちゃうことが多いので、さくっと引いてみて「ああ、そうだった。」って感じで使ってます。

カテゴリー: cakePHP タグ: , ,

cakePHP覚書#3

2010 年 3 月 2 日 Jiro コメントはありません

連想配列(modelの内容をDBからとってきたもの)の配列。要は複数レコードを入れた配列なんですが、

foreachで回して、項目を変更したのだけど、元の配列自体に変更が及んでいないようで、その後saveAllしても

DBに反映されていない。

for文で直接もとの配列を書き直してみよう。

foreach ($bs as $b){
	$b['model']['data'] = "test";
}

こういう風にすると「$bs」のなかみ$bs[0]['model']['data']は書き換えられなかった。

for ($i=0;$i<count($bs);$i++){
	$bs[$i]['model']['data']="test";
}

こうしたらうまく書き換えてくれた。

findなどでデータベースのレコードを取得する場合の条件の書き方でくだらないミス。

$conditions = array('nenrei>' => $nenrei);

フィールド名と比較演算子の間のスペース忘れると変なことになる。

where 'nenrei>' = 1

比較演算子がフィールド名の一部と誤認識される。つーか、空白で区切らないと当たり前のことですね。ww

カテゴリー: cakePHP タグ: ,

cakePHP覚書#2

2010 年 3 月 1 日 Jiro コメントはありません

ちょっと複雑なデータ更新が必要になってきたので、トランザクションを調べることにした。

ひとつのテーブルで更新と追加が同時発生、他のテーブルでも同様という風に二つのテーブルにまたがる処理ですが

アソシエーションでは定義できないようなもの。

まずMySQLのテーブルがMyISAMだとロールバックしても効かないので使えない。InnoDBに変更が必要となる。

show table  status;

で現状の確認をする。MyISAMで作っている既存テーブルもInnoDBに変更可能。

変更するには、phpMyAdminであればテーブルの「操作」で「ストレージエンジン」を「InnoDB」に変更して実行押すだけ。

alter table 'xxxx'  engine=InooDB;

が実行された。もちろんコマンドラインから、これを打ってもOKです。

さてさて、begin()  commit()  rollback() をどこで定義しておくか。

必要なテーブルのモデルだけで定義しておいてもいいけど面倒ですね。思い切ってapp_modelに書いとけば全部のモデルで継承してくれますから、これでいいかな。

いつものように、cake以下は触らないお約束で、cake/libs/modelのなかのapp_model.phpをapp/models以下にコピーしておいて追加します。

function begin() {
	$dbs = & ConnectionManager::getDataSource($this->useDbConfig);
	$dbs->begin($this);
}

function commit() {
	$dbs = & ConnectionManager::getDataSource($this->useDbConfig);
	$dbs->commit($this);

}

function rollback() {
	$dbs = & ConnectionManager::getDataSource($this->useDbConfig);
	$dbs->rollback($this);

}

これで、モデルの関数になるのでモデル名->begin()とかで使えます。

2つのモデルを同時更新なら

	ModelA->begin();

	ModelB->begin();

	処理ほにゃらら

	なんか問題あったら

	ModelA->rollback();

	ModelB->rollback();

	エラー無く終了。

	ModelA->commit();

	ModelB->commit();

こんな具合かな。それとsavaAllを使うときの注意もあった。saveAllの外側でトランザクション開始していてもループの途中でコミットされちゃうみたいです。対策としてはパラメータを追加しておくこと。

ModelA->saveAll($datas ,array('atomic'=>false);

こんなおまじないが必須だ。

追記:どうもModelA ModelB両方にbegin() rollback() commit()を行わなくても、ModelAだけやっておけば、両方に効力があるという記述を発見。まだ未検証です。

追記:検証しました。

実行されたSQLも確認しましたが、どれかひとつのモデルでトランザクション操作しておけばOKです。


カテゴリー: cakePHP タグ:

cakePHP覚書

2010 年 2 月 28 日 Jiro コメントはありません

テーブルに追加しておいたcreatedとmodifiedの項目。

これらの項目を追加しておくと自動的に追加した際と更新した際にタイムスタンプが登録されるはずなのだが

modifiedの更新日時が書き換えられていない。スペルを間違ってるのかなと心配になりググって見たら

cakePHP1.2からはmodifiedの項目はdefault Nullにしていないと更新されないようなのでテストしてみる。

うまく動作しました。ただdefault値をヌルにしたらSQLエラーで怒られたけど、よく見たらヌルを許可してなかっただけでした。

カテゴリー: cakePHP タグ:

cakePHP Vaildateプラグインにはまる

2010 年 2 月 26 日 Jiro コメントはありません

cakePHP画面開発しております。
ちょっと複雑な画面になってきて、チェックボックスをコントロールしたり、複数条件でのバリデートが入ってきたので

jQueryとプラグインを活用しています。javascriptによるクライアント側でのバリデートに便利なプラグインを導入しました。
ダウンロードはこちらから

利用にはjQueryが必要です。jQueryは、ループが不要でDOM内のエレメントをIDやタグ、クラスで引っ張ってきて簡単に更新が出来て
すごく便利です。書式も簡略化しているし、軽いのもいいですね。

さてvalidateプラグインを導入してフォーム内のバリデートを行うのですが、通常用意されているルールだけでは足りず
addMethodを利用して複雑な条件を孵化してみたのですがなかなか動きません。

//時刻大小チェックメソッド追加
jQuery.validator.addMethod("checkTime",
	function(value, element, params) {
		if(params[0]&gt;params[1]){
			return true;
		} else {
			return this.optional(element);
		}
	},
		"時刻の指定が間違っています。"
	);

と書いて、時刻を選択するセレクトボックスの内容を渡すため

rules: {
	'data[Clinic][fromJikan1]': {
		required: "#ClinicJikantai0:checked",
		"checkTime": [$("#ClinicFromJikan1").val(),$("#ClinicToJikan1").val()]
	},

という風にセレクトボックスのvalueを渡してみたのですが、firebugで確認するとparamsに何も入ってきません。
昨夜はこれではまったままでした。

色々と調べた結果、どうもパラメータで渡せるのは単なる文字列だけみたいで、意味も無くfunctionの返値にしてみたりと
あがいたけどどうもなりませんでした。

結局エレメントのIDを文字列で渡して、メソッド側で処理することで成功しました。

書き直したのはこんな感じ。

jQuery.validator.addMethod("checkTime",
	function(value, element, params) {
		if (!$(params[2]).attr('checked')){return true;}
		if ($(params[0]).val() &lt; $(params[1]).val())	{
			return true;
		} else {
			return this.optional(element);
		}
	},
	"時刻の指定が間違っています。"
);

セットする側は

rules: {
	'data[Clinic][fromJikan1]': {
		required: "#ClinicJikantai0:checked",
		"checkTime": ["#ClinicFromJikan1","#ClinicToJikan1","#ClinicJikantai0"]
	},

てことで、無事動作しました。prams[2]にはチェックボックスのIDをいれて、ここにチェックが入ってなければバリデートしないように
しました。

忘れないうちに自分で覚書。

カテゴリー: cakePHP タグ: , ,
Get Adobe Flash playerPlugin by wpburn.com wordpress themes

Bad Behavior has blocked 10 access attempts in the last 7 days.