CakePHP勉強会 2012春 @東京

CakePHP勉強会 2012春 @東京に参加してきました。

模様はUstreamでも配信されています。過去のライブ一覧

CakePHP2.1がつい先日リリースされていますが、その新機能が紹介されました。
2.0系とも互換性があるそうなので、安心して移行できそうです。

新機能の目玉のひとつViewBlockの紹介。
今まではControllerでthis->setしたりViewでelementを使っていたような実装をViewに纏めてDRYに実装できるようになります。
例えばViewからLayout側に値を入れてみたり、更に入れ子にもできるらしいです。
質問でも出ましたがMon_satさんが仰る通りデザイナさんに投げるには難しそうな実装ですが、管理画面で似たような物を実装する際には便利だと思います。

プラグインバトルロワイヤル。
みなさんが普段使っている、もしくは制作したプラグインの紹介コーナーです。

私が惹かれた一部です。
yalog
this->log()でのログ出力でログローテートが使えるようになったりします。

yacsv
管理画面などでありがちなCSV周りの処理をこなしてくれるプラグインだそうです。

ACL Plugin
ACLの権限を変更できるGUIを提供してくれます。今だにオレオレ権限管理なので使ってみたいです。

そして、MASA-PさんのKtaiLibraryが2系に対応されて、CakeKtaiLibraryとしてリリースされています。
また、今月末に新しいCakePHP関連の書籍を出版されるそうです。対象は珍しくデザイナさん向けで主にViewの解説になっているそうです。
デザイナさんに、これで勉強しといてねと渡すと仕事が楽になる本だそうですが、400ページと壮大なボリュームだそうです。(笑)

まだ他にも2系の本がでるようなので楽しみにしてます。

懇親会、LTでは事例やサービスが紹介されてます。
Ustreamで観ることができますよ。


会場が27Fでしたので素敵な夜景が見えました。99%男でしたが。(笑)

追記:
GitHubで権限を取られてしまうセキュリティホールが出て話題になりましたが、受け取った配列をそのままupdateしてしまうフレームワークやORマッパには全て関係してくる話しのようでCakePHPでも対策は必要です。
私的には$this->model->saveの第3引数で保存するフィールドのホワイトリストを指定できる事を知りませんでした。(1.3系からあったようです)
または忘れるとアレなので素直にセキュリティコンポーネントを使うべきでしょう。

CKEditorシリーズにCKFinderがあったのだが、設定が意味不明で断念。
そこで見つけたのがelfinder

ダウンロードして、CSSとIMG,JSを配置しテンプレートから読み込む。

View

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php echo $this->Html->css('elfinder.css'); ?>
<?php echo $this->Html->script('elfinder.full.js'); ?>
<?php echo $this->Html->script('i18n/elfinder.jp.js'); ?>
 
<script type="text/javascript" charset="utf-8">
	$().ready(function() {
		var f = $('#finder').elfinder({
			url : '/el_finders/index',
			lang : 'jp',
			docked : true,
			toolbar : [
				['reload'],
				['mkdir', 'upload'],
			],
			dialog : {
				title : 'File manager',
				height : 500
			}
 
			// Callback example
			//editorCallback : function(url) {
			//	if (window.console && window.console.log) {
			//		window.console.log(url);
			//	} else {
			//		alert(url);
			//	}
			//},
			//closeOnEditorCallback : true
		});
		// window.console.log(f)
	})
</script>
 
<div id="finder">finder</div>

問題はファイル操作を実行するPHPの移植。

connectors/php/elFinder.class.php を app/Vendor/elFinder.php に入れる。

ElFindersController.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
App::uses('AppController', 'Controller');
App::uses('elFinder', 'Vendor');
 
class ElFindersController extends AppController {
 
