CakePHP1.3に移行してみた

こんばんは。
ブログのネタを仕込むという技を身につけて無いので常に行き当たりばったりなさのじ。です。

今走っている案件で、4月にベータ版がローンチになるサイトがあるので、CakePHP1.3にアップデートしてみました。
現状では基本的なCRUDに少し手を加えた程度しか実装していないので、発生した作業はあまり多くありませんでした。
以下、今回変更した点です。

1. View::renderElement()
View::renderElement()が廃止され、View::element()になりました。
今回はは一括置換でOKでした。

2. AppController->pageTitle
AppController->pageTitleプロパティが廃止されました。
Viewで$title_for_layoutを使用する場合、AppController::set('title_for_layout', 'タイトル')を使用します。

3. JavascriptHelper,AjaxHelper
JavascriptHelper、AjaxHelperが非推奨になりました。
今後は、HtmlHelperとJsHelperで代用するようになります。
今回の案件ではいつも通りJQueryを使用しているので、AjaxHelperは使用せず
Javascriptは直打ちしていたので、変更は1点だけでした。
$javascript->link('common.js');
→$html->script('common.js');

以上です。
さらに詳しい詳細については、下のリンク先をご覧ください。
http://hiromi2424.lv9.org/translate/cakephp13/13-migration-guide

デバッグしてて気になったのが、ViewインスタンスのメンバーにJQueryEngineHelperなるものが。
CakePHP1.3から、標準Javascriptライブラリがprototype.jsからjQueryになるらしいので気になります。

jQueryのオブジェクトをdumpするプラグイン

こんばんは。
最近寒すぎて、悴んだ手のせいで名刺交換にやたら時間がかかるさのじです。

最近取りかかっているサイトでは、jQueryでガシガシ共有プラグインを書いてます。
一番初めに、phpでいうvar_dump()の要領でjQueryオブジェクトをdumpするプラグインを書いたので紹介します。

(function($){
	$.fn.dump = function(){
		var elements = this;
		var dumphtml = [];
		
		elements.each(function(){
			var element = $(this);
			if($.browser.msie) {
				for(var i = 0; i < element.length; i++) {
					dumphtml.push(element[i].outerHTML.replace(/^[\r\n\t]+/, ''));
					dumphtml.push("\n");
				}
			} else {
				for(var i = 0; i < element.length; i++) {
					dumphtml.push('<' + element[i].nodeName.toLowerCase());
					for(var j = 0; j < element[i].attributes.length; j++) {
						dumphtml.push(' ' + element[i].attributes[j].nodeName + '="' 
							+ element[i].attributes[j].nodeValue + '"');
					}
					dumphtml.push('>' + element[i].innerHTML);
					dumphtml.push('<\/' + element[i].nodeName.toLowerCase() + '>');
					dumphtml.push("\n");
				}
			}
		});
		alert(dumphtml.join(''));
		
		return this;
	};
})(jQuery);

使い方は、対象のjQueryオブジェクトのdump()メソッドを実行するだけなのでお手軽です。

$("#test").dump();

こういうのって内容のわりに書くのがめんどくさい気がします。
firebugなどのjavascriptデバッグツールを使えば済むことなので、余計に書く気が起きませんでした。
同じような考えの方に使ってもらえたらうれしいです。

いじょ

ComboBox.Itemsについてのちょっとしたこと。

久々更新です。すみません。
最近、わけあってC#.netのC/Sシステムに触ってます。

C#.netといえば超が付くぐらい重量級のフレームワークですね。
今回は、そんなC#.netのマニアックなネタを適当に。

C#.netのComboBoxは、DataBindingするとデータベースのレコードを自動でバインドしてくれ、
見かけ上の動作も気にならない程度には早く動きます。
しかし、訳アリでDataBindingが使えないときには、手動で項目を追加しなくてはなりません。

手動で項目を追加するメソッドはComboBox.Items.Add(Object item)で、引数がObjectクラス
なので何でも突っ込めますが、簡単なルールがあるようです。

