忍び歩く男 - SLYWALKER

大阪のこっそりPHPer

CakePHP1.2.5 SecurityComponentでハマったときに確認するポイント

SecurityComponentを使うとすぐにblackHoleへ吸い込まれる貴方は必見です。

$form->create() $form->end() をちゃんと使っているか

SecurityComponentを使うとTokenをチェックしてくれますが、ちゃんとFormHelperを使ってTokenを発行しないことにはblackHoleへ吸い込まれてしまいます。
$form->create() $form->end() を使いましょう。
$form->submit() ではダメです!

DatabaseのTable内に存在しないField名を使っていないか

SecurityComponentではTokenを作成する際、DatabaseのTableのFieldを読み込んでHashを作っているようです。なので、それ以外のInput項目を付け加えてしまうとblackHoleへ吸い込まれてしまいます。
項目を付け加える必要がある場合は、以下のようにControllerに設定しておきましょう。

<?php
	public function beforeFilter() {
		$this->Security->disabledFields = array('hoge');
	}
?>

2 way Validating a HABTM relationship

方法1 Model Tagに書く

参考: How to validate HABTM data… « nuts and bolts of cakephp

Model Tag
<?php
class Tag extends AppModel {
	public $name = 'Tag';
	public $validate = array(
		'Tag' => array('rule' => array('multiple', array('min' => 1, 'max' => 3))),
	);

