diff --git a/Model/Behavior/Nc2ToNc3BbsBehavior.php b/Model/Behavior/Nc2ToNc3BbsBehavior.php index 5a30913..dfbb48b 100644 --- a/Model/Behavior/Nc2ToNc3BbsBehavior.php +++ b/Model/Behavior/Nc2ToNc3BbsBehavior.php @@ -89,7 +89,9 @@ public function generateNc3BbsData(Model $model, $nc2Bbs, $nc2BbsBlock, $nc3Room return []; } - //$Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); + $Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); + $nc3CreatedUser = $Nc2ToNc3User->getCreatedUser($nc2Bbs['Nc2Bb']); + $nc3Created = $this->_convertDate($nc2Bbs['Nc2Bb']['insert_time']); $data = [ //'Frame' => [ // 'id' => $frameMap['Frame']['id'] @@ -100,14 +102,16 @@ public function generateNc3BbsData(Model $model, $nc2Bbs, $nc2BbsBlock, $nc3Room 'room_id' => $nc3RoomId, 'plugin_key' => 'bbses', 'name' => $nc2Bbs['Nc2Bb']['bbs_name'], - 'public_type' => $nc2Bbs['Nc2Bb']['activity'] + 'public_type' => $nc2Bbs['Nc2Bb']['activity'], + 'created_user' => $nc3CreatedUser, + 'created' => $nc3Created, ], 'Bbs' => [ 'id' => '', 'key' => '', 'name' => $nc2Bbs['Nc2Bb']['bbs_name'], - //'created' => $this->_convertDate($nc2BbsBlock['Nc2BbsBlock']['insert_time']), - 'created' => $this->_convertDate($nc2Bbs['Nc2Bb']['insert_time']), + 'created_user' => $nc3CreatedUser, + 'created' => $nc3Created, ], //'BbsFrameSetting' => [ // 'id' => '', @@ -118,7 +122,9 @@ public function generateNc3BbsData(Model $model, $nc2Bbs, $nc2BbsBlock, $nc3Room //], 'BlocksLanguage' => [ 'language_id' => '', - 'name' => $nc2Bbs['Nc2Bb']['bbs_name'] + 'name' => $nc2Bbs['Nc2Bb']['bbs_name'], + 'created_user' => $nc3CreatedUser, + 'created' => $nc3Created, ], 'BbsSetting' => [ 'use_like' => $nc2Bbs['Nc2Bb']['vote_flag'], @@ -126,7 +132,24 @@ public function generateNc3BbsData(Model $model, $nc2Bbs, $nc2BbsBlock, $nc3Room 'use_comment' => $nc2Bbs['Nc2Bb']['child_flag'], // 'use_comment_approval' => $nc2Bbs['Nc2Bb']['sns_flag'], // 'use_workflow' => $nc2Bbs['Nc2Bb']['sns_flag'], - ] + 'created_user' => $nc3CreatedUser, + 'created' => $nc3Created, + ], + 'MailSetting' => [ + 'plugin_key' => 'bbses', + 'block_key' => null, + 'is_mail_send' => $nc2Bbs['Nc2Bb']['mail_send'], + ], + 'MailSettingFixedPhrase' => [ + [ + 'language_id' => $this->getLanguageIdFromNc2($model), + 'plugin_key' => 'bbses', + 'block_key' => null, + 'type_key' => 'contents', + 'mail_fixed_phrase_subject' => $nc2Bbs['Nc2Bb']['mail_subject'], + 'mail_fixed_phrase_body' =>$nc2Bbs['Nc2Bb']['mail_body'], + ], + ], ]; if ($frameMap) { $data['Frame'] = [ @@ -134,6 +157,10 @@ public function generateNc3BbsData(Model $model, $nc2Bbs, $nc2BbsBlock, $nc3Room ]; } + // 権限データ設定 + $data = Hash::merge($data, $model->makeContentPermissionData($nc2Bbs['Nc2Bb']['topic_authority'], $nc3RoomId)); + $data = Hash::merge($data, $model->makeMailPermissionData($nc2Bbs['Nc2Bb']['mail_authority'], $nc3RoomId)); + return $data; } diff --git a/Model/Behavior/Nc2ToNc3BlockRolePermissionBehavior.php b/Model/Behavior/Nc2ToNc3BlockRolePermissionBehavior.php new file mode 100644 index 0000000..5b0c002 --- /dev/null +++ b/Model/Behavior/Nc2ToNc3BlockRolePermissionBehavior.php @@ -0,0 +1,195 @@ + + * @package Researchmap\Nc2ToNc3 + */ +class Nc2ToNc3BlockRolePermissionBehavior extends Nc2ToNc3BaseBehavior { + +/** + * __getRolesRoomIdList + * + * @param string $nc3RoomId ルームID + * @return array + * @throws CakeException + */ + private function __getRolesRoomIdList($nc3RoomId) { + $RolesRoom = ClassRegistry::init('Rooms.RolesRoom'); + $rolesRooms = $RolesRoom->find('all', [ + 'conditions' => [ + 'RolesRoom.room_id' => $nc3RoomId + ], + 'fields' => ['RolesRoom.id', 'RolesRoom.role_key'], + 'recursive' => -1 + ]); + $rolesRoomIdByRoleKey = Hash::combine($rolesRooms, '{n}.RolesRoom.role_key', '{n}.RolesRoom.id'); + + return $rolesRoomIdByRoleKey; + } + +/** + * __getBorderRole + * + * @param int $nc2AuthorityCode NC2での権限 + * @return string + */ + private function __getBorderRole($nc2AuthorityCode) { + $borderLine = null; + switch ($nc2AuthorityCode) { + case 4: + // NC2主担以上→Nc3ルーム管理者以上 + $borderLine = 'room_administrator'; + break; + case 3: + //NC2モデレータ以上→NC3編集者以上 + $borderLine = 'editor'; + break; + case 2: + // NC2一般以上→NC3一般以上 + $borderLine = 'general_user'; + break; + case 1: + // NC2ゲスト→NC3ゲスト + $borderLine = 'visitor'; + break; + } + + return $borderLine; + } + +/** + * メール権限配列の作成 + * + * @param Model $model Model + * @param int $nc2AuthorityCode NC2でのメール権限 + * @param string $nc3RoomId ルームID + * @return array + * @throws CakeException + */ + public function makeMailPermissionData(Model $model, $nc2AuthorityCode, $nc3RoomId) { + $rolesRoomIdByRoleKey = $this->__getRolesRoomIdList($nc3RoomId); + $borderLine = $this->__getBorderRole($nc2AuthorityCode); + + // Roleをレベル低い順に取得 + $RoomRole = ClassRegistry::init('Rooms.RoomRole'); + $roomRoles = $RoomRole->find('all', ['order' => 'level ASC']); + $receivable = 0; + $data = []; + foreach ($roomRoles as $roomRole) { + $roleKey = $roomRole['RoomRole']['role_key']; + if ($roleKey == $borderLine) { + $receivable = 1; + } + + if (!in_array($roleKey, ['room_administrator', 'chief_editor'])) { + $data['BlockRolePermission']['mail_content_receivable'][$roleKey] = [ + 'id' => null, + 'block_key' => null, + 'roles_room_id' => $rolesRoomIdByRoleKey[$roleKey], + 'value' => $receivable, + 'permission' => 'mail_content_receivable' + ]; + } + + } + return $data; + } + +/** + * コンテンツ権限配列の作成 + * + * @param Model $model Model + * @param int $nc2AuthorityCode NC2での投稿権限 + * @param int $nc3RoomId ルームID + * @return mixed + * @throws CakeException + */ + public function makeContentPermissionData(Model $model, $nc2AuthorityCode, $nc3RoomId) { + $rolesRoomIdByRoleKey = $this->__getRolesRoomIdList($nc3RoomId); + $borderLine = $this->__getBorderRole($nc2AuthorityCode); + if ($borderLine === 'visitor') { + $borderLine = null; + } + + // Roleをレベル低い順に取得 + $RoomRole = ClassRegistry::init('Rooms.RoomRole'); + $roomRoles = $RoomRole->find('all', ['order' => 'level ASC']); + $creatable = 0; + $commentPublishable = 0; + $commentPublishableBorderLine = 'chief_editor'; // NC3のデフォルトにしとく + $data = []; + foreach ($roomRoles as $roomRole) { + $roleKey = $roomRole['RoomRole']['role_key']; + if ($roleKey == $borderLine) { + $creatable = 1; + } + if ($roleKey == $commentPublishableBorderLine) { + $commentPublishable = 1; + } + + // content_publishable はデータとして挿入しなくなったのでコメントアウト + //// content_publishableはルーム管理, visitor のレコードはつくらない + //if (!in_array($roleKey, ['room_administrator', 'visitor'])){ + // $data['BlockRolePermission']['content_publishable'][$roleKey] = [ + // 'id' => null, + // 'roles_room_id' => $rolesRoomIdByRoleKey[$roleKey], + // 'value' => 0, + // 'permission' => 'content_publishable' + // ]; + //} + + // content_creatableはgeneral_userだけ + if ($roleKey == 'general_user') { + $data['BlockRolePermission']['content_creatable'][$roleKey] = [ + 'id' => null, + 'roles_room_id' => $rolesRoomIdByRoleKey[$roleKey], + 'value' => $creatable, + 'permission' => 'content_creatable' + ]; + } + + // コメント投稿権限とコメント承認権限は + // room_administrator, chief_editor, visitor以外を設定する + if (!in_array($roleKey, ['room_administrator', 'chief_editor', 'visitor'])) { + $data['BlockRolePermission']['content_comment_publishable'][$roleKey] = [ + 'id' => null, + 'roles_room_id' => $rolesRoomIdByRoleKey[$roleKey], + 'value' => $commentPublishable, + 'permission' => 'content_comment_publishable' + ]; + + $data['BlockRolePermission']['content_comment_creatable'][$roleKey] = [ + 'id' => null, + 'roles_room_id' => $rolesRoomIdByRoleKey[$roleKey], + 'value' => 1, + 'permission' => 'content_comment_creatable' + ]; + } + + } + /* + * roles_room_id, block_key, permission + */ + //$data['BlockRolePermission']['content_comment_creatable']['visitor'] = [ + // 'roles_room_id' => $rolesRoomIdByRoleKey[$roleKey], + // 'value' => 0, + // 'permission' => 'content_comment_creatable' + //]; + return $data; + } + +} diff --git a/Model/Behavior/Nc2ToNc3BlogBehavior.php b/Model/Behavior/Nc2ToNc3BlogBehavior.php index a71f394..3e7e3ac 100644 --- a/Model/Behavior/Nc2ToNc3BlogBehavior.php +++ b/Model/Behavior/Nc2ToNc3BlogBehavior.php @@ -94,6 +94,20 @@ public function generateNc3BlogData(Model $model, $nc2Journal) { return []; } + // use_workflowはRoom.need_approval = 0のときに変更可能。need_approval=1なら1で固定 + $Room = ClassRegistry::init('Rooms.Room'); + $room = $Room->findById($roomMap['Room']['id'], 'need_approval', null, -1); + if ($room['Room']['need_approval']) { + $useWorkflow = 1; + $useCommentApproval = 1; + } else { + $useWorkflow = $nc2Journal['Nc2Journal']['agree_flag']; + $useCommentApproval = $nc2Journal['Nc2Journal']['comment_agree_flag']; + } + if ($useWorkflow === 1) { + $useCommentApproval = 1; + } + /* @var $Nc2ToNc3User Nc2ToNc3User */ $Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); $nc3CreatedUser = $Nc2ToNc3User->getCreatedUser($nc2Journal['Nc2Journal']); @@ -128,14 +142,28 @@ public function generateNc3BlogData(Model $model, $nc2Journal) { 'use_like' => $nc2Journal['Nc2Journal']['vote_flag'], 'use_unlike' => '0', 'use_comment' => $nc2Journal['Nc2Journal']['comment_flag'], - // NC3からルームに新しい設定「コンテンツの承認機能」=コンテンツに承認が必要が追加されたため、 - // 投稿承認=ON(use_workflow)、コメント承認=ON(use_comment_approval)で移行する。 - 'use_comment_approval' => '1', - 'use_workflow' => '1', + 'use_comment_approval' => $useCommentApproval, + 'use_workflow' => $useWorkflow, 'use_sns' => $nc2Journal['Nc2Journal']['sns_flag'], 'created_user' => $nc3CreatedUser, 'created' => $nc3Created, ], + 'MailSetting' => [ + 'plugin_key' => 'blogs', + 'block_key' => null, + 'is_mail_send' => $nc2Journal['Nc2Journal']['mail_flag'], + 'is_mail_send_approval' => $nc2Journal['Nc2Journal']['agree_mail_flag'], + ], + 'MailSettingFixedPhrase' => [ + [ + 'language_id' => $this->getLanguageIdFromNc2($model), + 'plugin_key' => 'blogs', + 'block_key' => null, + 'type_key' => 'contents', + 'mail_fixed_phrase_subject' => $nc2Journal['Nc2Journal']['mail_subject'], + 'mail_fixed_phrase_body' => $nc2Journal['Nc2Journal']['mail_body'], + ], + ], ]; if ($nc3Frame) { // フレームがあったらセット @@ -144,6 +172,10 @@ public function generateNc3BlogData(Model $model, $nc2Journal) { ]; } + // 権限データ設定 + $data = Hash::merge($data, $model->makeContentPermissionData($nc2Journal['Nc2Journal']['post_authority'], $nc3RoomId)); + $data = Hash::merge($data, $model->makeMailPermissionData($nc2Journal['Nc2Journal']['mail_authority'], $nc3RoomId)); + return $data; } diff --git a/Model/Behavior/Nc2ToNc3CabinetBehavior.php b/Model/Behavior/Nc2ToNc3CabinetBehavior.php index 1183731..8f0cdf2 100644 --- a/Model/Behavior/Nc2ToNc3CabinetBehavior.php +++ b/Model/Behavior/Nc2ToNc3CabinetBehavior.php @@ -44,19 +44,17 @@ public function getLogArgument(Model $model, $nc2Cabinet) { * @param Model $model Model using this behavior. * @param array $nc2CabinetManage Nc2CabinetBlock data. * @param array $nc2CabinetBlock Nc2CabinetBlock data. + * @param string $nc3RoomId nc3 room id. * @return array Nc3Cabinet data. */ - public function generateNc3CabinetData(Model $model, $nc2CabinetManage, $nc2CabinetBlock) { - /* @var $Nc2ToNc3Frame Nc2ToNc3Frame */ - $Nc2ToNc3Frame = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Frame'); - $nc2BlockId = $nc2CabinetBlock['Nc2CabinetBlock']['block_id']; - - $frameMap = $Nc2ToNc3Frame->getMap($nc2BlockId); - if (!$frameMap) { - $message = __d('nc2_to_nc3', '%s does not migration.', $this->__getLogArgument($nc2CabinetBlock)); - $this->_writeMigrationLog($message); - return []; + public function generateNc3CabinetData(Model $model, $nc2CabinetManage, $nc2CabinetBlock, $nc3RoomId) { + $frameMap = []; + if ($nc2CabinetBlock) { + /* @var $Nc2ToNc3Frame Nc2ToNc3Frame */ + $Nc2ToNc3Frame = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Frame'); + $nc2BlockId = $nc2CabinetBlock['Nc2CabinetBlock']['block_id']; + $frameMap = $Nc2ToNc3Frame->getMap($nc2BlockId); } $nc2CabinetId = $nc2CabinetManage['Nc2CabinetManage']['cabinet_id']; @@ -68,40 +66,63 @@ public function generateNc3CabinetData(Model $model, $nc2CabinetManage, $nc2Cabi // 移行済み return []; } - $data = []; + $Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); + $nc3CreatedUser = $Nc2ToNc3User->getCreatedUser($nc2CabinetManage['Nc2CabinetManage']); + $nc3Created = $this->_convertDate($nc2CabinetManage['Nc2CabinetManage']['insert_time']); $data = [ - 'Frame' => [ - 'id' => $frameMap['Frame']['id'] - ], 'Block' => [ 'id' => '', + 'room_id' => $nc3RoomId, 'plugin_key' => 'cabinets', 'name' => $nc2CabinetManage['Nc2CabinetManage']['cabinet_name'], 'public_type' => $nc2CabinetManage['Nc2CabinetManage']['active_flag'], 'publish_start' => '', - 'publish_end' => '' + 'publish_end' => '', + 'created_user' => $nc3CreatedUser, + 'created' => $nc3Created, ], 'Cabinet' => [ 'id' => '', 'key' => '', 'name' => $nc2CabinetManage['Nc2CabinetManage']['cabinet_name'], + 'created_user' => $nc3CreatedUser, + 'created' => $nc3Created, ], 'CabinetSetting' => [ - 'use_workflow' => '1', + 'id' => '', + 'created_user' => $nc3CreatedUser, + 'created' => $nc3Created, ], 'BlocksLanguage' => [ 'language_id' => '', - 'name' => $nc2CabinetManage['Nc2CabinetManage']['cabinet_name'] + 'name' => $nc2CabinetManage['Nc2CabinetManage']['cabinet_name'], + 'created_user' => $nc3CreatedUser, + 'created' => $nc3Created, ], 'CabinetFile' => [ - 'status' => '1' + 'status' => '1', + 'created_user' => $nc3CreatedUser, + 'created' => $nc3Created, ], '_NetCommonsTime' => [ 'user_timezone' => 'Asia/Tokyo', 'convert_fields' => 'Block.publish_start,Block.publish_end' ] ]; + if ($frameMap) { + $data['Frame'] = [ + 'id' => $frameMap['Frame']['id'] + ]; + } + + // 権限データ設定 + $data = Hash::merge($data, $model->makeContentPermissionData( + $nc2CabinetManage['Nc2CabinetManage']['add_authority_id'], + $nc3RoomId)); + unset($data['BlockRolePermission']['content_comment_publishable'], + $data['BlockRolePermission']['content_comment_creatable']); + return $data; } diff --git a/Model/Behavior/Nc2ToNc3CalendarBehavior.php b/Model/Behavior/Nc2ToNc3CalendarBehavior.php index 3e57410..a61ae07 100644 --- a/Model/Behavior/Nc2ToNc3CalendarBehavior.php +++ b/Model/Behavior/Nc2ToNc3CalendarBehavior.php @@ -21,6 +21,44 @@ class Nc2ToNc3CalendarBehavior extends Nc2ToNc3BaseBehavior { */ const NC2_ALL_MEMBERS_ROOM_ID = '0'; +/** + * Nc2ToNc3BaseBehaviour::_convertTimezoneのTimeZoneとCalendarsComponent::getTzTblのTimeZoneを対応づけ + * + * @var array + */ + const TIMEZONE_CONVERSION_MAP = [ + 'Pacific/Kwajalein' => 'Etc/GMT+12', + 'Pacific/Midway' => 'Pacific/Midway', + 'Pacific/Honolulu' => 'US/Hawaii', + 'America/Anchorage' => 'US/Alaska', + 'America/Los_Angeles' => 'US/Pacific', + 'America/Denver' => 'US/Mountain', + 'America/Chicago' => 'US/Central', + 'America/New_York' => 'US/Eastern', + 'America/Dominica' => 'Atlantic/Bermuda', + 'America/St_Johns' => 'Canada/Newfoundland', + 'America/Argentina/Buenos_Aires' => 'Brazil/East', + 'Atlantic/South_Georgia' => 'Atlantic/South_Georgia', + 'Atlantic/Azores' => 'Atlantic/Azores', + 'UTC' => 'Etc/Greenwich', + 'Europe/Brussels' => 'Europe/Amsterdam', + 'Europe/Athens' => 'Europe/Athens', + 'Asia/Baghdad' => 'Asia/Baghdad', + 'Asia/Tehran' => 'Asia/Tehran', + 'Asia/Muscat' => 'Asia/Muscat', + 'Asia/Kabul' => 'Asia/Kabul', + 'Asia/Karachi' => 'Asia/Karachi', + 'Asia/Kolkata' => 'Asia/Calcutta', + 'Asia/Dhaka' => 'Asia/Almaty', + 'Asia/Bangkok' => 'Asia/Bangkok', + 'Asia/Singapore' => 'Asia/Singapore', + 'Asia/Tokyo' => 'Asia/Tokyo', + 'Australia/Darwin' => 'Australia/Adelaide', + 'Asia/Vladivostok' => 'Australia/Brisbane', + 'Australia/Sydney' => 'Etc/GMT-11', + 'Asia/Kamchatka' => 'Pacific/Auckland', + ]; + /** * Get Log argument. * @@ -65,7 +103,8 @@ public function generateNc3CalendarPermissionData(Model $model, $nc2CalendarMana } if (!$roomMap) { - $message = __d('nc2_to_nc3', '%s does not migration.', $this->__getLogArgument($nc2CalendarManage)); + $message + = __d('nc2_to_nc3', '%s does not migration.', $this->__getLogArgument($nc2CalendarManage)); $this->_writeMigrationLog($message); return []; } @@ -73,7 +112,8 @@ public function generateNc3CalendarPermissionData(Model $model, $nc2CalendarMana // プライベートスペースのデータは移行できない $nc3SpaceId = $roomMap['Room']['space_id']; if ($nc3SpaceId == Space::PRIVATE_SPACE_ID) { - $message = __d('nc2_to_nc3', '%s does not migration.', $this->__getLogArgument($nc2CalendarManage)); + $message + = __d('nc2_to_nc3', '%s does not migration.', $this->__getLogArgument($nc2CalendarManage)); $this->_writeMigrationLog($message); return []; } @@ -89,7 +129,8 @@ public function generateNc3CalendarPermissionData(Model $model, $nc2CalendarMana /* @var $RolesRoom RolesRoom */ $RolesRoom = ClassRegistry::init('Rooms.RolesRoom'); $nc3RoomId = $roomMap['Room']['id']; - $nc3RolesRoom = $RolesRoom->findByRoomIdAndRoleKey($nc3RoomId, 'general_user', 'RolesRoom.id', null, -1); + $nc3RolesRoom + = $RolesRoom->findByRoomIdAndRoleKey($nc3RoomId, 'general_user', 'RolesRoom.id', null, -1); /* @var $Block Block */ $Block = ClassRegistry::init('Blocks.Block'); @@ -169,7 +210,8 @@ public function generateNc3CalendarFrameSettingData(Model $model, $nc2CalendarBl $nc2BlockId = $nc2CalendarBlock['Nc2CalendarBlock']['block_id']; $frameMap = $Nc2ToNc3Frame->getMap($nc2BlockId); if (!$frameMap) { - $message = __d('nc2_to_nc3', '%s does not migration.', $this->__getLogArgument($nc2CalendarBlock)); + $message + = __d('nc2_to_nc3', '%s does not migration.', $this->__getLogArgument($nc2CalendarBlock)); $this->_writeMigrationLog($message); return []; } @@ -185,7 +227,7 @@ public function generateNc3CalendarFrameSettingData(Model $model, $nc2CalendarBl // rm2.calendar_frame_settings.display_typeは、rm1.calendar_block.display_type -1で登録 // rm1.calendar_block.display_type=1の場合、rm2.calendar_frame_settings.display_type=2(月表示(拡大))で登録 $nc3DisplayType = (string)((int)$nc2CalendarBlock['Nc2CalendarBlock']['display_type'] - 1); - if ($nc3DisplayType==='0') { + if ($nc3DisplayType === '0') { $nc3DisplayType = (string)CalendarsComponent::CALENDAR_DISP_TYPE_LARGE_MONTHLY; } /* @var $Nc2ToNc3User Nc2ToNc3User */ @@ -195,8 +237,8 @@ public function generateNc3CalendarFrameSettingData(Model $model, $nc2CalendarBl } // NC3で無効なstart_pos値(2:1月表示、3:4月表示)は0で登録 $nc3StartPos = $nc2CalendarBlock['Nc2CalendarBlock']['start_pos']; - if ($nc3StartPos==2 || $nc3StartPos==3) { - $nc3StartPos=0; + if ($nc3StartPos == 2 || $nc3StartPos == 3) { + $nc3StartPos = 0; } $data = [ @@ -211,10 +253,12 @@ public function generateNc3CalendarFrameSettingData(Model $model, $nc2CalendarBl /* @var $CalendarFrameSetting CalendarFrameSetting */ $CalendarFrameSetting = ClassRegistry::init('Calendars.CalendarFrameSetting'); - $nc3CalendarSetting = $CalendarFrameSetting->findByFrameKey($frameMap['Frame']['key'], null, null, -1); + $nc3CalendarSetting + = $CalendarFrameSetting->findByFrameKey($frameMap['Frame']['key'], null, null, -1); $data['CalendarFrameSetting'] = $data + $nc3CalendarSetting['CalendarFrameSetting']; - $nc3CalendarRooms = $this->__generateNc3CalendarSelectRoomData($nc2CalendarBlock, $nc3CalendarSetting); + $nc3CalendarRooms + = $this->__generateNc3CalendarSelectRoomData($nc2CalendarBlock, $nc3CalendarSetting); $data['CalendarFrameSettingSelectRoom'] = $nc3CalendarRooms; return $data; @@ -288,7 +332,8 @@ public function generateNc3CalendarActionPlanData(Model $model, $nc2CalendarPlan } if (!$roomMap) { - $message = __d('nc2_to_nc3', '%s does not migration.', $this->__getLogArgument($nc2CalendarPlan)); + $message + = __d('nc2_to_nc3', '%s does not migration.', $this->__getLogArgument($nc2CalendarPlan)); $this->_writeMigrationLog($message); return []; } @@ -332,25 +377,15 @@ public function generateNc3CalendarActionPlanData(Model $model, $nc2CalendarPlan $dateFormat = 'Y-m-d'; } + // 時差からタイムゾーンを取得 $nc3TimezoneOffset = $this->_convertTimezone($nc2TimezoneOffset); - if ($nc3TimezoneOffset === 'UTC') { - $nc3TimezoneOffset = 'Etc/Greenwich'; - } - if ($nc3TimezoneOffset === 'Europe/Brussels') { - $nc3TimezoneOffset = 'Europe/Amsterdam'; - } - if ($nc3TimezoneOffset === 'Pacific/Honolulu') { - $nc3TimezoneOffset = 'US/Hawaii'; - } - if ($nc3TimezoneOffset === 'America/Chicago') { - $nc3TimezoneOffset = 'US/Central'; - } - if ($nc3TimezoneOffset === 'Asia/Vladivostok') { - $nc3TimezoneOffset = 'Australia/Brisbane'; - } - if ($nc3TimezoneOffset === 'America/New_York') { - $nc3TimezoneOffset = 'US/Eastern'; - } + // CalendarsComponent::getTzTblで使われているタイムゾーンに変換 + $nc3TimezoneOffset = self::TIMEZONE_CONVERSION_MAP[$nc3TimezoneOffset]; + + // サマータイムが適用されている場合に予定の開始、終了時刻がずれないために、$nc2TimezoneOffsetを調整 + $dateTimeZone = new DateTimeZone($nc3TimezoneOffset); + $timeZoneOffset = $dateTimeZone->getOffset(new DateTime("now", $dateTimeZone)); + $nc2TimezoneOffset = $timeZoneOffset / 3600; /* @var $Nc2ToNc3User Nc2ToNc3User */ $Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); @@ -363,13 +398,21 @@ public function generateNc3CalendarActionPlanData(Model $model, $nc2CalendarPlan 'title_icon' => $this->_convertTitleIcon($nc2CalendarPlan['Nc2CalendarPlan']['title_icon']), 'title' => $nc2CalendarPlan['Nc2CalendarPlan']['title'], 'enable_time' => !$nc2AllDayFlag, - 'detail_start_datetime' => date($dateFormat, strtotime($nc2StartTimeFull) + ($nc2TimezoneOffset * 3600)), - 'detail_end_datetime' => date($dateFormat, strtotime($nc2EndTimeFull) + ($nc2TimezoneOffset * 3600)), + 'detail_start_datetime' => date( + $dateFormat, + strtotime($nc2StartTimeFull) + ($nc2TimezoneOffset * 3600) + ), + 'detail_end_datetime' => date( + $dateFormat, + strtotime($nc2EndTimeFull) + ($nc2TimezoneOffset * 3600) + ), 'timezone_offset' => $nc3TimezoneOffset, 'plan_room_id' => $roomMap['Room']['id'], 'location' => $nc2CalendarPDetail['Nc2CalendarPlanDetail']['location'], 'contact' => $nc2CalendarPDetail['Nc2CalendarPlanDetail']['contact'], - 'description' => $model->convertWYSIWYG($nc2CalendarPDetail['Nc2CalendarPlanDetail']['description']), + 'description' => $model->convertWYSIWYG( + $nc2CalendarPDetail['Nc2CalendarPlanDetail']['description'] + ), 'created_user' => $Nc2ToNc3User->getCreatedUser($nc2CalendarPlan['Nc2CalendarPlan']), 'created' => $this->_convertDate($nc2CalendarPlan['Nc2CalendarPlan']['insert_time']), // @see https://github.com/NetCommons3/Calendars/blob/3.1.0/View/Elements/CalendarPlans/detail_edit_mail.ctp#L20-L21 @@ -380,7 +423,8 @@ public function generateNc3CalendarActionPlanData(Model $model, $nc2CalendarPlan 'is_repeat' => false, ]; - $data['CalendarActionPlan'] = $this->__generateNc3RRuleData($nc2CalendarPlan, $nc2CalendarPDetail, $data); + $data['CalendarActionPlan'] + = $this->__generateNc3RRuleData($nc2CalendarPlan, $nc2CalendarPDetail, $data); // @see https://github.com/NetCommons3/Calendars/blob/3.1.0/Model/CalendarActionPlan.php#L549 $data['WorkflowComment'] = null; @@ -399,7 +443,6 @@ private function __generateNc3RRuleData($nc2CalendarPlan, $nc2CalendarPDetail, $ // 繰り返しデータとして移行すると、繰り返し予定のなかで、削除された予定も改めて登録されてしまうため、 // 繰り返しでの登録はしない方が良い。 // 改めて登録されても良いのであればっ場合でも、登録処理後に、繰り返し予定分のmapデータを作成しないと繰り返し数×繰り返し数分の予定を作成してしまう。 - /* $nc2RRule = $nc2CalendarPDetail['Nc2CalendarPlanDetail']['rrule']; if ($nc2RRule) { $nc3ActionPlan['is_repeat'] = true; @@ -456,7 +499,6 @@ private function __generateNc3RRuleData($nc2CalendarPlan, $nc2CalendarPDetail, $ ]; } } - */ return $nc3ActionPlan; } diff --git a/Model/Behavior/Nc2ToNc3FaqBehavior.php b/Model/Behavior/Nc2ToNc3FaqBehavior.php index 396736a..b6971b7 100644 --- a/Model/Behavior/Nc2ToNc3FaqBehavior.php +++ b/Model/Behavior/Nc2ToNc3FaqBehavior.php @@ -49,9 +49,10 @@ public function getLogArgument(Model $model, $nc2Faq) { * @param Model $model Model using this behavior. * @param array $frameMap Frame mapping data. * @param array $nc2Faq Nc2Faq data. + * @param string $nc3RoomId nc3 room id. * @return array Nc3Faq data. */ - public function generateNc3FaqData(Model $model, $frameMap, $nc2Faq) { + public function generateNc3FaqData(Model $model, $frameMap, $nc2Faq, $nc3RoomId) { $nc2FaqId = $nc2Faq['Nc2Faq']['faq_id']; $faqMap = $this->_getMap($nc2FaqId); if ($faqMap) { @@ -61,13 +62,15 @@ public function generateNc3FaqData(Model $model, $frameMap, $nc2Faq) { /* @var $Nc2ToNc3User Nc2ToNc3User */ $Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); - $data['Frame'] = [ - 'id' => $frameMap['Frame']['id'], - ]; + if ($frameMap) { + $data['Frame'] = [ + 'id' => $frameMap['Frame']['id'], + ]; + } $data['Block'] = [ 'id' => '', 'key' => '', - 'room_id' => $frameMap['Frame']['room_id'], + 'room_id' => $nc3RoomId, 'plugin_key' => 'faqs', 'name' => $nc2Faq['Nc2Faq']['faq_name'], 'public_type' => 1, @@ -85,6 +88,14 @@ public function generateNc3FaqData(Model $model, $frameMap, $nc2Faq) { 'plugin_key' => 'faqs', ]; + // 権限データ設定 + $data['FaqSetting'] = ['id' => '']; + $data = Hash::merge($data, $model->makeContentPermissionData( + $nc2Faq['Nc2Faq']['faq_authority'], + $nc3RoomId)); + unset($data['BlockRolePermission']['content_comment_publishable'], + $data['BlockRolePermission']['content_comment_creatable']); + return $data; } diff --git a/Model/Behavior/Nc2ToNc3LinkBehavior.php b/Model/Behavior/Nc2ToNc3LinkBehavior.php index 5fafd02..f94440f 100644 --- a/Model/Behavior/Nc2ToNc3LinkBehavior.php +++ b/Model/Behavior/Nc2ToNc3LinkBehavior.php @@ -84,6 +84,14 @@ public function generateNc3LinkBlockData(Model $model, $frameMap, $nc2Linklist, 'use_workflow' => '0', ]; + // 権限データ設定 + $data['LinkSetting'] = ['id' => '']; + $data = Hash::merge($data, $model->makeContentPermissionData( + $nc2Linklist['Nc2Linklist']['link_authority'], + $nc3RoomId)); + unset($data['BlockRolePermission']['content_comment_publishable'], + $data['BlockRolePermission']['content_comment_creatable']); + return $data; } diff --git a/Model/Behavior/Nc2ToNc3MultidatabaseBehavior.php b/Model/Behavior/Nc2ToNc3MultidatabaseBehavior.php index 7f6beba..79cc8c3 100644 --- a/Model/Behavior/Nc2ToNc3MultidatabaseBehavior.php +++ b/Model/Behavior/Nc2ToNc3MultidatabaseBehavior.php @@ -163,51 +163,12 @@ public function generateNc3MultidatabaseData(Model $model, $nc2Multidatabase) { 1 => [], 2 => [], 3 => [], - ] - ]; - if ($nc3Frame) { - // フレームがあったらセット - $data['Frame'] = [ - 'id' => $nc3Frame['Frame']['id'] - ]; - } - - // 権限データ - $data = Hash::merge($data, $this->_makePermissiondata($nc2Multidatabase['Nc2Multidatabase']['contents_authority'], $nc3RoomId)); - - // Mail設定 - $data = Hash::merge($data, $this->_makeMailSetting($model, $nc2Multidatabase['Nc2Multidatabase'], $nc3RoomId)); - - return $data; - } - -/** - * メールの置き換え変数のコンバート。必要であればここで置換する - * - * @param string $text メール定型文 - * @return string - */ - protected function _convertMailValiable($text) { - // X-DATA, X-MDB使えるようになったし、ここでやることは特になさそう - return $text; - } - -/** - * メール設定配列データ作成 - * - * @param Model $model Nc2ToNc3Multidatabase - * @param array $nc2Multidb NC2汎用DB配列 - * @param array $nc3RoomId ルームID - * @return array - */ - protected function _makeMailSetting($model, $nc2Multidb, $nc3RoomId) { - // Mail - $data = [ + ], 'MailSetting' => [ 'plugin_key' => 'multidatabases', 'block_key' => null, - 'is_mail_send' => $nc2Multidb['mail_flag'], - 'is_mail_send_approval' => $nc2Multidb['agree_flag'], // ワークフローを使うなら承認メール有効にする + 'is_mail_send' => $nc2Multidatabase['Nc2Multidatabase']['mail_flag'], + 'is_mail_send_approval' => $nc2Multidatabase['Nc2Multidatabase']['agree_flag'], // ワークフローを使うなら承認メール有効にする ], 'MailSettingFixedPhrase' => [ @@ -216,160 +177,36 @@ protected function _makeMailSetting($model, $nc2Multidb, $nc3RoomId) { 'plugin_key' => 'multidatabases', 'block_key' => null, 'type_key' => 'contents', - 'mail_fixed_phrase_subject' => $this->_convertMailValiable($nc2Multidb['mail_subject']), - 'mail_fixed_phrase_body' => $this->_convertMailValiable($nc2Multidb['mail_body']), + 'mail_fixed_phrase_subject' => $this->_convertMailValiable($nc2Multidatabase['Nc2Multidatabase']['mail_subject']), + 'mail_fixed_phrase_body' => $this->_convertMailValiable($nc2Multidatabase['Nc2Multidatabase']['mail_body']), ], ], ]; - - $RoomRole = ClassRegistry::init('Rooms.RoomRole'); - $RolesRoom = ClassRegistry::init('Rooms.RolesRoom'); - $rolesRooms = $RolesRoom->find('all', [ - 'conditions' => [ - 'RolesRoom.room_id' => $nc3RoomId - ], - 'fields' => ['RolesRoom.id', 'RolesRoom.role_key'], - 'recursive' => -1 - ]); - $rolesRoomIdByRoleKey = Hash::combine($rolesRooms, '{n}.RolesRoom.role_key', '{n}.RolesRoom.id'); - - switch ($nc2Multidb['mail_authority']) { - case 4: - // NC2主担以上→Nc3ルーム管理者以上 - $borderLine = 'room_administrator'; - break; - case 3: - //NC2モデレータ以上→NC3編集者以上 - $borderLine = 'editor'; - break; - case 2: - // NC2一般以上→NC3一般以上 - $borderLine = 'general_user'; - break; - case 1: - // NC2ゲスト→NC3ゲスト - $borderLine = 'visitor'; - break; + if ($nc3Frame) { + // フレームがあったらセット + $data['Frame'] = [ + 'id' => $nc3Frame['Frame']['id'] + ]; } - // Roleをレベル低い順に取得 - $roomRoles = $RoomRole->find('all', ['order' => 'level ASC']); - $receivable = 0; - foreach ($roomRoles as $roomRole) { - $roleKey = $roomRole['RoomRole']['role_key']; - if ($roleKey == $borderLine) { - $receivable = 1; - } - if (!in_array($roleKey, ['room_administrator', 'chief_editor'])) { - $data['BlockRolePermission']['mail_content_receivable'][$roleKey] = [ - 'id' => null, - 'block_key' => null, - 'roles_room_id' => $rolesRoomIdByRoleKey[$roleKey], - 'value' => $receivable, - 'permission' => 'mail_content_receivable' - ]; - } + // 権限データ設定 + $data = Hash::merge($data, $model->makeContentPermissionData( + $nc2Multidatabase['Nc2Multidatabase']['contents_authority'], $nc3RoomId)); + $data = Hash::merge($data, $model->makeMailPermissionData( + $nc2Multidatabase['Nc2Multidatabase']['mail_authority'], $nc3RoomId)); - } return $data; } /** - * 権限配列の作成 + * メールの置き換え変数のコンバート。必要であればここで置換する * - * @param int $nc2AuthorityCode NC2での投稿権限 - * @param int $nc3RoomId ルームID - * @return mixed + * @param string $text メール定型文 + * @return string */ - protected function _makePermissiondata($nc2AuthorityCode, $nc3RoomId) { - $RoomRole = ClassRegistry::init('Rooms.RoomRole'); - $RolesRoom = ClassRegistry::init('Rooms.RolesRoom'); - $rolesRooms = $RolesRoom->find('all', [ - 'conditions' => [ - 'RolesRoom.room_id' => $nc3RoomId - ], - 'fields' => ['RolesRoom.id', 'RolesRoom.role_key'], - 'recursive' => -1 - ]); - $rolesRoomIdByRoleKey = Hash::combine($rolesRooms, '{n}.RolesRoom.role_key', '{n}.RolesRoom.id'); - - switch ($nc2AuthorityCode) { - case 4: - // NC2主担以上→Nc3ルーム管理者以上 - $borderLine = 'room_administrator'; - break; - case 3: - //NC2モデレータ以上→NC3編集者以上 - $borderLine = 'editor'; - break; - case 2: - // NC2一般以上→NC3一般以上 - $borderLine = 'general_user'; - break; - } - - // Roleをレベル低い順に取得 - $roomRoles = $RoomRole->find('all', ['order' => 'level ASC']); - $creatable = 0; - $commentPublishable = 0; - $commentPublishableBorderLine = 'chief_editor'; // NC3のデフォルトにしとく - foreach ($roomRoles as $roomRole) { - $roleKey = $roomRole['RoomRole']['role_key']; - if ($roleKey == $borderLine) { - $creatable = 1; - } - if ($roleKey == $commentPublishableBorderLine) { - $commentPublishable = 1; - } - - // content_publishable はデータとして挿入しなくなったのでコメントアウト - //// content_publishableはルーム管理, visitor のレコードはつくらない - //if (!in_array($roleKey, ['room_administrator', 'visitor'])){ - // $data['BlockRolePermission']['content_publishable'][$roleKey] = [ - // 'id' => null, - // 'roles_room_id' => $rolesRoomIdByRoleKey[$roleKey], - // 'value' => 0, - // 'permission' => 'content_publishable' - // ]; - //} - - // content_creatableはgeneral_userだけ - if ($roleKey == 'general_user') { - $data['BlockRolePermission']['content_creatable'][$roleKey] = [ - 'id' => null, - 'roles_room_id' => $rolesRoomIdByRoleKey[$roleKey], - 'value' => $creatable, - 'permission' => 'content_creatable' - ]; - } - - // コメント投稿権限とコメント承認権限はroom_administrator, chief_editor以外を設定する - if (!in_array($roleKey, ['room_administrator', 'chief_editor'])) { - $data['BlockRolePermission']['content_comment_publishable'][$roleKey] = [ - 'id' => null, - 'roles_room_id' => $rolesRoomIdByRoleKey[$roleKey], - 'value' => $commentPublishable, - 'permission' => 'content_comment_publishable' - ]; - - $data['BlockRolePermission']['content_comment_creatable'][$roleKey] = [ - 'id' => null, - 'roles_room_id' => $rolesRoomIdByRoleKey[$roleKey], - 'value' => 1, - 'permission' => 'content_comment_creatable' - ]; - } - - } - /* - * roles_room_id, block_key, permission - */ - //$data['BlockRolePermission']['content_comment_creatable']['visitor'] = [ - // 'roles_room_id' => $rolesRoomIdByRoleKey[$roleKey], - // 'value' => 0, - // 'permission' => 'content_comment_creatable' - //]; - return $data; + protected function _convertMailValiable($text) { + // X-DATA, X-MDB使えるようになったし、ここでやることは特になさそう + return $text; } /** diff --git a/Model/Behavior/Nc2ToNc3QuestionnaireBehavior.php b/Model/Behavior/Nc2ToNc3QuestionnaireBehavior.php index a5350f0..47fe005 100644 --- a/Model/Behavior/Nc2ToNc3QuestionnaireBehavior.php +++ b/Model/Behavior/Nc2ToNc3QuestionnaireBehavior.php @@ -109,11 +109,15 @@ public function generateNc3QuestionnaireData(Model $model, $nc2Questionnaire) { $data['Questionnaire']['is_active'] = '1'; $data['Questionnaire']['status'] = '1'; } - if ($nc2Questionnaire['Nc2Questionnaire']['status'] != '2') { - $data['Questionnaire'] += [ - 'answer_timing' => '1', - 'answer_end_period' => $this->_convertDate($nc2Questionnaire['Nc2Questionnaire']['insert_time']), - ]; + if ($nc2Questionnaire['Nc2Questionnaire']['status'] == '2') { + $data['Questionnaire']['answer_timing'] = '1'; + $data['Questionnaire']['answer_end_period'] = + $this->_convertDate($nc2Questionnaire['Nc2Questionnaire']['insert_time']); + } + if ($nc2Questionnaire['Nc2Questionnaire']['period']) { + $data['Questionnaire']['answer_timing'] = '1'; + $data['Questionnaire']['answer_end_period'] = + $this->_convertDate($nc2Questionnaire['Nc2Questionnaire']['period']); } if ($nc2Questionnaire['Nc2Questionnaire']['keypass_use_flag'] == '1' && $nc2Questionnaire['Nc2Questionnaire']['image_authentication'] == '1' @@ -384,9 +388,9 @@ private function __generateNc3QuestionnairePageData(Model $model, $nc2Questionna $data[$nc3PageSequence]['QuestionnaireQuestion'][$nc3QuestionSequence] = $nc3Question; if ($nc2Questionnaire['Nc2Questionnaire']['questionnaire_type'] == '1') { - $nc3PageSequence++; - } else { $nc3QuestionSequence++; + } else { + $nc3PageSequence++; } } diff --git a/Model/Behavior/Nc2ToNc3RegistrationBehavior.php b/Model/Behavior/Nc2ToNc3RegistrationBehavior.php index 46fc487..3478430 100644 --- a/Model/Behavior/Nc2ToNc3RegistrationBehavior.php +++ b/Model/Behavior/Nc2ToNc3RegistrationBehavior.php @@ -643,17 +643,17 @@ private function __getLogArgument($nc2Registration) { } if (isset($nc2Registration['Nc2RegistrationData'])) { - return 'Nc2RegistrationData' . + return 'Nc2RegistrationData ' . 'data_id:' . $nc2Registration['Nc2RegistrationData']['data_id']; } if (isset($nc2Registration['Nc2RegistrationItem'])) { - return 'Nc2RegistrationItem' . + return 'Nc2RegistrationItem ' . 'item_id:' . $nc2Registration['Nc2RegistrationItem']['item_id']; } - return 'Nc2RegistrationItemData' . - 'item_data_id:' . $nc2Registration['Nc2RegistrationItemData']['item_data_id']; + return 'Nc2RegistrationData ' . + 'data_id:' . $nc2Registration['Nc2RegistrationItemData']['data_id']; } } diff --git a/Model/Behavior/Nc2ToNc3TaskBehavior.php b/Model/Behavior/Nc2ToNc3TaskBehavior.php index c98cb8d..fb056f7 100644 --- a/Model/Behavior/Nc2ToNc3TaskBehavior.php +++ b/Model/Behavior/Nc2ToNc3TaskBehavior.php @@ -50,9 +50,10 @@ public function getLogArgument(Model $model, $nc2Task) { * @param Model $model Model using this behavior. * @param array $frameMap FrameMap data. * @param array $nc2TodoData Nc2TodoData data. + * @param string $nc3RoomId nc3 room id. * @return array Nc3Task data. */ - public function generateNc3TaskData(Model $model, $frameMap, $nc2TodoData) { + public function generateNc3TaskData(Model $model, $frameMap, $nc2TodoData, $nc3RoomId) { /* @var $Nc2ToNc3Map Nc2ToNc3Map */ $Nc2ToNc3Map = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Map'); $mapIdList = $Nc2ToNc3Map->getMapIdList('Task', $nc2TodoData['Nc2Todo']['todo_id']); @@ -61,19 +62,17 @@ public function generateNc3TaskData(Model $model, $frameMap, $nc2TodoData) { return []; } - if (!$frameMap) { - return []; - } - /* @var $Nc2ToNc3User Nc2ToNc3User */ $Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); - $data['Frame'] = [ - 'id' => $frameMap['Frame']['id'], - ]; + if ($frameMap) { + $data['Frame'] = [ + 'id' => $frameMap['Frame']['id'], + ]; + } $data['Block'] = [ 'id' => '', 'key' => '', - 'room_id' => $frameMap['Frame']['room_id'], + 'room_id' => $nc3RoomId, 'plugin_key' => 'tasks', 'public_type' => 1, ]; @@ -94,6 +93,13 @@ public function generateNc3TaskData(Model $model, $frameMap, $nc2TodoData) { 'plugin_key' => 'tasks', ]; + // 権限データ設定 + $data = Hash::merge($data, $model->makeContentPermissionData( + $nc2TodoData['Nc2Todo']['task_authority'], + $nc3RoomId)); + unset($data['BlockRolePermission']['content_comment_publishable'], + $data['BlockRolePermission']['content_comment_creatable']); + return $data; } diff --git a/Model/Nc2ToNc3Bbs.php b/Model/Nc2ToNc3Bbs.php index 18de65e..f9a24fa 100644 --- a/Model/Nc2ToNc3Bbs.php +++ b/Model/Nc2ToNc3Bbs.php @@ -46,6 +46,7 @@ class Nc2ToNc3Bbs extends Nc2ToNc3AppModel { public $actsAs = [ 'Nc2ToNc3.Nc2ToNc3Bbs', 'Nc2ToNc3.Nc2ToNc3Wysiwyg', + 'Nc2ToNc3.Nc2ToNc3BlockRolePermission', ]; /** @@ -118,6 +119,8 @@ private function __saveNc3BbsFromNc2($nc2Bbses) { $BlocksLanguage = ClassRegistry::init('Blocks.BlocksLanguage'); $Block = ClassRegistry::init('Blocks.Block'); $Topic = ClassRegistry::init('Topics.Topic'); + $BbsSetting = ClassRegistry::init('Bbses.BbsSetting'); + $MailSetting = ClassRegistry::init('Mails.MailSetting'); /* @see Nc2ToNc3Map::getMapIdList() */ $Nc2ToNc3Map = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Map'); @@ -164,6 +167,8 @@ private function __saveNc3BbsFromNc2($nc2Bbses) { $Bbs->create(); $Block->create(); $Topic->create(); + $BbsSetting->create(); + $MailSetting->create(); if (!$Bbs->saveBbs($data)) { // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、 @@ -181,6 +186,45 @@ private function __saveNc3BbsFromNc2($nc2Bbses) { continue; } + $bbs = $Bbs->findById($Bbs->id, 'block_id', null, -1); + $block = $Block->findById($bbs['Bbs']['block_id'], null, null, -1); + Current::write('Block', $block['Block']); + foreach ($data['BlockRolePermission'] as &$permission) { + foreach ($permission as &$role) { + $role['block_key'] = $block['Block']['key']; + } + } + + if (!$BbsSetting->saveBbsSetting($data)) { + // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、 + // ここでrollback + $BbsSetting->rollback(); + + $message = $this->getLogArgument($data) . "\n" . + var_export($BbsSetting->validationErrors, true); + $this->writeMigrationLog($message); + $Bbs->rollback(); + + continue; + } + + // MailSetting + $data['MailSetting']['block_key'] = $block['Block']['key']; + $data['MailSettingFixedPhrase'][0]['block_key'] = $block['Block']['key']; + + // メールの権限については先に権限設定保存じに保存できちゃってるので、ここでは保存させない + unset($data['BlockRolePermission']); + if (!$MailSetting->saveMailSettingAndFixedPhrase($data)) { + // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、ここでrollback + $MailSetting->rollback(); + + $message = $this->getLogArgument($data) . "\n" . + var_export($MailSetting->validationErrors, true); + $this->writeMigrationLog($message); + $Bbs->rollback(); + continue; + } + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2BbsId = $nc2Bbs['Nc2Bb']['bbs_id']; @@ -196,8 +240,9 @@ private function __saveNc3BbsFromNc2($nc2Bbses) { $Bbs->rollback($ex); throw $ex; } + + Current::remove('Block'); } - Current::remove('Block.id'); Current::remove('Room.id'); Current::remove('Plugin.key'); diff --git a/Model/Nc2ToNc3Blog.php b/Model/Nc2ToNc3Blog.php index e27969f..374cc9f 100644 --- a/Model/Nc2ToNc3Blog.php +++ b/Model/Nc2ToNc3Blog.php @@ -48,6 +48,7 @@ class Nc2ToNc3Blog extends Nc2ToNc3AppModel { public $actsAs = [ 'Nc2ToNc3.Nc2ToNc3Blog', 'Nc2ToNc3.Nc2ToNc3Wysiwyg', + 'Nc2ToNc3.Nc2ToNc3BlockRolePermission', ]; /** @@ -123,6 +124,8 @@ private function __saveNc3BlogFromNc2($nc2Journals) { $BlocksLanguage = ClassRegistry::init('Blocks.BlocksLanguage'); $Block = ClassRegistry::init('Blocks.Block'); $Topic = ClassRegistry::init('Topics.Topic'); + $BlogSetting = ClassRegistry::init('Blogs.BlogSetting'); + $MailSetting = ClassRegistry::init('Mails.MailSetting'); foreach ($nc2Journals as $nc2Journal) { $Blog->begin(); @@ -147,6 +150,8 @@ private function __saveNc3BlogFromNc2($nc2Journals) { $Blog->create(); $Block->create(); $Topic->create(); + $BlogSetting->create(); + $MailSetting->create(); if (!$Blog->saveBlog($data)) { // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、ここでrollback @@ -161,6 +166,41 @@ private function __saveNc3BlogFromNc2($nc2Journals) { continue; } + $nc3Blog = $Blog->findById($Blog->id, 'block_id', null, -1); + $block = $Block->findById($nc3Blog['Blog']['block_id'], null, null, -1); + Current::write('Block', $block['Block']); + foreach ($data['BlockRolePermission'] as &$permission) { + foreach ($permission as &$role) { + $role['block_key'] = $block['Block']['key']; + } + } + + if (!$BlogSetting->saveBlogSetting($data)) { + $message = $this->getLogArgument($data) . "\n" . + var_export($BlogSetting->validationErrors, true); + $this->writeMigrationLog($message); + $Blog->rollback(); + + continue; + } + + // MailSetting + $data['MailSetting']['block_key'] = $block['Block']['key']; + $data['MailSettingFixedPhrase'][0]['block_key'] = $block['Block']['key']; + + // メールの権限については先に権限設定保存じに保存できちゃってるので、ここでは保存させない + unset($data['BlockRolePermission']); + if (!$MailSetting->saveMailSettingAndFixedPhrase($data)) { + // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、ここでrollback + $MailSetting->rollback(); + + $message = $this->getLogArgument($data) . "\n" . + var_export($MailSetting->validationErrors, true); + $this->writeMigrationLog($message); + $Blog->rollback(); + continue; + } + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2JournalId = $nc2Journal['Nc2Journal']['journal_id']; @@ -169,7 +209,6 @@ private function __saveNc3BlogFromNc2($nc2Journals) { ]; $this->saveMap('Blog', $idMap); - $nc3Blog = $Blog->findById($Blog->id, 'block_id', null, -1); if (!$Nc2ToNc3Category->saveCategoryMap($nc2CategoryList, $nc3Blog['Blog']['block_id'])) { // print_rはPHPMD.DevelopmentCodeFragmentに引っかかった。var_exportは大丈夫らしい。。。 // @see https://phpmd.org/rules/design.html @@ -187,6 +226,8 @@ private function __saveNc3BlogFromNc2($nc2Journals) { $Blog->rollback($ex); throw $ex; } + + Current::remove('Block'); } Current::remove('Room.id'); diff --git a/Model/Nc2ToNc3Cabinet.php b/Model/Nc2ToNc3Cabinet.php index 3fc01c6..796c4e2 100644 --- a/Model/Nc2ToNc3Cabinet.php +++ b/Model/Nc2ToNc3Cabinet.php @@ -43,7 +43,10 @@ class Nc2ToNc3Cabinet extends Nc2ToNc3AppModel { * @var array * @link http://book.cakephp.org/2.0/en/models/behaviors.html#using-behaviors */ - public $actsAs = ['Nc2ToNc3.Nc2ToNc3Cabinet']; + public $actsAs = [ + 'Nc2ToNc3.Nc2ToNc3Cabinet', + 'Nc2ToNc3.Nc2ToNc3BlockRolePermission', + ]; /** * Migration method. @@ -108,36 +111,41 @@ private function __saveNc3CabinetFromNc2($nc2CabinetManages) { $BlocksLanguage = ClassRegistry::init('Blocks.BlocksLanguage'); $Block = ClassRegistry::init('Blocks.Block'); + $CabinetSetting = ClassRegistry::init('Cabinets.CabinetSetting'); foreach ($nc2CabinetManages as $nc2CabinetManage) { $Nc2CabinetBlock = $this->getNc2Model('cabinet_block'); - //$nc2CabinetBlock = $Nc2CabinetBlock->find('all'); - $nc2CabinetBlock = $Nc2CabinetBlock->findByRoomId($nc2CabinetManage['Nc2CabinetManage']['room_id'], null, null, -1); - if (!$nc2CabinetBlock) { - $message = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2CabinetManage)); - $this->writeMigrationLog($message); - continue; - } $Cabinet->begin(); try { - $data = $this->generateNc3CabinetData($nc2CabinetManage, $nc2CabinetBlock); - if (!$data) { + $Nc2ToNc3Room = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Room'); + $nc3Room = $Nc2ToNc3Room->getMap($nc2CabinetManage['Nc2CabinetManage']['room_id']); + if (!$nc3Room) { + $message = __d( + 'nc2_to_nc3', + '%s does not migration, because of Room does not exist.', + $this->getLogArgument($nc2CabinetManage)); + $this->writeMigrationLog($message); + $Cabinet->rollback(); continue; } - - $Nc2ToNc3Room = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Room'); - $nc3Room = $Nc2ToNc3Room->getMap($nc2CabinetManage['Nc2CabinetManage']['room_id']); $nc3RoomId = $nc3Room['Room']['id']; + $data = $this->generateNc3CabinetData($nc2CabinetManage, $nc2CabinetBlock, $nc3RoomId); + if (!$data) { + $Cabinet->rollback(); + continue; + } + Current::write('Room.id', $nc3RoomId); $BlocksLanguage->create(); $Cabinet->create(); $Block->create(); + $CabinetSetting->create(); Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; @@ -158,10 +166,27 @@ private function __saveNc3CabinetFromNc2($nc2CabinetManages) { continue; } + $cabinet = $Cabinet->findById($Cabinet->id, 'block_id', null, -1); + $block = $Block->findById($cabinet['Cabinet']['block_id'], null, null, -1); + Current::write('Block', $block['Block']); + foreach ($data['BlockRolePermission'] as &$permission) { + foreach ($permission as &$role) { + $role['block_key'] = $block['Block']['key']; + } + } + + if (!$CabinetSetting->saveCabinetSetting($data)) { + $message = $this->getLogArgument($data) . "\n" . + var_export($CabinetSetting->validationErrors, true); + $this->writeMigrationLog($message); + $Cabinet->rollback(); + + continue; + } + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2CabinetId = $nc2CabinetManage['Nc2CabinetManage']['cabinet_id']; - $idMap = [ $nc2CabinetId => $Cabinet->id ]; @@ -174,6 +199,7 @@ private function __saveNc3CabinetFromNc2($nc2CabinetManages) { $Cabinet->rollback($ex); throw $ex; } + Current::remove('Block'); } Current::remove('Room.id'); diff --git a/Model/Nc2ToNc3Calendar.php b/Model/Nc2ToNc3Calendar.php index 223a887..21ee49e 100644 --- a/Model/Nc2ToNc3Calendar.php +++ b/Model/Nc2ToNc3Calendar.php @@ -47,6 +47,15 @@ class Nc2ToNc3Calendar extends Nc2ToNc3AppModel { */ public $useTable = false; +/** + * Contains models to load and instantiate + * + * @var array + */ + public $uses = [ + 'Calendars.CalendarEvent' + ]; + /** * List of behaviors to load when the model object is initialized. Settings can be * passed to behaviors by using the behavior name as index. @@ -193,7 +202,7 @@ private function __saveCalendarFrameSettingFromNc2($nc2CalendarBlocks) { var_export($CalendarFrameSetting->validationErrors, true); $this->writeMigrationLog($message); - $CalendarFrameSetting->rollback($ex); + $CalendarFrameSetting->rollback(); continue; } @@ -243,6 +252,30 @@ private function __saveCalendarEventFromNc2($nc2CalendarPlans) { /* @var $CalendarActionPlan CalendarActionPlan */ $CalendarActionPlan = ClassRegistry::init('Calendars.CalendarActionPlan'); foreach ($nc2CalendarPlans as $nc2CalendarPlan) { + // 移行済みのplan_idの予定だったらcontinue + // (同じplan_idの予定はCalendarRruleEntryBehavior::insertRrule()でまとめて登録されるため) + $nc2CalendarPlanId = (int)$nc2CalendarPlan['Nc2CalendarPlan']['plan_id']; + $Nc2ToNc3Map = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Map'); + $mapIdList = $Nc2ToNc3Map->getMapIdList('CalendarRrule', $nc2CalendarPlanId); + $mapIdList = array_flip($mapIdList); + if ($mapIdList) { + continue; + } + + // plan_idが同じ予定のstart_time_fullをfind + $Nc2CalendarPlan = $this->getNc2Model('calendar_plan'); + $nc2CalendarPlans = $Nc2CalendarPlan->find( + 'list', + [ + 'fields' => ['calendar_id', 'start_time_full'], + 'conditions' => [ + 'plan_id' => $nc2CalendarPlan['Nc2CalendarPlan']['plan_id'], + ], + 'recursive' => -1, + ] + ); + $nc2ExistCPlans = array_values($nc2CalendarPlans); + $CalendarActionPlan->begin(); try { $data = $this->generateNc3CalendarActionPlanData($nc2CalendarPlan); @@ -269,9 +302,11 @@ private function __saveCalendarEventFromNc2($nc2CalendarPlans) { // Validation で throw されるため、事前にチェック $validationData = $CalendarActionPlan->convertToPlanParamFormat($data); if (!$CalendarEvent->checkMaxMinDate([$validationData['start_date']], 'start') || - !$CalendarEvent->checkMaxMinDate([$validationData['end_date']], 'end') + !$CalendarEvent->checkMaxMinDate([$validationData['end_date']], 'end') || + strlen($validationData['title']) === 0 ) { - $message = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2CalendarPlan)); + $message + = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2CalendarPlan)); $this->writeMigrationLog($message); $CalendarActionPlan->rollback(); @@ -280,16 +315,20 @@ private function __saveCalendarEventFromNc2($nc2CalendarPlans) { // @see https://github.com/NetCommons3/Calendars/blob/3.1.0/Model/CalendarEvent.php#L313 // @see https://github.com/NetCommons3/Calendars/blob/3.1.0/Utility/CalendarPermissiveRooms.php#L202-L203 - $creatableValue = CalendarPermissiveRooms::$roomPermRoles['roomInfos'][$nc3RoomId]['content_creatable_value']; - CalendarPermissiveRooms::$roomPermRoles['roomInfos'][$nc3RoomId]['content_creatable_value'] = true; + $creatableValue + = CalendarPermissiveRooms::$roomPermRoles['roomInfos'][$nc3RoomId]['content_creatable_value']; + CalendarPermissiveRooms::$roomPermRoles['roomInfos'][$nc3RoomId]['content_creatable_value'] + = true; if (!$this->__saveCalendarEventFromGeneratedData($nc2CalendarPlan, $data)) { $CalendarActionPlan->rollback(); - CalendarPermissiveRooms::$roomPermRoles['roomInfos'][$nc3RoomId]['content_creatable_value'] = $creatableValue; + CalendarPermissiveRooms::$roomPermRoles['roomInfos'][$nc3RoomId]['content_creatable_value'] + = $creatableValue; continue; } - CalendarPermissiveRooms::$roomPermRoles['roomInfos'][$nc3RoomId]['content_creatable_value'] = $creatableValue; + CalendarPermissiveRooms::$roomPermRoles['roomInfos'][$nc3RoomId]['content_creatable_value'] + = $creatableValue; // CalendarActionPlan::saveCalendarPlan から、まわりまわってCalendarEvent::save が呼ばれるので、 // CalendarEvent::idで取得できる @@ -299,11 +338,25 @@ private function __saveCalendarEventFromNc2($nc2CalendarPlans) { ]; $this->saveMap('CalendarActionPlan', $idMap); + // 移行された予定のplan_idをnc2_to_nc3_mapsに登録する + /* @var $CalendarRrules CalendarRrules */ + $CalendarRrules = ClassRegistry::init('Calendars.CalendarRrule'); + $idMap = [ + $nc2CalendarPlanId => $CalendarRrules->id + ]; + $this->saveMap('CalendarRrule', $idMap); + + // nc2で削除済みの繰り返しデータに対応するnc3のデータを削除する + $this->__applyDeletingPlan($nc2CalendarId, $nc2ExistCPlans); + $CalendarActionPlan->commit(); } catch (Exception $ex) { // NetCommonsAppModel::rollback()でthrowされるので、以降の処理は実行されない // $CalendarActionPlan->saveCalendarPlanでthrowされるとこの処理に入ってこない + $this->writeMigrationLog(var_export($CalendarActionPlan->validationErrors, true)); + $this->writeMigrationLog(var_export($nc2CalendarPlan, true)); + $this->writeMigrationLog(var_export($data, true)); $CalendarActionPlan->rollback($ex); throw $ex; } @@ -357,7 +410,8 @@ private function __saveCalendarEventFromGeneratedData($nc2CalendarPlan, $nc3Acti // 更新処理でしか使われてなさげだが、同じような処理にしとく // @see https://github.com/NetCommons3/Calendars/blob/3.1.0/Model/CalendarActionPlan.php#L573-L598 - $saveParameters = $CalendarActionPlan->getProcModeOriginRepeatAndModType($nc3ActionPlan, $nc3Event); + $saveParameters + = $CalendarActionPlan->getProcModeOriginRepeatAndModType($nc3ActionPlan, $nc3Event); list($addOrEdit, $isRepeatEvent, $isChangedDteTime, $isChangedRepetition) = $saveParameters; // Nc2CalendarPlan.insert_user_idに対応するNc3User.idで良い? @@ -394,5 +448,35 @@ private function __saveCalendarEventFromGeneratedData($nc2CalendarPlan, $nc3Acti return true; } +/** + * Apply deleting recurring CalendarEvent. + * + * @param string $nc2CalendarId Nc2CalendarPlanId. + * @param array $nc2ExistCPlans Existing Nc2CalendarPlan start_time_full. + * @return bool True on success + */ + private function __applyDeletingPlan($nc2CalendarId, $nc2ExistCPlans) { + // foreachの中で登録されたデータと同じcalendar_rrule_idのデータを取得 + $nc3CalendarEventId = $this->getMap($nc2CalendarId); + $CalendarEvent = ClassRegistry::init('Calendars.CalendarEvent'); + $nc3CalendarRruleId = $CalendarEvent->find( + 'first', + [ + 'fields' => 'calendar_rrule_id', + 'conditions' => [ + 'CalendarEvent.id' => $nc3CalendarEventId['CalendarEvent']['id'], + ], + ] + ); + + // foreachの中で登録されたデータと同じcalendar_rrule_idのデータを削除 + $CalendarEvent->deleteAll( + [ + 'calendar_rrule_id' => $nc3CalendarRruleId['CalendarEvent']['calendar_rrule_id'], + 'dtstart !=' => $nc2ExistCPlans, + ], + false + ); + } } diff --git a/Model/Nc2ToNc3Faq.php b/Model/Nc2ToNc3Faq.php index 2b55188..d0b2aaa 100644 --- a/Model/Nc2ToNc3Faq.php +++ b/Model/Nc2ToNc3Faq.php @@ -52,6 +52,7 @@ class Nc2ToNc3Faq extends Nc2ToNc3AppModel { public $actsAs = [ 'Nc2ToNc3.Nc2ToNc3Faq', 'Nc2ToNc3.Nc2ToNc3Wysiwyg', + 'Nc2ToNc3.Nc2ToNc3BlockRolePermission', ]; /** @@ -124,27 +125,34 @@ private function __saveFaqFromNc2($nc2Faqs) { $Nc2ToNc3Frame = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Frame'); $BlocksLanguage = ClassRegistry::init('Blocks.BlocksLanguage'); $Nc2ToNc3Category = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Category'); + $Block = ClassRegistry::init('Blocks.Block'); + $FaqSetting = ClassRegistry::init('Faqs.FaqSetting'); foreach ($nc2Faqs as $nc2Faq) { $Faq->begin(); try { $nc2RoomId = $nc2Faq['Nc2Faq']['room_id']; - $nc2FaqBlock = $Nc2FaqBlock->findByRoomId($nc2RoomId, 'block_id', null, -1); - if (!$nc2FaqBlock) { - $message = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2Faq)); + $Nc2ToNc3Room = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Room'); + $nc3Room = $Nc2ToNc3Room->getMap($nc2RoomId); + if (!$nc3Room) { + $message = __d( + 'nc2_to_nc3', + '%s does not migration, because of Room does not exist.', + $this->getLogArgument($nc2Faq)); $this->writeMigrationLog($message); + $Faq->rollback(); continue; } + $nc3RoomId = $nc3Room['Room']['id']; - $frameMap = $Nc2ToNc3Frame->getMap($nc2FaqBlock['Nc2FaqBlock']['block_id']); - if (!$frameMap) { - $message = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2Faq)); - $this->writeMigrationLog($message); - $Faq->rollback(); - continue; + $nc2BlockId = 0; + $nc2FaqBlock = $Nc2FaqBlock->findByRoomId($nc2RoomId, 'block_id', null, -1); + if ($nc2FaqBlock) { + $nc2BlockId = $nc2FaqBlock['Nc2FaqBlock']['block_id']; } - $data = $this->generateNc3FaqData($frameMap, $nc2Faq); + $frameMap = $Nc2ToNc3Frame->getMap($nc2BlockId); + $data = $this->generateNc3FaqData($frameMap, $nc2Faq, $nc3RoomId); if (!$data) { $Faq->rollback(); continue; @@ -156,9 +164,12 @@ private function __saveFaqFromNc2($nc2Faqs) { $nc2CategoryList = $Nc2ToNc3Category->getNc2CategoryList('faq_category', $query); $data['Categories'] = $Nc2ToNc3Category->generateNc3CategoryData($nc2CategoryList); - $this->writeCurrent($frameMap, 'faqs'); + Current::write('Room.id', $nc3RoomId); + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; $BlocksLanguage->create(); + $Block->create(); + $FaqSetting->create(); if (!$Faq->saveFaq($data)) { // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、 // ここでrollback @@ -172,8 +183,29 @@ private function __saveFaqFromNc2($nc2Faqs) { continue; } + $faq = $Faq->findById($Faq->id, 'block_id', null, -1); + $block = $Block->findById($faq['Faq']['block_id'], null, null, -1); + Current::write('Block', $block['Block']); + foreach ($data['BlockRolePermission'] as &$permission) { + foreach ($permission as &$role) { + $role['block_key'] = $block['Block']['key']; + } + } + + if (!$FaqSetting->saveFaqSetting($data)) { + // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、 + // ここでrollback + $FaqSetting->rollback(); + + $message = $this->getLogArgument($data) . "\n" . + var_export($FaqSetting->validationErrors, true); + $this->writeMigrationLog($message); + $Faq->rollback(); + + continue; + } + // 登録処理で使用しているデータを空に戻す - $nc3RoomId = $frameMap['Frame']['room_id']; unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2FaqId = $nc2Faq['Nc2Faq']['faq_id']; @@ -199,8 +231,9 @@ private function __saveFaqFromNc2($nc2Faqs) { $Faq->rollback($ex); throw $ex; } + Current::remove('Block'); } - $this->removeUseCurrent(); + Current::remove('Room.id'); $this->writeMigrationLog(__d('nc2_to_nc3', ' Faq data Migration end.')); diff --git a/Model/Nc2ToNc3Link.php b/Model/Nc2ToNc3Link.php index 1737f79..a083bae 100644 --- a/Model/Nc2ToNc3Link.php +++ b/Model/Nc2ToNc3Link.php @@ -55,7 +55,10 @@ class Nc2ToNc3Link extends Nc2ToNc3AppModel { * @var array * @link http://book.cakephp.org/2.0/en/models/behaviors.html#using-behaviors */ - public $actsAs = ['Nc2ToNc3.Nc2ToNc3Link']; + public $actsAs = [ + 'Nc2ToNc3.Nc2ToNc3Link', + 'Nc2ToNc3.Nc2ToNc3BlockRolePermission', + ]; /** * Migration method. @@ -123,6 +126,8 @@ private function __saveLinkBlockFromNc2($nc2Linklists) { $Nc2ToNc3Frame = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Frame'); $BlocksLanguage = ClassRegistry::init('Blocks.BlocksLanguage'); $Nc2ToNc3Category = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Category'); + $Block = ClassRegistry::init('Blocks.Block'); + $LinkSetting = ClassRegistry::init('Links.LinkSetting'); /* @see Nc2ToNc3Map::getMapIdList() */ $Nc2ToNc3Map = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Map'); @@ -181,6 +186,8 @@ private function __saveLinkBlockFromNc2($nc2Linklists) { $this->__writeCurrent($frameMap, 'links', $nc3RoomId); $LinkBlock->create(); $BlocksLanguage->create(); + $Block->create(); + $LinkSetting->create(); if (!$LinkBlock->saveLinkBlock($data)) { // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、 // ここでrollback @@ -189,6 +196,30 @@ private function __saveLinkBlockFromNc2($nc2Linklists) { $message = $this->getLogArgument($nc2Linklist) . "\n" . var_export($LinkBlock->validationErrors, true); $this->writeMigrationLog($message); + + $LinkBlock->rollback(); + continue; + } + + // LinkBlockに対応するテーブルが存在しないためBlockモデルから直接idを取得する + $block = $Block->findById($Block->id, null, null, -1); + Current::write('Block', $block['Block']); + foreach ($data['BlockRolePermission'] as &$permission) { + foreach ($permission as &$role) { + $role['block_key'] = $block['Block']['key']; + } + } + + if (!$LinkSetting->saveLinkSetting($data)) { + // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、 + // ここでrollback + $LinkSetting->rollback(); + + $message = $this->getLogArgument($data) . "\n" . + var_export($LinkSetting->validationErrors, true); + $this->writeMigrationLog($message); + $LinkBlock->rollback(); + continue; } @@ -222,6 +253,7 @@ private function __saveLinkBlockFromNc2($nc2Linklists) { $LinkBlock->rollback($ex); throw $ex; } + Current::remove('Block'); } $this->removeUseCurrent(); diff --git a/Model/Nc2ToNc3Multidatabase.php b/Model/Nc2ToNc3Multidatabase.php index 0eeeb40..3f62153 100644 --- a/Model/Nc2ToNc3Multidatabase.php +++ b/Model/Nc2ToNc3Multidatabase.php @@ -48,6 +48,7 @@ class Nc2ToNc3Multidatabase extends Nc2ToNc3AppModel { public $actsAs = [ 'Nc2ToNc3.Nc2ToNc3Multidatabase', 'Nc2ToNc3.Nc2ToNc3Wysiwyg', + 'Nc2ToNc3.Nc2ToNc3BlockRolePermission', ]; /** @@ -234,6 +235,7 @@ private function __saveNc3MultidatabaseFromNc2($nc2Multidatabases) { // MailSetting $data['MailSetting']['block_key'] = $block['Block']['key']; + $data['MailSettingFixedPhrase'][0]['block_key'] = $block['Block']['key']; // //foreach($data['BlockRolePermission'] as &$permission){ // foreach ($permission as &$role){ diff --git a/Model/Nc2ToNc3PhotoAlbum.php b/Model/Nc2ToNc3PhotoAlbum.php index adde098..c17851a 100644 --- a/Model/Nc2ToNc3PhotoAlbum.php +++ b/Model/Nc2ToNc3PhotoAlbum.php @@ -57,7 +57,10 @@ class Nc2ToNc3PhotoAlbum extends Nc2ToNc3AppModel { * @var array * @link http://book.cakephp.org/2.0/en/models/behaviors.html#using-behaviors */ - public $actsAs = ['Nc2ToNc3.Nc2ToNc3PhotoAlbum']; + public $actsAs = [ + 'Nc2ToNc3.Nc2ToNc3PhotoAlbum', + 'Nc2ToNc3.Nc2ToNc3BlockRolePermission', + ]; /** * Migration method. @@ -135,7 +138,24 @@ private function __savePhotoAlbumFrameSettingFromNc2($nc2PhotoalbumBlocks) { $Block->create(); $BlocksLanguage->create(); $PhotoAlbumSetting->create(false); + $PhotoAlbumsComponent->initializeSetting(); + $nc3Block = $Block->findByRoomIdAndPluginKey( + $nc3RoomId, + 'photo_albums', + ['key'], + null, + -1 + ); + if (!$this->__saveBlockRolePermission( + $nc3RoomId, + $nc3Block['Block']['key'], + $nc2PhotoalbumBlock['Nc2PhotoalbumBlock']['room_id']) + ) { + $PhotoAlbum->rollback(); + continue; + } + $frameSetting = $FrameSetting->read(); $data = [ 'PhotoAlbumFrameSetting' => $frameSetting['PhotoAlbumFrameSetting'], @@ -248,7 +268,11 @@ private function __savePhotoAlbumFromNc2($nc2PhotoalbumIdList) { //$this->writeCurrent($frameMap, 'photo_albums'); $this->__writeCurrent($frameMap, 'photo_albums', $nc3RoomId); - if (!($data = $this->__savePhotoAlbumSetting($nc3RoomId, $data))) { + if (!($data = $this->__savePhotoAlbumSetting( + $nc3RoomId, + $data, + $nc2PhotoalbumAlbum['Nc2PhotoalbumAlbum']['room_id'])) + ) { $message = $this->getLogArgument($nc2PhotoalbumAlbum); $this->writeMigrationLog($message); @@ -351,9 +375,10 @@ private function __getNc2PhotoalbumIdList($nc2Photoalbums) { * * @param string $nc3RoomId nc3 room id. * @param array $nc3PhotoAlbum data. + * @param array $nc2RoomId nc2 room id. * @return array Nc3PhotoAlbum data. */ - private function __savePhotoAlbumSetting($nc3RoomId, $nc3PhotoAlbum) { + private function __savePhotoAlbumSetting($nc3RoomId, $nc3PhotoAlbum, $nc2RoomId) { /* @var $Block Block */ $Block = ClassRegistry::init('Blocks.Block'); $PhotoAlbumSetting = ClassRegistry::init('PhotoAlbums.PhotoAlbumSetting'); @@ -381,6 +406,10 @@ private function __savePhotoAlbumSetting($nc3RoomId, $nc3PhotoAlbum) { null, -1 ); + + if (!$this->__saveBlockRolePermission($nc3RoomId, $nc3Block['Block']['key'], $nc2RoomId)) { + return []; + } } $nc3PhotoAlbum['Block'] = [ @@ -395,6 +424,37 @@ private function __savePhotoAlbumSetting($nc3RoomId, $nc3PhotoAlbum) { return $nc3PhotoAlbum; } +/** + * Save BlockRolePermission. + * + * @param string $nc3RoomId nc3 room id. + * @param array $nc2RoomId nc2 room id. + * @return array Nc3PhotoAlbum data. + */ + private function __saveBlockRolePermission($nc3RoomId, $nc3BlockKey, $nc2RoomId) { + $Nc2Photoalbum = $this->getNc2Model('photoalbum'); + $PhotoAlbumSetting = ClassRegistry::init('PhotoAlbums.PhotoAlbumSetting'); + + $nc2Photoalbum = $Nc2Photoalbum->findByRoomId( + $nc2RoomId, + 'album_authority', + 'album_authority', + -1 + ); + $data = [ + 'PhotoAlbumSetting' => ['id' => null], + ]; + $data = Hash::merge($data, $this->makeContentPermissionData( + $nc2Photoalbum['Nc2Photoalbum']['album_authority'], $nc3RoomId)); + unset($data['BlockRolePermission']['content_comment_publishable'], + $data['BlockRolePermission']['content_comment_creatable']); + foreach ($data['BlockRolePermission']['content_creatable'] as &$role) { + $role['block_key'] = $nc3BlockKey; + } + + return $PhotoAlbumSetting->savePhotoAlbumSetting($data); + } + /** * Save DisplayAlbum. * diff --git a/Model/Nc2ToNc3Questionnaire.php b/Model/Nc2ToNc3Questionnaire.php index ff2b8e0..a53ca29 100644 --- a/Model/Nc2ToNc3Questionnaire.php +++ b/Model/Nc2ToNc3Questionnaire.php @@ -113,10 +113,7 @@ private function __saveQuestionnaireFromNc2($nc2Questionnaires) { /* @var $Questionnaire Questionnaire */ /* @var $Nc2Questionnaire AppModel */ - /* @var $Frame Frame */ $Questionnaire = ClassRegistry::init('Questionnaires.Questionnaire'); - $Nc2QBlock = $this->getNc2Model('questionnaire_block'); - $Frame = ClassRegistry::init('Frames.Frame'); foreach ($nc2Questionnaires as $nc2Questionnaire) { $Questionnaire->begin(); try { @@ -126,9 +123,11 @@ private function __saveQuestionnaireFromNc2($nc2Questionnaires) { continue; } - $nc2RoomId = $nc2Questionnaire['Nc2Questionnaire']['room_id']; - $nc2QBlock = $Nc2QBlock->findByRoomId($nc2RoomId, 'block_id', null, -1); - if (!$nc2QBlock) { + // Questionnaire::saveQuestionnaireで、Block,Frameデータを登録すると、 + // Current::read('Frame.key')が空のままになり、 + // QuestionnaireFrameDisplayQuestionnaire::saveDisplayQuestionnaireでエラーになるため、 + // あらかじめ登録してFrame.keyを取得できるようにしておく + if (!$this->__saveBlockAndFrame($nc2Questionnaire['Nc2Questionnaire']['room_id'])) { $message = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2Questionnaire)); $this->writeMigrationLog($message); $Questionnaire->rollback(); @@ -136,18 +135,14 @@ private function __saveQuestionnaireFromNc2($nc2Questionnaires) { } // PHPMD.ExcessiveMethodLength になるので、別メソッドにした。 - if (!$this->__setCurrentData($nc2QBlock)) { + if (!$this->__setCurrentData($nc2Questionnaire['Nc2Questionnaire']['room_id'])) { $message = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2Questionnaire)); $this->writeMigrationLog($message); $Questionnaire->rollback(); continue; } - // Model::idを初期化しないとUpdateになってしまう。 - // @see https://github.com/NetCommons3/Questionnaires/blob/3.1.0/Model/Questionnaire.php#L442 - // @see https://github.com/NetCommons3/Questionnaires/blob/3.1.0/Model/QuestionnaireSetting.php#L129-L149 - $Frame->create(); - + $data = $this->__cleansingChoiceText($data); if (!$Questionnaire->saveQuestionnaire($data)) { // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、 // ここでrollback @@ -188,6 +183,130 @@ private function __saveQuestionnaireFromNc2($nc2Questionnaires) { return true; } +/** + * Save Block and Frame. + * + * @param string $nc2RoomId nc2RoomId. + * @return bool True on success + */ + private function __saveBlockAndFrame($nc2RoomId) { + $frame = $this->__getFrameFromNc2RoomId($nc2RoomId); + if (!$frame) { + return false; + } + + /* @var $Questionnaire Questionnaire */ + /* @var $Nc2Questionnaire AppModel */ + /* @var $Frame Frame */ + $Questionnaire = ClassRegistry::init('Questionnaires.Questionnaire'); + $Frame = ClassRegistry::init('Frames.Frame'); + $Block = ClassRegistry::init('Blocks.Block'); + + // Model::idを初期化しないとUpdateになってしまう。 + // @see https://github.com/NetCommons3/Questionnaires/blob/3.1.0/Model/Questionnaire.php#L442 + // @see https://github.com/NetCommons3/Questionnaires/blob/3.1.0/Model/QuestionnaireSetting.php#L129-L149 + $Frame->create(); + $Block->create(); + + $Questionnaire->afterFrameSave($frame); + + return true; + } + +/** + * __getFrameFromNc2RoomId + * + * @param string $nc2RoomId nc2RoomId. + * @return array + */ + private function __getFrameFromNc2RoomId($nc2RoomId) { + $Nc2ToNc3Room = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Room'); + $roomMap = $Nc2ToNc3Room->getMap($nc2RoomId); + if (!$roomMap) { + return []; + } + + $data = [ + 'Frame' => [ + 'room_id' => $roomMap['Room']['id'], + 'plugin_key' => 'questionnaires', + 'key' => null, + 'block_id' => null, + ] + ]; + + $nc2BlockId = 0; + $Nc2QBlock = $this->getNc2Model('questionnaire_block'); + $nc2QBlock = $Nc2QBlock->findByRoomId($nc2RoomId, 'block_id', null, -1); + if ($nc2QBlock) { + $nc2BlockId = $nc2QBlock['Nc2QuestionnaireBlock']['block_id']; + } + + /* @var $Nc2ToNc3Frame Nc2ToNc3Frame */ + $Nc2ToNc3Frame = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Frame'); + $frameMap = $Nc2ToNc3Frame->getMap($nc2BlockId); + if ($frameMap) { + $data['Frame']['key'] = $frameMap['Frame']['key']; + $data['Frame']['block_id'] = $frameMap['Frame']['block_id']; + } + + if (!$data['Frame']['key']) { + $Frame = ClassRegistry::init('Frames.Frame'); + $frame = $Frame->find('first', + [ + 'fields' => ['key', 'block_id'], + 'recursive' => -1, + 'conditions' => [ + 'room_id' => $roomMap['Room']['id'], + 'plugin_key' => 'questionnaires' + ] + ]); + if (!$frame) { + return $data; + } + + $data['Frame']['key'] = $frame['Frame']['key']; + $data['Frame']['block_id'] = $frame['Frame']['block_id']; + } + + return $data; + } + +/** + * choice_labelの予約文字を半角変換/改行等除去 + * 「:」=>「:」「|」=>「|」 + * + * @param array $data Questionnaireデータ + * @return array + */ + private function __cleansingChoiceText($data) { + if (!isset($data['QuestionnairePage'])) { + return $data; + } + foreach ($data['QuestionnairePage'] as $key => $questionnairePage) { + if (!isset($questionnairePage['QuestionnaireQuestion'])) { + continue; + } + foreach ($questionnairePage['QuestionnaireQuestion'] as $key2 => $questionnaireQuestion) { + if (!isset($questionnaireQuestion['QuestionnaireChoice'])) { + continue; + } + foreach ($questionnaireQuestion['QuestionnaireChoice'] as $key3 => $questionnaireChoice) { + if (isset($questionnaireChoice['choice_label'])) { + $rep = str_replace(':', ':', + $questionnaireChoice['choice_label']); + $rep = str_replace('|', '|', $rep); + // 改行等を除去 + $rep = preg_replace('/[\n\r\t\f\v]+/u', '', $rep); + $data['QuestionnairePage'][$key]['QuestionnaireQuestion'][$key2]['QuestionnaireChoice'][$key3]['choice_label'] + = $rep; + } + } + } + } + return $data; + } + /** * Save QuestionnaireFrameSetting from Nc2. * @@ -204,6 +323,7 @@ private function __saveQuestionnaireFrameSettingFromNc2($nc2QBlocks) { $QFrameSetting = ClassRegistry::init('Questionnaires.QuestionnaireFrameSetting'); $Nc2ToNc3Frame = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Frame'); $Block = ClassRegistry::init('Blocks.Block'); + $QFrameDisplay = ClassRegistry::init('Questionnaires.QuestionnaireFrameDisplayQuestionnaire'); foreach ($nc2QBlocks as $nc2QBlock) { $QFrameSetting->begin(); try { @@ -235,7 +355,13 @@ private function __saveQuestionnaireFrameSettingFromNc2($nc2QBlocks) { ); Current::write('Block.id', $nc3Block['Block']['id']); + // QuestionnaireFrameDisplayQuestionnaireのquestionnaire_keyバリデーション用に初期化 + $QFrameDisplay->chkQuestionnaireList = []; if (!$QFrameSetting->saveFrameSettings($data)) { + // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、 + // ここでrollback + $QFrameSetting->rollback(); + // print_rはPHPMD.DevelopmentCodeFragmentに引っかかった。 // var_exportは大丈夫らしい。。。 // @see https://phpmd.org/rules/design.html @@ -416,31 +542,21 @@ private function __saveQuestionnaireAnswerFromNc2($nc2QSummary, $nc3QAnswerSumma /** * Set Current data. * - * @param array $nc2QBlock Nc2QuizBlock data. + * @param string $nc2RoomId nc2RoomId. * @return bool True on success */ - private function __setCurrentData($nc2QBlock) { - /* @var $Nc2ToNc3Frame Nc2ToNc3Frame */ - $Nc2ToNc3Frame = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Frame'); - - // QuestionnaireFrameDisplayQuestionnaire::saveDisplayQuestionnaire でFrameに割り当てられてしまうが、 - // Nc2ToNc3Questionnaire::__saveQuestionnaireFrameSettingFromNc2で再登録を行うことで調整 - // @see https://github.com/NetCommons3/Questionnaires/blob/3.1.0/Model/Questionnaire.php#L577-L578 - // @see https://github.com/NetCommons3/Questionnaires/blob/3.1.0/Model/Questionnaire.php#L631-L634 - $frameMap = $Nc2ToNc3Frame->getMap($nc2QBlock['Nc2QuestionnaireBlock']['block_id']); - if (!$frameMap) { + private function __setCurrentData($nc2RoomId) { + $frame = $this->__getFrameFromNc2RoomId($nc2RoomId); + if (!$frame) { return false; } - $nc3RoomId = $frameMap['Frame']['room_id']; - Current::write('Frame.key', $frameMap['Frame']['key']); - Current::write('Frame.room_id', $nc3RoomId); - Current::write('Frame.plugin_key', 'questionnaires'); - Current::write('Frame.block_id', $frameMap['Frame']['block_id']); + Current::write('Frame', $frame['Frame']); // @see https://github.com/NetCommons3/Topics/blob/3.1.0/Model/Behavior/TopicsBaseBehavior.php#L347 Current::write('Plugin.key', 'questionnaires'); // @see https://github.com/NetCommons3/Workflow/blob/3.1.0/Model/Behavior/WorkflowBehavior.php#L171-L175 + $nc3RoomId = $frame['Frame']['room_id']; Current::write('Room.id', $nc3RoomId); Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; diff --git a/Model/Nc2ToNc3Registration.php b/Model/Nc2ToNc3Registration.php index 221344f..469ee60 100644 --- a/Model/Nc2ToNc3Registration.php +++ b/Model/Nc2ToNc3Registration.php @@ -112,29 +112,19 @@ private function __saveRegistrationFromNc2($nc2Registrations) { foreach ($nc2Registrations as $nc2Registration) { $Registration->begin(); try { - $nc2RoomId = $nc2Registration['Nc2Registration']['room_id']; - $nc2RBlock = $NcRBlock->findByRoomId($nc2RoomId, 'block_id', null, -1); - if (!$nc2RBlock) { + if (!$this->__saveBlockAndFrame($nc2Registration['Nc2Registration']['room_id'])) { $message = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2Registration)); $this->writeMigrationLog($message); $Registration->rollback(); continue; } - $frameMap = $Nc2ToNc3Frame->getMap($nc2RBlock['Nc2RegistrationBlock']['block_id']); - if (!$frameMap) { - $message = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2RBlock)); + + if (!$this->__setCurrentData($nc2Registration['Nc2Registration']['room_id'])) { + $message = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2Registration)); $this->writeMigrationLog($message); $Registration->rollback(); continue; } - $frame = $Frame->findById($frameMap['Frame']['id'], null, null, -1); - $nc3RoomId = $frameMap['Frame']['room_id']; - Current::write('Frame', $frame['Frame']); - Current::write('Room.id', $nc3RoomId); - $Frame->create(); - $Block->create(); - $BlocksLanguage->create(); - $Registration->createBlock($frame); $data = $this->generateNc3RegistrationData($nc2Registration); if (!$data) { @@ -142,8 +132,6 @@ private function __saveRegistrationFromNc2($nc2Registrations) { continue; } - $this->writeCurrent($frameMap, 'registrations'); - // 本来 Registrationの独自ビヘイビアMailSettingBehaviorでcreate()した方がよい。 // とはいえ、ループで$Registration->saveRegistration()を繰り返し呼び出すのは、移行ツール位。 // 移行ツールだけの対応でもメール設定が移行できるようにするため、ここでcreate()する @@ -163,9 +151,6 @@ private function __saveRegistrationFromNc2($nc2Registrations) { continue; } - // 登録処理で使用しているデータを空に戻す - unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); - $nc2RegistrationId = $nc2Registration['Nc2Registration']['registration_id']; $idMap = [ $nc2RegistrationId => $Registration->id, @@ -180,13 +165,142 @@ private function __saveRegistrationFromNc2($nc2Registrations) { } } - $this->removeUseCurrent(); + $this->__unSetCurrentData(); $this->writeMigrationLog(__d('nc2_to_nc3', ' Registration data Migration end.')); return true; } +/** + * Save Block and Frame. + * + * @param string $nc2RoomId nc2RoomId. + * @return bool True on success + */ + private function __saveBlockAndFrame($nc2RoomId) { + $frame = $this->__getFrameFromNc2RoomId($nc2RoomId); + if (!$frame) { + return false; + } + + /* @var $Registration Registration */ + /* @var $Frame Frame */ + $Registration = ClassRegistry::init('Registrations.Registration'); + $Frame = ClassRegistry::init('Frames.Frame'); + $Block = ClassRegistry::init('Blocks.Block'); + + $Frame->create(); + $Block->create(); + + $Registration->createBlock($frame); + + return true; + } + +/** + * __getFrameFromNc2RoomId + * + * @param string $nc2RoomId nc2RoomId. + * @return array + */ + private function __getFrameFromNc2RoomId($nc2RoomId) { + $Nc2ToNc3Room = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Room'); + $roomMap = $Nc2ToNc3Room->getMap($nc2RoomId); + if (!$roomMap) { + return []; + } + + $data = [ + 'Frame' => [ + 'room_id' => $roomMap['Room']['id'], + 'plugin_key' => 'registrations', + 'key' => null, + 'block_id' => null, + ] + ]; + + $nc2BlockId = 0; + $Nc2RBlock = $this->getNc2Model('registration_block'); + $nc2RBlock = $Nc2RBlock->findByRoomId($nc2RoomId, 'block_id', null, -1); + if ($nc2RBlock) { + $nc2BlockId = $nc2RBlock['Nc2RegistrationBlock']['block_id']; + } + + /* @var $Nc2ToNc3Frame Nc2ToNc3Frame */ + $Nc2ToNc3Frame = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Frame'); + $frameMap = $Nc2ToNc3Frame->getMap($nc2BlockId); + if ($frameMap) { + $data['Frame']['key'] = $frameMap['Frame']['key']; + $data['Frame']['block_id'] = $frameMap['Frame']['block_id']; + } + + if (!$data['Frame']['key']) { + $Frame = ClassRegistry::init('Frames.Frame'); + $frame = $Frame->find('first', + [ + 'fields' => ['key', 'block_id'], + 'recursive' => -1, + 'conditions' => [ + 'room_id' => $roomMap['Room']['id'], + 'plugin_key' => 'registrations' + ] + ]); + if (!$frame) { + return $data; + } + + $data['Frame']['key'] = $frame['Frame']['key']; + $data['Frame']['block_id'] = $frame['Frame']['block_id']; + } + + return $data; + } + +/** + * Set Current data. + * + * @param string $nc2RoomId nc2RoomId. + * @return bool True on success + */ + private function __setCurrentData($nc2RoomId) { + $frame = $this->__getFrameFromNc2RoomId($nc2RoomId); + if (!$frame) { + return false; + } + Current::write('Frame', $frame['Frame']); + + // @see https://github.com/NetCommons3/Topics/blob/3.1.0/Model/Behavior/TopicsBaseBehavior.php#L347 + Current::write('Plugin.key', 'registrations'); + + // @see https://github.com/NetCommons3/Workflow/blob/3.1.0/Model/Behavior/WorkflowBehavior.php#L171-L175 + $nc3RoomId = $frame['Frame']['room_id']; + Current::write('Room.id', $nc3RoomId); + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + + return true; + } + +/** + * unset Current data. + * + * @return void + */ + private function __unSetCurrentData() { + // 登録処理で使用しているデータを空に戻す + Current::remove('Frame.key'); + Current::remove('Frame.room_id'); + Current::remove('Frame.plugin_key'); + Current::remove('Frame.block_id'); + Current::remove('Plugin.key'); + Current::remove('Room.id'); + + $nc3RoomIds = array_keys(Current::$permission); + foreach ($nc3RoomIds as $nc3RoomId) { + unset(Current::$permission[$nc3RoomId]); + } + } + /** * Save RegistrationData from Nc2. * @@ -232,7 +346,7 @@ private function __saveRegistrationDataFromNc2($nc2RegistrationData) { $RAnswerSummary->create(); if (!($nc3Summary = $RAnswerSummary->save($data))) { - $message = $this->getLogArgument($nc2ItemData) . "\n" . + $message = $this->getLogArgument($nc2RegistrationDatum) . "\n" . var_export($RAnswerSummary->validationErrors, true); $this->writeMigrationLog($message); @@ -364,7 +478,7 @@ private function __saveFrameFromNc2($nc2RBlocks) { if (!$Frame->saveFrame($data)) { // print_rはPHPMD.DevelopmentCodeFragmentに引っかかった。 var_exportは大丈夫らしい。。。 // @see https://phpmd.org/rules/design.html - $message = $this->getLogArgument($nc2RBlocks) . "\n" . + $message = $this->getLogArgument($nc2RegistrationBlock) . "\n" . var_export($Frame->validationErrors, true); $this->writeMigrationLog($message); diff --git a/Model/Nc2ToNc3RssReader.php b/Model/Nc2ToNc3RssReader.php index 0855644..addab25 100644 --- a/Model/Nc2ToNc3RssReader.php +++ b/Model/Nc2ToNc3RssReader.php @@ -97,6 +97,16 @@ private function __saveRssFromNc2($nc2RssBlocks) { try { $nc2BlockId = $nc2RssBlock['Nc2RssBlock']['block_id']; $frameMap = $Nc2ToNc3Frame->getMap($nc2BlockId); + if (!$frameMap) { + $message = __d( + 'nc2_to_nc3', + '%s does not migration, because of Frame does not exist.', + $this->getLogArgument($nc2RssBlock)); + $this->writeMigrationLog($message); + + $RssReader->rollback(); + continue; + } $this->writeCurrent($frameMap, 'rss_readers'); $data = $this->generateNc3RssReaderData($frameMap, $nc2RssBlock); diff --git a/Model/Nc2ToNc3Task.php b/Model/Nc2ToNc3Task.php index 325106f..2182891 100644 --- a/Model/Nc2ToNc3Task.php +++ b/Model/Nc2ToNc3Task.php @@ -47,7 +47,10 @@ class Nc2ToNc3Task extends Nc2ToNc3AppModel { * @var array * @link http://book.cakephp.org/2.0/en/models/behaviors.html#using-behaviors */ - public $actsAs = ['Nc2ToNc3.Nc2ToNc3Task']; + public $actsAs = [ + 'Nc2ToNc3.Nc2ToNc3Task', + 'Nc2ToNc3.Nc2ToNc3BlockRolePermission', + ]; /** * Migration method. @@ -112,20 +115,33 @@ private function __saveTaskFromNc2($nc2TodoDatas) { $Block = ClassRegistry::init('Blocks.Block'); $BlocksLanguage = ClassRegistry::init('Blocks.BlocksLanguage'); $Nc2ToNc3Category = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Category'); + $TaskSetting = ClassRegistry::init('Tasks.TaskSetting'); foreach ($nc2TodoDatas as $nc2TodoData) { $Task->begin(); try { $nc2RoomId = $nc2TodoData['Nc2Todo']['room_id']; - $nc2TodoBlock = $Nc2TodoBlock->findByRoomId($nc2RoomId, 'block_id', null, -1); - if (!$nc2TodoBlock) { - $message = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2TodoData)); + $Nc2ToNc3Room = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Room'); + $nc3Room = $Nc2ToNc3Room->getMap($nc2RoomId); + if (!$nc3Room) { + $message = __d( + 'nc2_to_nc3', + '%s does not migration, because of Room does not exist.', + $this->getLogArgument($nc2TodoData)); $this->writeMigrationLog($message); + $Task->rollback(); continue; } + $nc3RoomId = $nc3Room['Room']['id']; + + $nc2BlockId = 0; + $nc2TodoBlock = $Nc2TodoBlock->findByRoomId($nc2RoomId, 'block_id', null, -1); + if ($nc2TodoBlock) { + $nc2BlockId = $nc2TodoBlock['Nc2TodoBlock']['block_id']; + } - $frameMap = $Nc2ToNc3Frame->getMap($nc2TodoBlock['Nc2TodoBlock']['block_id']); - $data = $this->generateNc3TaskData($frameMap, $nc2TodoData); + $frameMap = $Nc2ToNc3Frame->getMap($nc2BlockId); + $data = $this->generateNc3TaskData($frameMap, $nc2TodoData, $nc3RoomId); if (!$data) { $Task->rollback(); continue; @@ -137,11 +153,13 @@ private function __saveTaskFromNc2($nc2TodoDatas) { $nc2CategoryList = $Nc2ToNc3Category->getNc2CategoryList('todo_category', $query); $data['Categories'] = $Nc2ToNc3Category->generateNc3CategoryData($nc2CategoryList); - $this->writeCurrent($frameMap, 'tasks'); + Current::write('Room.id', $nc3RoomId); + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; $Task->create(false); $Block->create(); $BlocksLanguage->create(); + $TaskSetting->create(); if (!$Task->saveTask($data)) { // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、 // ここでrollback @@ -153,8 +171,25 @@ private function __saveTaskFromNc2($nc2TodoDatas) { continue; } + $task = $Task->findById($Task->id, 'block_id', null, -1); + $block = $Block->findById($task['Task']['block_id'], null, null, -1); + Current::write('Block', $block['Block']); + foreach ($data['BlockRolePermission'] as &$permission) { + foreach ($permission as &$role) { + $role['block_key'] = $block['Block']['key']; + } + } + + if (!$TaskSetting->saveTaskSetting($data)) { + $message = $this->getLogArgument($data) . "\n" . + var_export($TaskSetting->validationErrors, true); + $this->writeMigrationLog($message); + $Task->rollback(); + + continue; + } + // 登録処理で使用しているデータを空に戻す - $nc3RoomId = $frameMap['Frame']['room_id']; unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2TodoId = $nc2TodoData['Nc2Todo']['todo_id']; @@ -186,9 +221,9 @@ private function __saveTaskFromNc2($nc2TodoDatas) { $Task->rollback($ex); throw $ex; } + Current::remove('Block'); } - - $this->removeUseCurrent(); + Current::remove('Room.id'); $this->writeMigrationLog(__d('nc2_to_nc3', ' Task data Migration end.'));