baserCMSをカスタマイズしてサブシステムを構築する際に、画像のアップロードが必要になる際の、Uploadプラグインの利用について解説します。
baserCMSをカスタマイズしたり、独自プラグインを追加するなどして、サブシステムを構築する際に画像ファイルを扱う機会があります。
そのような場合には、uploaderプラグインを利用すると簡単に画像をアップロードすることができますが、
アップロードされたファイルは、標準で /app/webroot/files/uploads にまとめて保管されます。
ここでは、サブシステム独自のテーブルへの紐付けや、独自のフォルダでファイルを管理したい場合のカスタマイズについて説明します。
Model
まず、モデルにBcUploadをBehavior指定します。
ファイル名をフィールドに自動的にセットするには、'fields'を指定します。また'saveDir'を指定するとアップロードされるファイルの保管先を変更できます。
var $actsAs = array(
'BcUpload'=> array(
'saveDir' => 'subsystem',
'fields'=> array(
'photo'=>array(
'type' => 'image',
'namefield' => 'id',
'nameformat' => 'photo_%d',
),
)
)
);
上記の例では、
'saveDir' => 'subsystem' の指定で、ファイルは /app/webroot/files/subsystem/ の下にアップロードされます。
'fields'=> array( 'photo'=>array( ... の指定で、ファイル名は 'photo' というフィールドにModel->save()の際に自動的にセットされます。
'type' => 'image' でアップロード対象は画像ファイルに限定されますが、他にも 'pdf' なども指定できます。
'nameformat' => 'photo_%d' という指定をすると、'namefield' のフィールド値を使ってファイル名を生成できます。(printf()のフォーマット指定と同じパラメータです。)
さらに、アップロードフォルダをレコードごとにサブフォルダに分割する場合などは、setupUpload()関数を追加します。
function setupUpload($id = null) {
if($id) {
$settings = $this->Behaviors->BcUpload->settings;
if(!empty($settings['saveDir'])) {
$settings['saveDir'] = $settings['saveDir'] . DS . $id;
}
$this->Behaviors->attach('BcUpload', $settings);
}
}
上記では、引数として渡された$id値を使ってサブフォルダを作成し、そのサブフォルダにファイルを保存します。
setupUpload() は、保存・呼び出しの前にControllerから明示的に呼び出す必要があります。
Controller
次にControllerでは、ViewでUpload機能を使うための準備を行います。
具体的には、$helpersに"BcUpload"を追加します。
public $helpers = array(''BcUpload');
また、Modelの項で触れたsetupUpload() は、次のように使います。
$this->{$this->ModelClass}->setupUpload($id);
※もちろんID値以外に任意の文字列などを指定しても構いません。
本体のBlogプラグインでは、呼び出したURLからIDが特定できるので、beforeFilter() から呼び出していますが、
個別のメソッドから呼び出しても構いません。
View
編集フォームからUpload機能を使う場合には、次のように指定します。
BcForm->create() の際に、'type' => 'file' の指定が必要になります。
<?php echo $this->BcForm->create('SubSysModel', array('type' => 'file', 'url' => $this->BcBaser->getHere())) ?>
ファイルを指定する項目では、BcUpload->file() を使います。
<td class="col-input">
<?php echo $this->BcUpload->file('SubSysModel.photo') ?>
<?php echo $this->BcForm->error('SubSysModel.photo') ?>
</td>
編集した結果を表示する場合には、bcUpload->uploadImage() を使います。
<?php echo $this->BcUpload->uploadImage('SubSysModel.photo', $data['SubSysModel']['photo'], array('class'=>"image-photo", 'rel'=>"colorbox", 'alt'=>$data['SubSysModel']['name'], 'link'=>false))?>
第一引数には、フィールド名
第二引数には、ファイル名(普通はフィールド値)
第三引数のオプションで、'alt'や'class'などタグに付与する属性を指定します。
'link' => true にすると、画像は<a>タグでクリックしたら画像を開く設定となり、'link' => false の時は<img>タグとなります。