/** * キャビネットファイルのUnzip * * @param Model $model CabinetFile * @param array $cabinetFile CabinetFileデータ * @return bool * @throws InternalErrorException */ public function unzip(Model $model, $cabinetFile) { $model->begin(); try { // テンポラリフォルダにunzip $zipPath = WWW_ROOT . $cabinetFile['UploadFile']['file']['path'] . $cabinetFile['UploadFile']['file']['id'] . DS . $cabinetFile['UploadFile']['file']['real_file_name']; //debug($zipPath); App::uses('UnZip', 'Files.Utility'); $unzip = new UnZip($zipPath); $tmpFolder = $unzip->extract(); if ($tmpFolder === false) { throw new InternalErrorException('UnZip Failed.'); } $parentCabinetFolder = $model->find('first', ['conditions' => ['CabinetFileTree.id' => $cabinetFile['CabinetFileTree']['parent_id']]]); // unzipされたファイル拡張子のバリデーション // unzipされたファイルのファイルサイズバリデーション $files = $tmpFolder->findRecursive(); $unzipTotalSize = 0; foreach ($files as $file) { // $unzipTotalSize += filesize($file); // ここでは拡張子だけチェックする $extension = pathinfo($file, PATHINFO_EXTENSION); if (!$model->isAllowUploadFileExtension($extension)) { // NG $model->validationErrors = [__d('cabinets', 'Unzip failed. Contains does not allow file format.')]; return false; } } // ルームファイルサイズ制限 $maxRoomDiskSize = Current::read('Space.room_disk_size'); if ($maxRoomDiskSize !== null) { // nullだったらディスクサイズ制限なし。null以外ならディスクサイズ制限あり // 解凍後の合計 // 現在のルームファイルサイズ $roomId = Current::read('Room.id'); $roomFileSize = $model->getTotalSizeByRoomId($roomId); if ($roomFileSize + $unzipTotalSize > $maxRoomDiskSize) { $model->validationErrors[] = __d('cabinets', 'Failed to expand. The total size exceeds the limit.<br />' . 'The total size limit is %s (%s left).', CakeNumber::toReadableSize($roomFileSize + $unzipTotalSize), CakeNumber::toReadableSize($maxRoomDiskSize)); return false; } } // 再帰ループで登録処理 list($folders, $files) = $tmpFolder->read(true, false, true); foreach ($files as $file) { $this->_addFileFromPath($model, $parentCabinetFolder, $file); } foreach ($folders as $folder) { $this->_addFolderFromPath($model, $parentCabinetFolder, $folder); } } catch (Exception $e) { return $model->rollback($e); } $model->commit(); return true; }
/** * インポート処理 * * @param Model $model Model using this behavior * @param string $filePath ファイルのパス * @param int $importType インポートタイプ * @return bool True on success, false on failure */ public function importUsers(Model $model, $filePath, $importType = self::IMPORT_TYPE_NEW) { App::uses('CsvFileReader', 'Files.Utility'); $model->begin(); $model->prepare(true); $reader = new CsvFileReader($filePath); $saveData = array(); $validationErrors = array(); //入力チェック foreach ($reader as $i => $row) { if ($i === 0) { $fileHeader = $this->_parseCsvHeader($model, $row); continue; } $data = $this->_getCsvData($model, $row, $fileHeader, $importType); if (!$data) { //falseの場合、スキップする continue; } $data = $this->_convSaveData($model, $data); $model->set($data); if (!$model->validates()) { //バリデーションエラーの場合 $validationErrors[$i] = $this->_getValidationErrors($model, $i); $model->validationErrors = array(); continue; } $saveData[$i] = $data; } //バリデーションエラー if ($validationErrors) { $model->validationErrors = $validationErrors; return false; } foreach ($saveData as $i => $data) { if (!$model->saveUser($data)) { //ここでバリデーションエラーになった場合、登録中に発生したエラー //可能性があるのは、ファイル内での問題か、処理実行中に他プロセスで登録されたかのどちらか $validationErrors[$i] = $this->_getValidationErrors($model, $i); $model->validationErrors = $validationErrors; $model->rollback(); return false; } } $model->commit(); return true; }
/** * setSettingToDatasource * * @param $key, $value = null */ public function setSettingToDatasource(Model $model, $key, $value = null) { $data = $key; if (is_string($key)) { $data = array($key => $value); } $settings = Configure::read('Setting.settings'); foreach ($data as $k => $v) { if (!in_array($k, array_keys($settings))) { return false; } $model->validate[$k] = $settings[$k]; } $model->set($data); if (!$model->validates()) { return false; } $model->begin(); foreach ($data as $k => $v) { if (is_array($v) || is_object($v)) { $model->rollback(); return false; } if (in_array($k, array_keys($settings))) { $d = $model->find('first', array('conditions' => array("{$model->alias}.key" => $k))); if (empty($d)) { $d = array($model->alias => array('key' => $k, 'value' => $v)); } else { $d[$model->alias]['value'] = $v; unset($d[$model->alias]['modified']); } $model->create(); $model->set($d); if (!$model->save($d, false)) { $model->rollback(); return false; } } } $model->commit(); return true; }
/** * ユーザの削除 * * @param Model $model ビヘイビア呼び出し元モデル * @param array $data data * @return mixed On success Model::$data, false on failure * @throws InternalErrorException */ public function deleteUser(Model $model, $data) { //トランザクションBegin $model->begin(); $model->prepare(); try { //Userデータの削除->論理削除 $user = $model->create(array('id' => $data['User']['id'], 'handlename' => $data['User']['handlename'], 'is_deleted' => true)); if (!$model->save($user, false)) { throw new InternalErrorException(__d('net_commons', 'Internal Server Error')); } //関連DBの削除 $model->deleteUserAssociations($user['User']['id']); //トランザクションCommit $model->commit(); } catch (Exception $ex) { //トランザクションRollback $model->rollback($ex); } return true; }
/** * ユーザの登録処理 * * @param Model $model ビヘイビア呼び出し元モデル * @param int $userId ユーザID * @return mixed On success Model::$data, false on failure * @throws InternalErrorException */ public function updateLoginTime(Model $model, $userId) { //トランザクションBegin $model->begin(); try { $update = array('User.previous_login' => 'User.last_login', 'User.last_login' => '\'' . date('Y-m-d H:i:s') . '\''); $conditions = array('User.id' => (int) $userId); if (!$model->updateAll($update, $conditions)) { throw new InternalErrorException(__d('net_commons', 'Internal Server Error')); } $model->commit(); } catch (Exception $ex) { $model->rollback($ex); } return true; }