/**
  * キャビネットファイルの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;
 }
Example #2
0
 /**
  * インポート処理
  *
  * @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;
 }
Example #3
0
 /**
  * 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;
 }
Example #4
0
 /**
  * ユーザの削除
  *
  * @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;
 }
Example #5
0
 /**
  * ユーザの登録処理
  *
  * @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;
 }