Home > フレームワーク Archive

フレームワーク Archive

CakePHPではまったこと17(belongsTo)

$belongsToを設定しておけばfindで関連するモデルのデータも取ってきてくれるわけですが。
例えば


class Foo extends AppModel {
   var $name = "Foo";
   var $belongsTo = array('Bar' =>
                     array('className' => 'Bar',
                        'conditions' => '',
                        'order' => '',
                        'fields' => array('hoge'),
                        'foreignKey'=>'bar_id'
                        )
                     );
}

って書いておけばFoosControllerで$this->Foo->findById(‘1’);とかやればidが1のデータと、そのデータ中のbar_idに対応するBarのデータも勝手に取ってきてくれる。(当然Fooはbar_idというフィールドを持つ)
この場合はfieldsを’hoge’に指定しているのでBarのhogeフィールドだけをとって来てくれる。
便利なんだけど常にとってきてしまうので鬱陶しいといえば鬱陶しい。
というわけで
var $recursive = -1;
ってモデルに定義しておけば普段はBarを取ってこない。とって来たいときは


$this->Foo->findAll(array('foofoo' => '1'),  array('id', 'name', 'bar_id'), 'id DESC', 10, 1, 2);

ってやればよい。
最後の引数が$recursiveなんで1でいいんじゃないかと思ったんだけど2じゃないとだめだった。
上記で2番目の引数(fieldsの指定)で’bar_id’を指定しないとなぜかBarのデータを取得できないから要注意。
ちなみに1番目の引数は検索条件(’foofoo’が1のデータを取ってくる)、3番目の引数はオーダー(idで逆順)、4番目は取得数上限、5番目は取得開始ページ(4番目の引数である「取得数上限」単位で区切られる)。
さらに例えばFooのcreatedでソートしたいとき、


$this->Foo->findAll(array('foofoo' => '1'),  array('id', 'name', 'bar_id'), 'created DESC', 10, 1, 2);

ってやると怒られる。Barの’created’と衝突するらしい。そういうわけで


$this->Foo->findAll(array('foofoo' => '1'),  array('id', 'name', 'bar_id'), 'Foo.created DESC', 10, 1, 2);

って書かないといけなかった。

なかなかめんどくさい。

以上

CakePHPではまったこと16(Mysqlでdeleteしたら1066??)

これすげー便利。
Ajaxとかでよく使うLoading中のgif画像をジェネレートとしてダウンロードさせてくれる。

そんなわけでCakePHP1.2ですが、Mysqlでもはまりました。
$this->Model->delete()をすると1066っつうエラーが出るという。
ただしこれはMysql4.0系だけの話かもしれません。
deleteでaliasに対応してないっぽいです。(またaliasか)
これに関してはnightly(24-01-2008)でもだめでした。
でどうしたかというと、dbo-source.phpの_delete()をdelete()に、delete()を_delete()に変更しました。
だって_delete()のコメントに

/**
* Generates and executes an SQL DELETE statement.
* For databases that do not support aliases in UPDATE queries.
*
* @param Model $model
* @param mixed $conditions
* @return boolean Success
*/

って書いてあったんだもん。
結果としては、動いてます。いいのかなぁ。

以上

CakePHPではまったこと15(sqliteを使っているときのupdate)

CakePHPの1.2を使い、さらにsqliteをデータベースとして使うという果敢なことをしています。
そういうわけで普通に使うであろうupdate処理を行うとエラーでた。
まあいわゆる
$this->Model->save($data);
なんですけどね。
新規insertは問題ないけど既存のデータを上書きするときです。

Warning (2): sqlite_query() [function.sqlite-query]: near “AS”: syntax error [CORE\cake\libs\model\datasources\dbo\dbo_sqlite.php, line 115]

“AS”の近くが変だと。ようするに”AS”が変だと。
そりゃあそうです。調べてみたらsqliteではupdate句でas(エイリアス)は使えないっていうじゃありませんか。
どうやって直したらいいのかと悩んでいたんですが、最新のソースでは直ってるそうです。
今までBETA:1.2.0.6311を使ってたんですが、nightlyに昇格しました。ますます果敢になりました。

以上

CakePHPではまったこと14(1.2のバリデーション)

最近寒い。温暖化が足りないんじゃないのか。

CakePHP1.2ではバリデーションの方法が変わったよ!っていう情報が氾濫していたのでどうしたらいいのか、以前のやり方はどうなのかと悩んでいました。
どうやら
‘フィールド’=>array(‘rule’ => array(‘定義済み関数か自分で作った関数’), ‘message’ => ‘エラー時のメッセージ’)
って書くっぽいです。もっと複雑な指定もできるみたいだけど、とりあえず使わないから調べてない。
ただ巷の情報を見ていると「定義済みの関数」にVALID_EMAILに相当しそうな’email’やら、日付をチェックできそうな’date’はあるんですがVALID_NOT_EMPTYとかに相当するものがない。どうするんだ、自分で作るのか、と思っていたらそのままVALID_NOT_EMPTYも使えるっぽい。


var $validate = array(
	'mail' => array('rule' => array('email'), 'message' => '正しいメールドレスを入力してください。'),
	'name' => array('rule' => VALID_NOT_EMPTY, 'message' => '名前を入力してください。'),
	'pass' => array('rule' => VALID_NOT_EMPTY, 'message' => 'パスワードを入力してください。')
);