	public function index() {
		$opts = array(
			'root'            => '/cakepath/app/webroot/img',                       // path to root directory
			'URL'             => '/img/article/', // root directory URL
			'rootAlias'       => 'img',       // display this instead of root directory name
			'uploadAllow'   => array('images/*'),
			'uploadDeny'    => array(),
			'uploadOrder'   => 'deny,allow',
			//'disabled'     => array(),      // list of not allowed commands
			'dotFiles'     => false,        // display dot files
			// 'dirSize'      => true,         // count total directories sizes
			'fileMode'     => 0666,         // new files mode
			'dirMode'      => 0777,         // new folders mode
			// 'mimeDetect'   => 'internal',       // files mimetypes detection method (finfo, mime_content_type, linux (file -ib), bsd (file -Ib), internal (by extensions))
			// 'uploadAllow'  => array(),      // mimetypes which allowed to upload
			// 'uploadDeny'   => array(),      // mimetypes which not allowed to upload
			// 'uploadOrder'  => 'deny,allow', // order to proccess uploadAllow and uploadAllow options
			'imgLib'       => 'gd',       // image manipulation library (imagick, mogrify, gd)
			// 'tmbDir'       => '.tmb',       // directory name for image thumbnails. Set to "" to avoid thumbnails generation
			// 'tmbCleanProb' => 1,            // how frequiently clean thumbnails dir (0 - never, 100 - every init request)
			// 'tmbAtOnce'    => 5,            // number of thumbnails to generate per request
			// 'tmbSize'      => 48,           // images thumbnails size (px)
			// 'fileURL'      => true,         // display file URL in "get info"
			'dateFormat'   => 'Y M j H:i',  // file modification date format
			// 'logger'       => null,         // object logger
			// 'defaults'     => array(        // default permisions
				// 	'read'   => true,
				// 	'write'  => true,
				// 	'rm'     => true
				// 	),
			// 'perms'        => array(),      // individual folders/files permisions
			// 'debug'        => true,         // send debug to client
			// 'archiveMimes' => array(),      // allowed archive's mimetypes to create. Leave empty for all available types.
			// 'archivers'    => array()       // info about archivers to use. See example below. Leave empty for auto detect
			// 'archivers' => array(
				// 	'create' => array(
					// 		'application/x-gzip' => array(
					// 			'cmd' => 'tar',
					// 			'argc' => '-czf',
					// 			'ext'  => 'tar.gz'
					// 			)
					// 		),
				// 	'extract' => array(
					// 		'application/x-gzip' => array(
					// 			'cmd'  => 'tar',
					// 			'argc' => '-xzf',
					// 			'ext'  => 'tar.gz'
					// 		),
					// 		'application/x-bzip2' => array(
					// 			'cmd'  => 'tar',
					// 			'argc' => '-xjf',
					// 			'ext'  => 'tar.bz'
					//		)
				//	)
			//	)
		);
 
		$fm = new elFinder($opts);
		$fm->run();
	}
}

として完成。これでAuthも通るので管理画面なんかでも使える。

EclipsePDT

最新版である3.02を入れてみた。
http://code.google.com/p/zend-sdk/

日本語化
http://mergedoc.sourceforge.jp/

今までJstyleで表示していたタブや全角スペースも最近ではデフォルトで付いていた。
http://www.myeclipseide.jp/blog/2009/04/eclipse-editor-char.html

細かい所ではタブでインデントしたソースをコピペするとインデントが崩れる事があったが、素直にペーストされるようになった。
また、CakePHPは動的にrequireされるのでコードの自動補完が効かなかった、これがデフォルトである程度効くようになったのは嬉しい。

そしてeclipseのコンソール上でbakeやschemaを実行する設定など。
http://dasalog.eg2mix.com/advent-201111/

あとはEGitプラグインを入れれば終了。

おまけ
http://vrapper.sourceforge.net/documentation/

vi野郎には必須かも。

さらに追記。
Eclipse Color Themes

ここでテーマプラグインを入れて 設定 -> 一般 -> 外観 -> 色とテーマ でコードビューの色を一発で変えられる。
デフォルトでもいくつか用意されているがPHPで人気がありそうなOblivionをインポートしてみた。(某ゲームから取ったのだろうか)
とても眼に優しい色になった。