mediaプラグイン応用(3) ファイルチェック

アップロードするファイルの種類やサイズをチェックする設定を追加しました。
端的に言うと、バリデーションです。

基本的にそんなに難しくないのですが、$fieldList指定を追加していたために、ちょっとハマりました・・・


Mediaプラグインでvalidationを単純に入れようと思ったら、以下の資料の18ページ目が非常にわかりやすいサンプルになっています。
The_CakePHP_Media_Plugin.pdf

またはmedia/models/attachment.phpには基本的な$validate設定が既に設定してあるので、これを見るだけで大体つかめます。


これらの設定のうち、必要なものをAttachmentの拡張モデルおよびcontrollerで変更しました。


app/plugins/media/models/attachment_ex.php

@@ -9,8 +9,17 @@ class AttachmentEx extends Attachment {
function __construct($id = false, $table = null, $ds = null) {
	$this->actsAs['Media.Transfer']['destinationFile'] = ':Medium.short::DS::uuid:'.'.'.':Source.extension:';

+	// validate
+	$this->validate['file']['extension'] = array('rule' => array('checkExtension', false, array(
+		'jpg', 'jpeg', 'png', 'gif',
+	)));
+	$this->validate['file']['notEmpty'] = array('rule' => array('checkMimeType', false, array(
+		'image/jpeg', 'image/png', 'image/gif'
+	)));
+
        parent::__construct($id, $table, $ds);
}


app/controllers/users_controller.php

@@ -91,6 +91,24 @@ class UsersController extends ModuleController {
+// validate
+// ファイル容量
+$filesize = Configure::read('Upload.imagefile.FileSizeMax');
+if (empty($filesize) || $filesize <= 0) {
+	unset($this->User->Attachment->validate['file']['size']);
+} else {
+	$this->User->Attachment->validate['file']['size']['rule'] = array('checkSize', $filesize.'K'
+}
+//ファイルサイズ
+$width = Configure::read('Upload.imagefile.WidthMax');
+$height = Configure::read('Upload.imagefile.HeightMax');
+if ((empty($width) || $width <= 0) || (empty($height) || $height <= 0)) {
+	unset($this->User->Attachment->validate['file']['pixels']);
+} else {
+	$this->User->Attachment->validate['file']['pixels']['rule'] = array('checkPixels', $width.'x
+}

ただ、最初Attachmentでfileに関する全てのバリデーションが効かない状態でした。
saveAll()の$fieldList設定で、DBの項目にはないからと、fileを指定していなかったのが原因でした。

$fieldListは、項目そのものがDBのテーブルになくても、validateの対象になる場合には必要です。


cake/libs/model/model.php

function invalidFields($options = array()) {
(中略)
	$whitelist = $this->whitelist;

	if (array_key_exists('fieldList', $options)) {
	$whitelist = $options['fieldList'];// ←$fieldListに設定済みの項目のみ$whilelistへ
	}

	if (!empty($whitelist)) {
		$validate = array();
		foreach ((array)$whitelist as $f) { // $whitelistの項目のみvalidate
			if (!empty($this->validate[$f])) {
				$validate[$f] = $this->validate[$f];
			}
		}
	}