あと、$html->tagErrorMsg()は$form->error()に変わったよ!ってリファレンスには書いてあるんでそれ使ってみたんだけど、エラーメッセージが2重に表示される。つか、$form->error()いらない。なにも書いてなくても勝手にエラーメッセージが出ちゃう。
モデルの$validateでmessageを省略したら’rule’に関係なく「空ですよ」的なメッセージが表示される。(意味違ったかもしれないけど同一のデフォルトメッセージが出る)
どうしたら勝手なメッセージを止められるんだ。・・・あ、もしかして
‘message’=>”
って空文字列入れておけばいいのか?まあ、今度試してみます。

以上

CakePHPではまったこと13(findByの補足)

だいぶ前のエントリの補足。
レコード名がuser_nameのときfindByがfindByUser_Nameになる件ですが、これはPHP4のときだけらしい。
以下参考。
http://www.blueocean.bz/blog/cakephp/archives/29

以上

特定の要素の上でマウスホイールのイベントを取る。(jQuery)

jQueryのマウスホイール・イベントを取ってくれるプラグイン
その要素の上でだけ取ってくれます。
つまり下のような感じ。黒いところでマウスホイールをくりくりすると数字が変わります。(はず)

ソースは下記。mousewheel()で追加するだけです。


<style>
#test_area {
	background-color: #000000;
	width: 100px;
	height: 15px;
	color: #ffffff;
}
</style>
<script type="text/javascript">
	var count = 0;
	$(function() {
		$('#test_area')
			.mousewheel(function(event, delta) {
				if (delta > 0)
					$('#test_area').html(--count);
				else if (delta < 0)
					$('#test_area').html(++count);
				return false; // prevent default
			});
		});
</script>
<div id="test_area">0</div>

以上

CakePHPでのFormのバリデーション

こんなパスワード覚えられないよなぁ。

先日jQueryでのFormのバリデーションを書きましたが、CakePHPの場合、CakePHPで用意されています。


echo $html->input('User/name', array('type'=>'text','size'=>10));
echo $html->tagErrorMsg('User/name', '<span id="error_msg">名前は必須です</span>');

上記のようにhtmlhelperでtagErrorMsgを書いておけば、名前が無記入だった時、エラーメッセージ「名前は必須です」が表示されます。(tagErrorMsgを書いた場所に)
ただ、実は上記だけではだめでUserのModelに


class User extends AppModel {
	var $name = 'User';
	var $validate = array(
		'name' => VALID_NOT_EMPTY
		);
}

という感じに$validateを定義しておく必要があります。

VALID_NOT_EMPTYは空はエラーという意味で、

・VALID_EMAIL:メールアドレスの形式(aaa@aaa.com)じゃないとエラー

・VALID_NOT_EMPTY:空だとエラー

・VALID_NUMBER:数字じゃないとエラー

・VALID_YEAR:年(1000-2999)じゃないとエラー

があるっぽいです。

ちなみに入力エラーの場合、エラー箇所にエラーメッセージが表示されて、正常なところは値が保存されます。
(入力されていた値がフォームに入力されたままになってる)
これは非常に便利なんですが、いちいちクリアしたいと言う場合があったので、そのときは


echo $html->input('User/name', array('type'=>'text','size'=>10, 'value'=>''));
echo $html->tagErrorMsg('User/name', '<span id="error_msg">名前は必須です</span>');

という感じで、valueに空文字列を与えておけばOKでした。

以上

phpのフレームワークについて

URLに大文字が混ざるのは良くない。なんとなく。
といいうことで、スケジュ君のURLを変えました。
幸い誰も利用していないようでしたので。・・・。・・・・・・。
一応URLの仕様的には大文字小文字は区別するようですが、某Webページ診断サービスで大文字に対応していなかったのと、Shift押すのメンドクサイということで。

CakePHPで作成したスケジュ君ですが、最近CakePHPに対する情熱がやや下がり気味。
というのも、CakePHPの大きな利点の一つだと思っていた「PHP4とPHP5の両対応」ですが、もう要らないんじゃないかなぁとか思い始めたからです。
なにしろPHP6の導入に伴って、PHP4の公式サポートが終了するそうですので、もうPHP4はいらないんじゃないかと。
レンタルサーバもPHP5に以降するはずだし。
そうなると、PHP5にしか対応していないとしてもZendFrameWorkやSymfonyでいいんじゃないかと。
某「これはひどい」もSymfonyっぽいし。

そんなこんなで、今、フレームワーク使わずにWebアプリを作ろうとしてます。

以上

jQueryトリビアルメモ2 (prototype.jsとかと共存、jQuery.jsの複数回読み込みについて)

昨日のエントリーがあまりにもひどいので追記。

1.複数回読み込み
jQuery.jsの複数回の読み込み自体は別に問題ないようですね。


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

なんでそんなことがしたかったのかというと、ブログのエントリごとに読み込みたいから。

2.prototype.jsとかとの共存
共存できるんでしょうか?よくは知らない。
ただ、$()の衝突を避けたい場合、


 jQuery.noConflict();

を実行しておけば、


$("div").fadeTo("fast", 0.5);

とする代わりに、


jQuery("div").fadeTo("fast", 0.5);

と書けます。で、prototype.jsを読み込んでいる場合、$()はprototypeの仕様で使えます。

あるいは


 var j = jQuery.noConflict();

としておけば、


j("div").fadeTo("fast", 0.5);

でOKです。

以上

ネタに困ったらjQuery

jquery.jsを同一ページで何回も読み込んだらどうなるんだろう?
というわけでやってみます。

大丈夫なようです。

以上

Home > フレームワーク Archive

Search
Feeds
Meta
 合計:016020
 今日:0018 昨日:0168

Return to page top