/** * afterSave * * @param Model $model モデル * @param bool $created 新規作成 * @param array $options オプション * @throws Exception * @return void */ public function afterSave(Model $model, $created, $options = array()) { foreach ($this->_settings[$model->alias]['fileFields'] as $fieldName => $filedOptions) { if (isset($model->data[$model->alias][$fieldName])) { $fileData = $model->data[$model->alias][$fieldName]; if ($fileData['name']) { $uploadFile = $this->UploadFile->create(); $pathInfo = pathinfo($fileData['name']); $uploadFile['UploadFile']['plugin_key'] = Inflector::underscore($model->plugin); $keyField = Hash::get($filedOptions, 'contentKeyFieldName', 'key'); $uploadFile['UploadFile']['content_key'] = $model->data[$model->alias][$keyField]; $uploadFile['UploadFile']['field_name'] = $fieldName; $uploadFile['UploadFile']['original_name'] = $fileData['name']; $uploadFile['UploadFile']['extension'] = $pathInfo['extension']; $uploadFile['UploadFile']['real_file_name'] = $fileData; // フィールド毎にオプションを設定しなおしてsave実行 $this->UploadFile->setOptions($filedOptions); // ε( v ゚ω゚) < 例外処理 $this->_uploadedFiles[$fieldName] = $this->UploadFile->save($uploadFile); } } } // アップロードがなかったら以前のデータを挿入する // formからhiddenで UploadFile.field_name.id 形式でデータが渡ってくる // $data['UploadFile']にはモデルデータ編集時に添付されてるファイルについてのデータが入っている $uploadFiles = Hash::get($model->data, 'UploadFile', array()); foreach ($uploadFiles as $uploadFile) { // 同じfield_nameでアップロードされてるなら以前のファイルへの関連レコードを新規に追加する必要は無い(過去の関連レコードはそのまま) if (isset($this->_uploadedFiles[$uploadFile['field_name']])) { // 新たにアップロードされてる // 履歴のないモデル(is_latest, is_activeカラムがない)だったら、以前のファイルを削除する // 履歴のないモデルか? if (!$model->hasField('is_latest')) { // 履歴をもたないモデルなら以前のファイルを削除 $this->UploadFile->removeFile($model->id, $uploadFile['id']); } } else { // 同じfield_nameでアップロードされてなければ以前のファイルへの関連レコードを入れる $removePath = $model->alias . '.' . $uploadFile['field_name'] . '.remove'; if (Hash::get($model->data, $removePath, false)) { // ファイル削除にチェックが入ってるのでリンクしない // 今のコンテンツIDで関連テーブルのレコードがあったら、ユーザモデルのように履歴のないモデルなのでそのときは関連テーブルを消す必要があるのでremoveFileは呼んでおく。 $this->UploadFile->removeFile($model->id, $uploadFile['id']); } else { $uploadFileId = $uploadFile['id']; $this->_saveUploadFilesContent($model, $uploadFileId); } } } // 関連テーブルの挿入 foreach ($this->_uploadedFiles as $uploadedFile) { $uploadFileId = $uploadedFile['UploadFile']['id']; $this->_saveUploadFilesContent($model, $uploadFileId); } $this->_uploadedFiles = array(); }