それは、
1.引数のObjectクラスに"ID"というプロパティがあると、自動でValueMemberに登録する
2.引数のObjectクラスに"NAME"というプロパティがあると、自動でDisplayMemberに登録する
というものです。

ですので、簡単にComboBoxItemなるクラスを作り、ID,NAMEというプロパティを作ると扱いが
簡単になります。

また、ComboBox.Items.Add()はわりと動作が遅いです。
配列などをループして1つずつ追加していくとバカにならないコストがかかってしまいます。
そういった場合は、ComboBox.Items.AddRange(object[] items)を使うと、私の環境では
ComboBox.Items.Add()をループで回すよりも半分ぐらいの時間ですみました。

最近だと、C#.netのC/Sシステムで作るのは殆どがオーダーメイドの業務システムだと思います。
そういった業務システムだと、ユーザービリティ云々よりも小さな労力でできる、上記のような
ちょっとした工夫が想像上に喜ばれたりしますね。

以上、ちょっとしたことでした。

symfony1.4触ってみた

これまで、比較的ライトなWEBサイトなどは公私ともにCakePHPを使って来ました。
そもそもPHP歴=CakePHP歴なので、他のフレームワークも触ってみようと思い、symfonyにチャレンジしてみました。
バージョンは、最新の1.4です。

以下駄文。

軽く公式のドキュメントに目を通した後に、チュートリアルを追いながら簡単なものを作ってみた感想。

CakePHPより大規模に向くと言われる理由がわかった
プロジェクト->アプリケーション->モジュールと、深い階層構造が出来てる故、膨大な量のソースも管理しやすそう。
逆に、小規模なものを作るには若干の面倒くささを感じた。
PHPというより、javaフレームワークPHPらしく書けるようにした、みたいなイメージ。

コマンドラインコンソールが良さげ
cakeの、わりと貧弱なコマンドとは違い、よく気が利く印象。
doctrine:build --all --and-loadとか、doctrine:build-schemaとか便利。

OOP,DRYがしっかりしてる
ちゃんとしたオブジェクト指向で、Dont Repeat Yourselfを徹底してる印象。
もともとjava使いの自分としては、eclipsePDTでコンテンツアシストがしっかり使えるのがすごく助かる。
コンテンツアシストの動作が遅いのは気になるが、symfonyのせいでは無いから気にしないことにする。

・公式ドキュメントがしっかりしてる
CakeBookなんかは、所々リンクがおかしかったりする(気がする)。
Symfonyの公式ドキュメントはしっかり作ってあって、ある程度の実用的なコードがすぐに手に入る。

・日本語の情報が貧弱?
大規模に強いということから、趣味で使うユーザーが少ないのか、日本語の資料やブログ記事などが
公式ドキュメントを除いて殆ど見つからない。
SIerなどの案件でもよく見かけるから、企業ユーザーがメインぽい。
仕事で使ってるだけだと、いろんな意味で情報をアウトプットするのは難しいから仕方ない。
ただ、twitter経由で公式ドキュメントの翻訳などをしてる方にメッセージを頂いたりして、非常に心強かった。
英語が満足に読めない自分が悪いわけだし、これからは自分が発信していくようにする。


これからは、小規模=cake,大規模=symfonyでがんばる。
明日から、ちょこちょことsymfonyに関する記事を頑張って書く。

CakePHP1.2のpaginateでorderを指定する

コントローラーのメンバー変数に$paginateを宣言せず、paginateを使用するメソッドで直接指定する方法がわからなかったのでメモ。

<?php
		$this->paginate = array(
			'Branch' => array(
				'order' => 'Branch.sort'
			)
		);
		
		$this->set('branches', $this->paginate('Branch', null, array('Branch.sort')));
?>

AppController->paginateの引数はAppModel->findとは違うらしい。
paginateの第三引数にorderの内容を渡したらうまくできた。

新年明けましておめでとうございます

明けましておめでとうございます。
年末年始で見た目に分かるぐらいふっくらとしたsanojimaruです。

2009年は公私ともに変化の年でした。

2010年は、定期的にしっかりとした記事を書くように努めて行こうと思います。
本年も何卒よろしくお願い致します。