	public $hasAndBelongsToMany = array('Post');
}
?>
Controller Posts
<?php
class PostsController extends AppController {
	function add() {

		if(!empty($this->data)) {
			$this->Profile->create();
			$this->Post->Tag->set($this->data);
			if($this->Post->Tag->validates() && $this->Post->save($this->data)) {
				//succsess
			}
		}

		$this->set('tags', $this->Post->Tag->find('list', array('fields'=>array('id', 'tag'))));
	}
}
?>
View Posts add
<?php
echo $form->create('Post', array('action'=>'add'));
echo $form->inputs(array(
	'title',
	'post',
	'Tag' => array('multiple'=>'checkbox'),
);
echo $form->end('Submit');
?>

方法2 Model Postに書く

Model Tag
<?php
class Post extends AppModel {
	public $name = 'Post';
	public $validate = array(
		'Tag' => array('rule' => array('multiple', array('min' => 1, 'max' => 3))),
	);

	public $hasAndBelongsToMany = array('Tag');
	
	function beforeValidate() {
		$this->data['Tag']['Tag'] = $this->data['Post']['Tag'];
		return true;
	}
}
?>
Controller Posts
<?php
class PostsController extends AppController {
	function add() {

		if(!empty($this->data)) {
			$this->Profile->create();
			if($this->Post->save($this->data)) {
				//succsess
			}
		}

		$this->set('tags', $this->Post->Tag->find('list', array('fields'=>array('id', 'tag'))));
	}
}
?>
View Posts add
<?php
echo $form->create('Post', array('action'=>'add'));
echo $form->inputs(array(
	'title',
	'post',
	'Post.Tag' => array('multiple'=>'checkbox'),
);
echo $form->end('Submit');
?>

ドキュメント勉強会に参加しました

8月6日に開催されました、ドキュメント勉強会に参加しました。
今回は、おやつ係&懇親会幹事&発表といった形で関わらせていただきました。


さて、自分自身ドキュメント経験値ゼロという状態の中
気づいたことを何点か

  • ドキュメントには伝える対象によって内容が変化する
    • 発注者向け
    • 開発者向け
    • などなど
  • 使っているツールはOffice系が多い
  • やはり、会社によってフォーマットが違う
  • しかし、内容には共通したものが多い(当然か>

自分の発表

なんかただのツール紹介になってしまいました^^;
redmineにすべてのドキュメントをまとめていきたかったんですが、力及ばす。
もっと勉強が必要ですね…

反省点

おやつに出したみたらし団子は、持つところまでみたらしに浸かっていて、阿鼻叫喚だった。

懇親会

ちょうど悩んでいた新人教育などの話ができたことが大きかった。

内容とは関係ないですが

eventsのときは、参加者の感想ブログがトラックバックで確認できたのですが、
ATNDになるとそれができないので、勉強会まとめのサイトつくってみました。

http://studybookmark.net/
ユーザ登録やパスワード忘れ処理とかは下のプラグインつかってます
slywalker's account_manager at master - GitHub
このあたりの開発話はまたエントリー書く予定です。

CakePHP1.2.3 MediaPluginをつかってみた その2

CakePHP1.2.3 MediaPluginをつかってみたの続編

結構環境によってハマリどころが多いのでメモ
あと、プラグインのアップデートで動かなくなってしまったとこもあるので注意

Model Attachment

これがデフォルトのvalidateの設定

<?php
class Attachment extends MediaAppModel {
	var $validate = array(
		'file' => array(
			'resource'   => array('rule' => 'checkResource'),
			'access'     => array('rule' => 'checkAccess'),
			'location'   => array('rule' => array('checkLocation', array(
				MEDIA_TRANSFER, '/tmp/'
			))),
			'permission' => array('rule' => array('checkPermission', '*')),
			'size'       => array('rule' => array('checkSize', '5M')),
			'pixels'     => array('rule' => array('checkPixels', '1600x1600')),
			'extension'  => array('rule' => array('checkExtension', false, array(
				'jpg', 'jpeg', 'png', 'tif', 'tiff', 'gif', 'pdf', 'tmp'
			))),
			'mimeType'   => array('rule' => array('checkMimeType', false, array(
				'image/jpeg', 'image/png', 'image/tiff', 'image/gif', 'application/pdf'
		)))),
		'alternative' => array(
			'rule'       => 'checkRepresent',
			'on'         => 'create',
			'required'   => false,
			'allowEmpty' => true,
		));
}
?>

ここで注意しないといけないのは2点

  • location
  • mimeType
location
'location'   => array('rule' => array('checkLocation', array(
	MEDIA_TRANSFER, '/tmp/'
))),

ruleの第2引数はallowディレクトリです。
ここには、upload_tmp_dirも含まれる必要があります。
見ての通り、Windows環境ではこのvalidationに引っかかりまくります。
第2引数をtrueにするとすべて許可状態になります。

mimeType
'mimeType'   => array('rule' => array('checkMimeType', false, array(
	'image/jpeg', 'image/png', 'image/tiff', 'image/gif', 'application/pdf'
)))),

ruleの第2引数はdeny、第3引数はallowです。
image/jpegをuploadしたのに引っかかってしまいます。
(testでも失敗になってたので、そのうち修正が入るでしょうが…)
とりあえず第3引数をtrueにしときます。

CakePHP1.2.3 MediaPluginをつかってみた

2009-07-31 追記
CakePHP1.2.3 MediaPluginをつかってみた その2


最小導入方法

davidpersson's media at master - GitHub
GitHubからソースコードを持ってきて、app/pluginsフォルダ内に配置。

$ cd app
$ cake schema run create media -path plugins/media/config/sql

もしくは

plugins/media/config/sql/media.sql

を元にTableを作成。


app/webroot/media フォルダ作成してパーミッションを設定


app/config/bootstrap.phpに次を追加

<?php
require_once(APP.'plugins'.DS.'media'.DS.'config'.DS.'core.php');
?>


ModelにAssociationを追加

<?php
class Post extends AppModel {
	var $name = 'Post';
	var $hasMany = array(
		'Attachment' => array(
			'className' => 'Media.Attachment',
			'foreignKey' => 'foreign_key',
			'conditions' => array('model' => 'Post'),
			'dependent' => true,
		),
	);
}
?>


ControllerのModel::save()をModel::saveAll()に変更

-	if ($this->Post->save($this->data)) {
+	if ($this->Post->saveAll($this->data, array('validate' => 'first'))) {


ViewtにMediaPluginのelementを追加
FromHelper::create() の option に array('type' => 'file') を忘れずに
add.ctp, edit.ctp

<?php
echo $form->create('Post', array('type' => 'file'));
echo $form->input('id');
echo $form->input('subject');
echo $form->input('body');
echo $this->element('attachments', array('plugin' => 'media'));
echo $form->end('submit');
?>


view.ctp
hasManyでやってるので複数でてくる

<?php
echo $medium->embed($medium->file('filter/s', $post['Attachment'][0]));
?>

設定

media/config/core.php の中身をみるとだいたい分かる。

画像加工の種類
  • fit
    • 設定サイズに収まるように縮小
  • fitCrop
    • 画像を最大限使用できるように、縮小した上で設定サイズでトリミング
  • zoomCrop
    • 画像の中心部分を設定サイズでトリミング (たぶんあってる)
保存ファイル名の変更

media/models/behaviors/transfer.php のコメントをみるとだいたい分かる。


2009-07-31 追記
CakePHP1.2.3 MediaPluginをつかってみた その2

CakePHP1.2.3 Pluginでのi18n

DebugKitの中身をみて気づいたこと


通常、i18nを使う時は

__('English');

としていますが、
Plugin内で使用するときは
以下のようにdomainにplugin nameを指定することができます。

__d('my_plugin_name', 'English');

そうすると、以下の.poファイルをApp側で読み込んで翻訳してくれます。

my_plugin_name/locale/jpn/LC_MESSAGES/my_plugin_name.po

CakePHP1.2.3 PluginのviewsをApp用に変更する方法

Theme機能を使う


AppControllerのbeforeFilter()に以下のように

<?php
class AppController extends Controller {
	function beforeFilter() {
		if (isset($this->params['plugin'])) {
			$this->view = 'Theme';
			$this->theme = $this->params['plugin'];
		}
	}
}
?>

beforeRender()でもよさそうだけど、DebugKitが表示されなくなった。


以下の場所にPluginのviews内のfilesをcopyしてApp用に変更する。
my_plugin_nameはプラグイン名にする。

app/views/themed/my_plugin_name/