diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..f550414 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,6 @@ +# Remove files for archives generated using `git archive` +Test export-ignore +.gitattributes export-ignore +.gitignore export-ignore +.travis.yml export-ignore +phpunit.xml.dist export-ignore diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..592d72f --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,59 @@ +on: + push: + # Sequence of patterns matched against refs/tags + tags: + - '3*' + +name: create_release + +jobs: + build: + name: create_release + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Slack Notification on Start + uses: rtCamp/action-slack-notify@v2.2.0 + env: + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_RELEASE }} + SLACK_CHANNEL: notify-nc3-release + SLACK_TITLE: "${{ github.repository }}" + SLACK_COLOR: "#f0ad4e" + SLACK_MESSAGE: "Start Job" + + - name: Create Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token + with: + tag_name: ${{ github.ref }} + release_name: ${{ github.ref }} + body: | + NetCommons ${{ github.ref }} released. + draft: false + prerelease: false + + # テスト成功時はこちらのステップが実行される + - name: Slack Notification on Finish + uses: rtCamp/action-slack-notify@v2.2.0 + if: success() + env: + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_RELEASE }} + SLACK_CHANNEL: notify-nc3-release + SLACK_TITLE: "${{ github.repository }}" + SLACK_COLOR: good + SLACK_MESSAGE: "Job Success" + + # テスト失敗時はこちらのステップが実行される + - name: Slack Notification on Failure + uses: rtCamp/action-slack-notify@v2.2.0 + if: failure() + env: + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_RELEASE }} + SLACK_CHANNEL: notify-nc3-tests + SLACK_TITLE: "${{ github.repository }}" + SLACK_COLOR: danger + SLACK_MESSAGE: "Job Failure" diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..4a1352b --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,168 @@ +on: + push: + branches: + - main + - master + pull_request: + branches: + - main + - master + +name: tests + +jobs: + setup: + name: setup + runs-on: ubuntu-latest + steps: + - name: Slack Notification on Start + uses: rtCamp/action-slack-notify@v2.2.0 + if: env.SLACK_WEBHOOK != '' + env: + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_TESTS }} + SLACK_CHANNEL: notify-nc3-tests + SLACK_TITLE: "${{ github.repository }}" + SLACK_COLOR: "#f0ad4e" + + tests: + name: tests + needs: setup + runs-on: ubuntu-latest + strategy: + matrix: + php: [ '7.1', '7.2', '7.3', '7.4' ] + mysql: [ '5.7', '8.0' ] + + env: + NC3_BUILD_DIR: "/opt/nc3" + NC3_DOCKER_DIR: "/opt/docker" + NC3_GIT_URL: "git://github.com/NetCommons3/NetCommons3.git" + NC3_GIT_BRANCH: "master" + PLUGIN_BUILD_DIR: ${{ github.workspace }} + PHP_VERSION: ${{ matrix.php }} + MYSQL_VERSION: ${{ matrix.mysql }} + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: cakephp_test + COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + steps: + - uses: actions/checkout@v2 + + - name: Fix up git URLs + run: echo -e '[url "https://github.com/"]\n insteadOf = "git://github.com/"' >> ~/.gitconfig + + - name: environment + run: | + echo "GITHUB_WORKSPACE=${GITHUB_WORKSPACE}" + echo "PLUGIN_BUILD_DIR=${PLUGIN_BUILD_DIR}" + echo "PHP_VERSION=${PHP_VERSION}" + echo "MYSQL_VERSION=${MYSQL_VERSION}" + ls -al ${PLUGIN_BUILD_DIR} + + - name: docker-compose install + run: | + curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > ~/docker-compose + chmod +x ~/docker-compose + sudo mv ~/docker-compose /usr/local/bin/docker-compose + docker-compose --version + + - name: git clone nc3 + run: git clone -b ${NC3_GIT_BRANCH} ${NC3_GIT_URL} ${NC3_BUILD_DIR} + + - name: git clone nc3_docker + run: git clone https://github.com/NetCommons3/nc3app-docker.git ${NC3_DOCKER_DIR} + + - name: docker-compose start + run: | + cd ${NC3_DOCKER_DIR} + docker-compose up -d + docker-compose start + + - run: docker ps + + - name: check libraries + run: | + cd ${NC3_DOCKER_DIR} + docker-compose exec -T nc3app bash /opt/scripts/start-on-docker.sh + + - name: nc3 build + run: | + cd ${NC3_DOCKER_DIR} + docker-compose exec -T nc3app bash /opt/scripts/app-build.sh + +# - name: phpcs (PHP CodeSniffer) +# if: always() +# run: | +# cd ${NC3_DOCKER_DIR} +# docker-compose exec -T nc3app bash /opt/scripts/phpcs.sh + +# - name: phpmd (PHP Mess Detector) +# if: always() +# run: | +# cd ${NC3_DOCKER_DIR} +# docker-compose exec -T nc3app bash /opt/scripts/phpmd.sh + + - name: phpcpd (PHP Copy/Paste Detector) + if: always() + run: | + cd ${NC3_DOCKER_DIR} + docker-compose exec -T nc3app bash /opt/scripts/phpcpd.sh + + - name: gjslint (JavaScript Style Check) + if: always() + run: | + cd ${NC3_DOCKER_DIR} + docker-compose exec -T nc3app bash /opt/scripts/gjslint.sh + +# - name: phpdoc (PHP Documentor) +# if: always() +# run: | +# cd ${NC3_DOCKER_DIR} +# docker-compose exec -T nc3app bash /opt/scripts/phpdoc.sh + + - name: phpunit (PHP UnitTest) + if: always() + run: | + cd ${NC3_DOCKER_DIR} + docker-compose exec -T nc3app bash /opt/scripts/phpunit.sh + sudo -s chmod a+w -R ${NC3_BUILD_DIR}/build + +# - name: push coveralls +# env: +# COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# COVERALLS_FLAG_NAME: ${{ matrix.php }} +# run: | +# cd ${NC3_BUILD_DIR} +# ls -la ${NC3_BUILD_DIR} +# vendors/bin/php-coveralls --coverage_clover=build/logs/clover.xml -v + + - name: docker-compose remove + if: always() + run: | + cd ${NC3_DOCKER_DIR} + docker-compose rm -f + + # テスト失敗時はこちらのステップが実行される + - name: Slack Notification on Failure + uses: rtCamp/action-slack-notify@v2.2.0 + if: env.SLACK_WEBHOOK != '' && failure() + env: + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_TESTS }} + SLACK_CHANNEL: notify-nc3-tests + SLACK_TITLE: "${{ github.repository }}(php${{ matrix.php }}, mysql${{ matrix.mysql }})" + SLACK_COLOR: danger + + teardown: + name: teardown + runs-on: ubuntu-latest + needs: tests + steps: + # テスト成功時はこちらのステップが実行される + - name: Slack Notification on Success + uses: rtCamp/action-slack-notify@v2.2.0 + if: env.SLACK_WEBHOOK != '' && success() + env: + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_TESTS }} + SLACK_CHANNEL: notify-nc3-tests + SLACK_TITLE: "${{ github.repository }}" + SLACK_COLOR: good diff --git a/Console/Command/Nc2ToNc3Shell.php b/Console/Command/Nc2ToNc3Shell.php index de164a5..474f15d 100644 --- a/Console/Command/Nc2ToNc3Shell.php +++ b/Console/Command/Nc2ToNc3Shell.php @@ -69,6 +69,9 @@ protected function _prepare() { __d('nc2_to_nc3', 'Enter upload path of nc2?') ); } + if (substr($this->params['upload_path'], -1, 1) !== '/') { + $this->params['upload_path'] .= '/'; + } if (! array_key_exists('base_url', $this->params)) { $this->params['base_url'] = $this->in( __d( @@ -127,6 +130,9 @@ public function main() { $_SERVER['REQUEST_METHOD'] = 'POST'; Configure::write('App.base', $this->params['nc3base']); + // Javascript等のHTMLタグを許可する + Current::write('Permission.html_not_limited.value', 1); + // CakeObject::requestActionを使用すると、AuthComponent::_isAllowedでredirectされる // $Nc2ToNc3Controller::migrationを呼び出した方が良いのか? // Model呼び出し(Nc2ToNc3::migration)の方が良いのか? diff --git a/Controller/Nc2ToNc3Controller.php b/Controller/Nc2ToNc3Controller.php index 669ce28..2158ddb 100644 --- a/Controller/Nc2ToNc3Controller.php +++ b/Controller/Nc2ToNc3Controller.php @@ -33,7 +33,7 @@ class Nc2ToNc3Controller extends Nc2ToNc3AppController { 'Security', 'ControlPanel.ControlPanelLayout', 'NetCommons.Permission' => [ - 'type' => PermissionComponent::CHECK_TYEP_SYSTEM_PLUGIN + 'type' => PermissionComponent::CHECK_TYPE_SYSTEM_PLUGIN ], ]; @@ -41,6 +41,7 @@ class Nc2ToNc3Controller extends Nc2ToNc3AppController { * migration * * @return void + * @SuppressWarnings(PHPMD.DevelopmentCodeFragment) */ public function migration() { if ($this->request->is('post')) { @@ -51,7 +52,9 @@ public function migration() { return; } - $this->NetCommons->handleValidationError($this->Nc2ToNc3->validationErrors); + //$this->NetCommons->handleValidationError($this->Nc2ToNc3->validationErrors); + CakeLog::info('[ValidationErrors] ' . $this->request->here()); + CakeLog::info(print_r($this->Nc2ToNc3->validationErrors, true)); } else { $this->request->data['Nc2ToNc3'] = $this->Nc2ToNc3->create(); } diff --git a/Locale/eng/LC_MESSAGES/nc2_to_nc3.po b/Locale/eng/LC_MESSAGES/nc2_to_nc3.po index 105d3b4..4229a98 100644 --- a/Locale/eng/LC_MESSAGES/nc2_to_nc3.po +++ b/Locale/eng/LC_MESSAGES/nc2_to_nc3.po @@ -49,3 +49,5 @@ msgstr "" msgid "Password" msgstr "" +msgid "Go here for the migration from NetCommons2 documentation." +msgstr "" diff --git a/Locale/jpn/LC_MESSAGES/nc2_to_nc3.po b/Locale/jpn/LC_MESSAGES/nc2_to_nc3.po index 8089178..46ef4bf 100644 --- a/Locale/jpn/LC_MESSAGES/nc2_to_nc3.po +++ b/Locale/jpn/LC_MESSAGES/nc2_to_nc3.po @@ -86,3 +86,6 @@ msgstr "NC2のURL" msgid "Input URL of NetCommons2 for converting link in WYSIWYG content." msgstr "NC2のWYSIWYGエディターで登録されているリンクのURLを変換して移行します。(ex.http://example.com/nc2)" + +msgid "Go here for the migration from NetCommons2 documentation." +msgstr "NetCommons2からの移行プログラム実行方法" diff --git a/Model/Behavior/Nc2ToNc3BaseBehavior.php b/Model/Behavior/Nc2ToNc3BaseBehavior.php index ff4a0c2..6ec2fab 100644 --- a/Model/Behavior/Nc2ToNc3BaseBehavior.php +++ b/Model/Behavior/Nc2ToNc3BaseBehavior.php @@ -78,6 +78,7 @@ public function setup(Model $model, $config = array()) { public function writeMigrationLog(Model $model, $message) { $debugString = ''; $backtraces = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 5); + if (isset($backtraces[4]) && isset($backtraces[4]['line']) && isset($backtraces[4]['class']) && @@ -86,6 +87,14 @@ public function writeMigrationLog(Model $model, $message) { $debugString = $backtraces[4]['class'] . ' on line ' . $backtraces[4]['line']; } + if (version_compare( PHP_VERSION, '7.0.0', '>=' ) && + isset($backtraces[2]['line']) && + isset($backtraces[3]['class']) && + $backtraces[0]['function'] == 'writeMigrationLog' + ) { + $debugString = $backtraces[3]['class'] . ' on line ' . $backtraces[2]['line']; + } + $this->_writeMigrationLog($message, $debugString); } @@ -658,7 +667,7 @@ protected function _writeCurrent($frameMap, $pluginKey) { // @see https://github.com/NetCommons3/Workflow/blob/3.1.0/Model/Behavior/WorkflowBehavior.php#L171-L175 Current::write('Room.id', $nc3RoomId); - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; } /** diff --git a/Model/Behavior/Nc2ToNc3BbsBehavior.php b/Model/Behavior/Nc2ToNc3BbsBehavior.php index b8872a5..eabaa67 100644 --- a/Model/Behavior/Nc2ToNc3BbsBehavior.php +++ b/Model/Behavior/Nc2ToNc3BbsBehavior.php @@ -9,6 +9,7 @@ */ App::uses('Nc2ToNc3BaseBehavior', 'Nc2ToNc3.Model/Behavior'); +App::uses('BbsFrameSetting', 'Bbses.Model'); /** * Nc2ToNc3BbsBehavior @@ -61,18 +62,22 @@ public function getLogArgument(Model $model, $nc2Bbs) { * @param Model $model Model using this behavior. * @param array $nc2Bbs Nc2Bbs data. * @param array $nc2BbsBlock Nc2BbsBlock data. + * @param int $nc3RoomId nc3 room id. * @return array Nc3Bbs data. */ - public function generateNc3BbsData(Model $model, $nc2Bbs, $nc2BbsBlock) { - /* @var $Nc2ToNc3Frame Nc2ToNc3Frame */ - $Nc2ToNc3Frame = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Frame'); - $nc2BlockId = $nc2BbsBlock['Nc2BbsBlock']['block_id']; - $frameMap = $Nc2ToNc3Frame->getMap($nc2BlockId); - if (!$frameMap) { - $message = __d('nc2_to_nc3', '%s does not migration.', $this->__getLogArgument($nc2BbsBlock)); - $this->_writeMigrationLog($message); - return []; + public function generateNc3BbsData(Model $model, $nc2Bbs, $nc2BbsBlock, $nc3RoomId) { + $frameMap = []; + if ($nc2BbsBlock) { + /* @var $Nc2ToNc3Frame Nc2ToNc3Frame */ + $Nc2ToNc3Frame = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Frame'); + $nc2BlockId = $nc2BbsBlock['Nc2BbsBlock']['block_id']; + $frameMap = $Nc2ToNc3Frame->getMap($nc2BlockId); + //if (!$frameMap) { + // $message = __d('nc2_to_nc3', '%s does not migration.', $this->__getLogArgument($nc2BbsBlock)); + // $this->_writeMigrationLog($message); + // return []; + //} } /* @var $Nc2ToNc3Map Nc2ToNc3Map */ @@ -84,17 +89,15 @@ public function generateNc3BbsData(Model $model, $nc2Bbs, $nc2BbsBlock) { return []; } - $Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); - /* @var $Nc2ToNc3User Nc2ToNc3User */ - $data = []; - + //$Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); $data = [ - 'Frame' => [ - 'id' => $frameMap['Frame']['id'] - ], + //'Frame' => [ + // 'id' => $frameMap['Frame']['id'] + //], 'Block' => [ 'id' => '', - 'room_id' => $frameMap['Frame']['room_id'], + //'room_id' => $frameMap['Frame']['room_id'], + 'room_id' => $nc3RoomId, 'plugin_key' => 'bbses', 'name' => $nc2Bbs['Nc2Bb']['bbs_name'], 'public_type' => $nc2Bbs['Nc2Bb']['activity'] @@ -103,15 +106,16 @@ public function generateNc3BbsData(Model $model, $nc2Bbs, $nc2BbsBlock) { 'id' => '', 'key' => '', 'name' => $nc2Bbs['Nc2Bb']['bbs_name'], - 'created' => $this->_convertDate($nc2BbsBlock['Nc2BbsBlock']['insert_time']), - ], - 'BbsFrameSetting' => [ - 'id' => '', - 'frame_key' => $frameMap['Frame']['key'], - 'articles_per_page' => $nc2BbsBlock['Nc2BbsBlock']['visible_row'], - 'created_user' => $Nc2ToNc3User->getCreatedUser($nc2BbsBlock['Nc2BbsBlock']), - 'created' => $this->_convertDate($nc2BbsBlock['Nc2BbsBlock']['insert_time']), + //'created' => $this->_convertDate($nc2BbsBlock['Nc2BbsBlock']['insert_time']), + 'created' => $this->_convertDate($nc2Bbs['Nc2Bb']['insert_time']), ], + //'BbsFrameSetting' => [ + // 'id' => '', + // 'frame_key' => $frameMap['Frame']['key'], + // 'articles_per_page' => $nc2BbsBlock['Nc2BbsBlock']['visible_row'], + // 'created_user' => $Nc2ToNc3User->getCreatedUser($nc2BbsBlock['Nc2BbsBlock']), + // 'created' => $this->_convertDate($nc2BbsBlock['Nc2BbsBlock']['insert_time']), + //], 'BlocksLanguage' => [ 'language_id' => '', 'name' => $nc2Bbs['Nc2Bb']['bbs_name'] @@ -124,6 +128,12 @@ public function generateNc3BbsData(Model $model, $nc2Bbs, $nc2BbsBlock) { // 'use_workflow' => $nc2Bbs['Nc2Bb']['sns_flag'], ] ]; + if ($frameMap) { + $data['Frame'] = [ + 'id' => $frameMap['Frame']['id'], + ]; + } + return $data; } @@ -160,6 +170,7 @@ public function generateNc3BbsData(Model $model, $nc2Bbs, $nc2BbsBlock) { * @param array $nc2BbsPost Nc2BbsPost data. * @param array $nc2BbsPostBody Nc2BbsPostBody data. * @return array Nc3BbsArticle data. + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function generateNc3BbsArticleData(Model $model, $nc2BbsPost, $nc2BbsPostBody) { @@ -209,7 +220,8 @@ public function generateNc3BbsArticleData(Model $model, $nc2BbsPost, $nc2BbsPost //現時点でのBbsArticleTreeでのroot_idごとのarticle_no最大値を取得して、1インクリメントする。 //ただし、root_idのみのときは、root_idがnullのもの(article_noは1)しかなく取得できないため、'2'とする $BbsArticleTree = ClassRegistry::init('Bbses.BbsArticleTree'); - $BbsArticleTrees = $BbsArticleTree->findByRootId($nc3BbsRootId, array("fields" => "MAX(article_no) as max_article_no")); + $BbsArticleTrees = $BbsArticleTree->findByRootId( + $nc3BbsRootId, array("fields" => "MAX(article_no) as max_article_no")); if (!$BbsArticleTrees[0]['max_article_no']) { $nc3BbsArticleNo = '2'; } else { @@ -237,6 +249,7 @@ public function generateNc3BbsArticleData(Model $model, $nc2BbsPost, $nc2BbsPost 'title_icon' => $this->_convertTitleIcon($nc2BbsPost['Nc2BbsPost']['icon_name']), // 新着用に更新日を移行 // @see https://github.com/NetCommons3/Topics/blob/3.1.0/Model/Behavior/TopicsBaseBehavior.php#L146 + 'modified_user' => $Nc2ToNc3User->getModifiedUser($nc2BbsPost['Nc2BbsPost']), 'modified' => $this->_convertDate($nc2BbsPost['Nc2BbsPost']['update_time']), ], 'Bbs' => [ @@ -254,9 +267,21 @@ public function generateNc3BbsArticleData(Model $model, $nc2BbsPost, $nc2BbsPost 'bbs_article_key' => '', 'root_id' => $nc3BbsRootId, 'parent_id' => $nc3BbsParentId, - 'article_no' => $nc3BbsArticleNo + 'article_no' => $nc3BbsArticleNo, + 'created_user' => $Nc2ToNc3User->getCreatedUser($nc2BbsPost['Nc2BbsPost']), + 'created' => $this->_convertDate($nc2BbsPost['Nc2BbsPost']['insert_time']), + 'modified_user' => $Nc2ToNc3User->getModifiedUser($nc2BbsPost['Nc2BbsPost']), + 'modified' => $this->_convertDate($nc2BbsPost['Nc2BbsPost']['update_time']), ], ]; + if ($nc2BbsPost['Nc2BbsPost']['vote_num']) { + $data['Like'] = [ + 'plugin_key' => 'bbses', + 'block_key' => $nc3Blocks['Block']['key'], + 'like_count' => $nc2BbsPost['Nc2BbsPost']['vote_num'], + ]; + } + return $data; } @@ -315,6 +340,24 @@ public function generateNc3BbsFrameSettingData(Model $model, $nc2BbsBlock) { 'block_id' => Hash::get($nc3Bbs, ['Bbs', 'block_id']), ]; + //表示タイプ(NC3.1.4以降対応) + if ($nc2BbsBlock['Nc2BbsBlock']['expand'] === '1') { + //フラット表示 + $data['BbsFrameSetting']['display_type'] = BbsFrameSetting::DISPLAY_TYPE_FLAT; + } else { + if ($nc2BbsBlock['Nc2BbsBlock']['display'] === '0') { + //根記事一覧 + $data['BbsFrameSetting']['display_type'] = BbsFrameSetting::DISPLAY_TYPE_ROOT; + } else { + //NC2の最新記事一覧、全件一覧および過去記事は、NC3では全件一覧にする + $data['BbsFrameSetting']['display_type'] = BbsFrameSetting::DISPLAY_TYPE_ALL; + } + } + if ($nc2BbsBlock['Nc2BbsBlock']['display'] === '1') { + //最新記事一覧の場合、表示件数を1にする + $data['BbsFrameSetting']['articles_per_page'] = 1; + } + return $data; } @@ -369,4 +412,4 @@ private function __getNc3ParentArticle($nc2ParentId) { return $nc3ParentArticle; } -} \ No newline at end of file +} diff --git a/Model/Behavior/Nc2ToNc3BlogBehavior.php b/Model/Behavior/Nc2ToNc3BlogBehavior.php index 0419dbb..a71f394 100644 --- a/Model/Behavior/Nc2ToNc3BlogBehavior.php +++ b/Model/Behavior/Nc2ToNc3BlogBehavior.php @@ -78,11 +78,12 @@ public function generateNc3BlogData(Model $model, $nc2Journal) { $Frame = ClassRegistry::init('Frames.Frame'); $nc3RoomId = $roomMap['Room']['id']; $nc3Frame = $Frame->findByRoomIdAndPluginKey($nc3RoomId, 'blogs', 'id', null, -1); - if (!$nc3Frame) { - $message = __d('nc2_to_nc3', '%s does not migration.', $this->__getLogArgument($nc2Journal)); - $this->_writeMigrationLog($message); - return []; - } + // フレーム配置がなくても移行する + //if (!$nc3Frame) { + // $message = __d('nc2_to_nc3', '%s does not migration.', $this->__getLogArgument($nc2Journal)); + // $this->_writeMigrationLog($message); + // return []; + //} /* @var $Nc2ToNc3Map Nc2ToNc3Map */ $nc2JournalId = $nc2Journal['Nc2Journal']['journal_id']; @@ -98,9 +99,9 @@ public function generateNc3BlogData(Model $model, $nc2Journal) { $nc3CreatedUser = $Nc2ToNc3User->getCreatedUser($nc2Journal['Nc2Journal']); $nc3Created = $this->_convertDate($nc2Journal['Nc2Journal']['insert_time']); $data = [ - 'Frame' => [ - 'id' => $nc3Frame['Frame']['id'] - ], + //'Frame' => [ + // 'id' => $nc3Frame['Frame']['id'] + //], 'Block' => [ 'id' => '', 'room_id' => $nc3RoomId, @@ -127,11 +128,21 @@ 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_sns' => $nc2Journal['Nc2Journal']['sns_flag'], 'created_user' => $nc3CreatedUser, 'created' => $nc3Created, ], ]; + if ($nc3Frame) { + // フレームがあったらセット + $data['Frame'] = [ + 'id' => $nc3Frame['Frame']['id'] + ]; + } return $data; } @@ -268,8 +279,16 @@ public function generateNc3BlogEntryData(Model $model, $nc2JournalPost) { 'Block' => [ 'id' => $nc3Blog['Blog']['block_id'], 'key' => $nc3BlockKey - ] + ], ]; + if ($nc2JournalPost['Nc2JournalPost']['vote']) { + $data['Like'] = [ + 'plugin_key' => 'blogs', + 'block_key' => $nc3BlockKey, + 'like_count' => substr_count($nc2JournalPost['Nc2JournalPost']['vote'], '|') + 1, + ]; + } + return $data; } @@ -373,4 +392,4 @@ private function __getLogArgument($nc2Journal) { } } -} \ No newline at end of file +} diff --git a/Model/Behavior/Nc2ToNc3CabinetBehavior.php b/Model/Behavior/Nc2ToNc3CabinetBehavior.php index f57c403..1183731 100644 --- a/Model/Behavior/Nc2ToNc3CabinetBehavior.php +++ b/Model/Behavior/Nc2ToNc3CabinetBehavior.php @@ -184,8 +184,8 @@ public function generateNc3CabinetFileData(Model $model, $nc2CabinetFile, $nc2Ca /* @var $Nc2ToNc3User Nc2ToNc3User */ $Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); - //ファイルの場合は、ファイルアップロードの準備 if (!$nc2CabinetFile['Nc2CabinetFile']['file_type']) { + //ファイルの場合は、ファイルアップロードの準備 $nc2UploadId = $nc2CabinetFile['Nc2CabinetFile']['upload_id']; $nc2ToNc3Upload = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Upload'); $nc3CabinetFile = $nc2ToNc3Upload->generateUploadFile($nc2UploadId); @@ -206,9 +206,13 @@ public function generateNc3CabinetFileData(Model $model, $nc2CabinetFile, $nc2Ca // 新着用に更新日を移行 // @see https://github.com/NetCommons3/Topics/blob/3.1.0/Model/Behavior/TopicsBaseBehavior.php#L146 'modified' => $this->_convertDate($nc2CabinetFile['Nc2CabinetFile']['update_time']), + // キャビネットで更新日をunsetさせない + '_is_no_unset_modified' => 1, ]; - //フォルダの場合 + + $data['DownloadCount'] = $nc2CabinetFile['Nc2CabinetFile']['download_num']; } else { + //フォルダの場合 $data['CabinetFile'] = [ 'key' => '', 'is_folder' => $nc2CabinetFile['Nc2CabinetFile']['file_type'], @@ -221,13 +225,16 @@ public function generateNc3CabinetFileData(Model $model, $nc2CabinetFile, $nc2Ca // 新着用に更新日を移行 // @see https://github.com/NetCommons3/Topics/blob/3.1.0/Model/Behavior/TopicsBaseBehavior.php#L146 'modified' => $this->_convertDate($nc2CabinetFile['Nc2CabinetFile']['update_time']), + // キャビネットで更新日をunsetさせない + '_is_no_unset_modified' => 1, ]; } $data['Block'] = [ 'id' => $Cabinets['Cabinet']['block_id'] ]; $data['CabinetFileTree'] = [ - 'parent_id' => $nc3CabinetFileTreeId + 'cabinet_key' => $Cabinets['Cabinet']['key'], + 'parent_id' => $nc3CabinetFileTreeId, ]; return $data; diff --git a/Model/Behavior/Nc2ToNc3CalendarBehavior.php b/Model/Behavior/Nc2ToNc3CalendarBehavior.php index 8497ee2..3e57410 100644 --- a/Model/Behavior/Nc2ToNc3CalendarBehavior.php +++ b/Model/Behavior/Nc2ToNc3CalendarBehavior.php @@ -16,6 +16,11 @@ */ class Nc2ToNc3CalendarBehavior extends Nc2ToNc3BaseBehavior { +/** + * Nc2 all members room id. + */ + const NC2_ALL_MEMBERS_ROOM_ID = '0'; + /** * Get Log argument. * @@ -50,7 +55,15 @@ public function generateNc3CalendarPermissionData(Model $model, $nc2CalendarMana /* @var $Nc2ToNc3Room Nc2ToNc3Room */ $Nc2ToNc3Room = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Room'); $nc2RoomId = $nc2CalendarManage['Nc2CalendarManage']['room_id']; + $roomMap = $Nc2ToNc3Room->getMap($nc2RoomId); + if ($nc2RoomId === self::NC2_ALL_MEMBERS_ROOM_ID) { + $roomMap['Room'] = [ + 'id' => Space::getRoomIdRoot(Space::COMMUNITY_SPACE_ID), + 'space_id' => Space::COMMUNITY_SPACE_ID, + ]; + } + if (!$roomMap) { $message = __d('nc2_to_nc3', '%s does not migration.', $this->__getLogArgument($nc2CalendarManage)); $this->_writeMigrationLog($message); @@ -169,11 +182,26 @@ public function generateNc3CalendarFrameSettingData(Model $model, $nc2CalendarBl return []; } + // 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') { + $nc3DisplayType = (string)CalendarsComponent::CALENDAR_DISP_TYPE_LARGE_MONTHLY; + } /* @var $Nc2ToNc3User Nc2ToNc3User */ $Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); + if (empty($nc2CalendarBlock['Nc2CalendarBlock']['display_count'])) { + $nc2CalendarBlock['Nc2CalendarBlock']['display_count'] = 1; + } + // NC3で無効なstart_pos値(2:1月表示、3:4月表示)は0で登録 + $nc3StartPos = $nc2CalendarBlock['Nc2CalendarBlock']['start_pos']; + if ($nc3StartPos==2 || $nc3StartPos==3) { + $nc3StartPos=0; + } + $data = [ - 'display_type' => (string)((int)$nc2CalendarBlock['Nc2CalendarBlock']['display_type'] - 1), - 'start_pos' => $nc2CalendarBlock['Nc2CalendarBlock']['start_pos'], + 'display_type' => $nc3DisplayType, + 'start_pos' => $nc3StartPos, 'display_count' => $nc2CalendarBlock['Nc2CalendarBlock']['display_count'], 'is_myroom' => $nc2CalendarBlock['Nc2CalendarBlock']['myroom_flag'], 'is_select_room' => $nc2CalendarBlock['Nc2CalendarBlock']['select_room'], @@ -250,7 +278,15 @@ public function generateNc3CalendarActionPlanData(Model $model, $nc2CalendarPlan /* @var $Nc2ToNc3Room Nc2ToNc3Room */ $Nc2ToNc3Room = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Room'); $nc2RoomId = $nc2CalendarPlan['Nc2CalendarPlan']['room_id']; + $roomMap = $Nc2ToNc3Room->getMap($nc2RoomId); + if ($nc2RoomId === self::NC2_ALL_MEMBERS_ROOM_ID) { + $roomMap['Room'] = [ + 'id' => Space::getRoomIdRoot(Space::COMMUNITY_SPACE_ID), + 'space_id' => Space::COMMUNITY_SPACE_ID, + ]; + } + if (!$roomMap) { $message = __d('nc2_to_nc3', '%s does not migration.', $this->__getLogArgument($nc2CalendarPlan)); $this->_writeMigrationLog($message); @@ -296,6 +332,26 @@ 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'; + } + /* @var $Nc2ToNc3User Nc2ToNc3User */ $Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); $data += [ @@ -309,7 +365,7 @@ public function generateNc3CalendarActionPlanData(Model $model, $nc2CalendarPlan 'enable_time' => !$nc2AllDayFlag, 'detail_start_datetime' => date($dateFormat, strtotime($nc2StartTimeFull) + ($nc2TimezoneOffset * 3600)), 'detail_end_datetime' => date($dateFormat, strtotime($nc2EndTimeFull) + ($nc2TimezoneOffset * 3600)), - 'timezone_offset' => $this->_convertTimezone($nc2TimezoneOffset), + 'timezone_offset' => $nc3TimezoneOffset, 'plan_room_id' => $roomMap['Room']['id'], 'location' => $nc2CalendarPDetail['Nc2CalendarPlanDetail']['location'], 'contact' => $nc2CalendarPDetail['Nc2CalendarPlanDetail']['contact'], diff --git a/Model/Behavior/Nc2ToNc3CircularNoticeBehavior.php b/Model/Behavior/Nc2ToNc3CircularNoticeBehavior.php index 1ef32ec..89b599e 100644 --- a/Model/Behavior/Nc2ToNc3CircularNoticeBehavior.php +++ b/Model/Behavior/Nc2ToNc3CircularNoticeBehavior.php @@ -188,7 +188,7 @@ public function generateNc3CircularNoticeContentData(Model $model, $nc2Circular) 'is_active' => '1', 'is_latest' => '1', 'subject' => $nc2Circular['Nc2Circular']['circular_subject'], - 'content' => $this->_convertWYSIWYG($nc2Circular['Nc2Circular']['circular_body']), + 'content' => $model->convertWYSIWYG($nc2Circular['Nc2Circular']['circular_body']), 'reply_type' => $nc3ReplyType, //'is_room_target' => 'is_room_target' => '1', @@ -226,4 +226,4 @@ private function __getLogArgument($nc2Circular) { 'circular_id:' . $nc2Circular['Nc2Circular']['circular_id']; } } -} \ No newline at end of file +} diff --git a/Model/Behavior/Nc2ToNc3LinkBehavior.php b/Model/Behavior/Nc2ToNc3LinkBehavior.php index 1fd3eed..5fafd02 100644 --- a/Model/Behavior/Nc2ToNc3LinkBehavior.php +++ b/Model/Behavior/Nc2ToNc3LinkBehavior.php @@ -48,9 +48,10 @@ public function getLogArgument(Model $model, $nc2Link) { * @param Model $model Model using this behavior. * @param array $frameMap FrameMap data. * @param array $nc2Linklist Nc2Linklist data. + * @param int $nc3RoomId Nc3 room id * @return array Nc3Link data. */ - public function generateNc3LinkBlockData(Model $model, $frameMap, $nc2Linklist) { + public function generateNc3LinkBlockData(Model $model, $frameMap, $nc2Linklist, $nc3RoomId) { $nc2LinklistId = $nc2Linklist['Nc2Linklist']['linklist_id']; $linklistMap = $this->_getMap($nc2LinklistId); if ($linklistMap) { @@ -60,13 +61,16 @@ public function generateNc3LinkBlockData(Model $model, $frameMap, $nc2Linklist) /* @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' => $frameMap['Frame']['room_id'], + 'room_id' => $nc3RoomId, 'plugin_key' => 'links', 'public_type' => 1, ]; @@ -135,7 +139,7 @@ public function generateNc3LinkData(Model $model, $nc2LinklistLink) { 'block_id' => $nc3BlockId, 'status' => '1', 'language_id' => $nc3LinkBlock['LinkBlocksLanguage']['language_id'], - 'url' => $nc2LinklistLink['Nc2LinklistLink']['url'], + 'url' => $this->__convertURL($nc2LinklistLink['Nc2LinklistLink']['url']), 'title' => $nc2LinklistLink['Nc2LinklistLink']['title'], 'description' => $nc2LinklistLink['Nc2LinklistLink']['description'], 'click_count' => $nc2LinklistLink['Nc2LinklistLink']['view_count'], @@ -157,6 +161,66 @@ public function generateNc3LinkData(Model $model, $nc2LinklistLink) { return $data; } +/** + * Convert nc2 URL. + * + * @param string $content Nc2 content. + * @return string converted nc3 body. + */ + private function __convertURL($content) { + $searches = []; + $replaces = []; + + $strReplaceArguments = $this->__getStrReplaceArgumentsOfBaseUrlLink($content); + if ($strReplaceArguments) { + $searches = array_merge($searches, $strReplaceArguments[0]); + $replaces = array_merge($replaces, $strReplaceArguments[1]); + } + + $content = str_replace($searches, $replaces, $content); + return $content; + } + +/** + * Get str_replace arguments of page link. + * + * @param string $content Nc2 content. + * @return array str_replace arguments.(0:$search,1:$replace) + */ + private function __getStrReplaceArgumentsOfBaseUrlLink($content) { + $strReplaceArguments = []; + + /* @var $Nc2ToNc3 Nc2ToNc3 */ + /* @var $Nc2ToNc3Page Nc2ToNc3Page */ + $Nc2ToNc3 = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3'); + $Nc2ToNc3Page = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Page'); + + $nc2BaseUrl = Hash::get($Nc2ToNc3->data, ['Nc2ToNc3', 'base_url']); + $nc2BaseUrl = preg_quote($nc2BaseUrl, '/'); + $replaceBaseUrl = Router::url('/', true); + + // Wysiwyg以外のページURL ex) Links + $pattern = '/(' . $nc2BaseUrl . '\/|\.\/)(.*)/'; + + preg_match_all($pattern, $content, $matches, PREG_SET_ORDER); + foreach ($matches as $match) { + $replacePath = $match[2]; + + preg_match('/page_id=(\d+)/', $replacePath, $pageIdMatches); + if ($pageIdMatches) { + $pageMap = $Nc2ToNc3Page->getMap($pageIdMatches[1]); + $replacePath = $pageMap['Page']['permalink']; + } + + $strReplaceArguments[0][] = $match[0]; + $replacePath = urlencode($replacePath); + $replacePath = str_replace('%2F', '/', $replacePath); + $strReplaceArguments[1][] = $replaceBaseUrl . $replacePath; + } + + return $strReplaceArguments; + } + /** * Generate Nc3LinkFrameSetting data. * diff --git a/Model/Behavior/Nc2ToNc3MenuBehavior.php b/Model/Behavior/Nc2ToNc3MenuBehavior.php index e1dd6be..e9fcce4 100644 --- a/Model/Behavior/Nc2ToNc3MenuBehavior.php +++ b/Model/Behavior/Nc2ToNc3MenuBehavior.php @@ -51,11 +51,17 @@ public function generateNc3MenuFrameSettingData(Model $model, $nc2MenuDetail) { return []; } + $data = []; /* @var $Nc2ToNc3Map Nc2ToNc3Map */ $Nc2ToNc3Map = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Map'); $mapIdList = $Nc2ToNc3Map->getMapIdList('MenuFrameSetting', $nc2BlockId); if ($mapIdList) { return []; // 移行済み + + // Debug用 + /*if ($mapIdList) { + $data['id'] = $mapIdList[$nc2BlockId]; + }*/ } $nc3DisplayType = $this->__convertDisplayType($nc2MenuDetail); @@ -64,7 +70,7 @@ public function generateNc3MenuFrameSettingData(Model $model, $nc2MenuDetail) { } /* @var $Nc2ToNc3User Nc2ToNc3User */ $Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); - $data = [ + $data += [ 'frame_key' => $frameMap['Frame']['key'], 'display_type' => $nc3DisplayType, 'created_user' => $Nc2ToNc3User->getCreatedUser($nc2MenuDetail['Nc2MenuDetail']), @@ -97,6 +103,12 @@ public function generateNc3MenuFramePageOrRoomData(Model $model, $nc2MenuDetail, return $nc3MenuFrameSetting; } + if ($nc2PageId == '2') { + // グループルームの処理 + $nc3MenuFrameSetting = $this->__addReadableRoomHiddenData($nc3MenuFrameSetting); + return $nc3MenuFrameSetting; + } + /* @var $Nc2ToNc3Page Nc2ToNc3Page */ $Nc2ToNc3Page = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Page'); $pageMap = $Nc2ToNc3Page->getMap($nc2PageId); @@ -109,11 +121,26 @@ public function generateNc3MenuFramePageOrRoomData(Model $model, $nc2MenuDetail, /* @var $Nc2ToNc3User Nc2ToNc3User */ $Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); - + $menuFramePageId = null; $nc3RoomId = $pageMap['Box']['room_id']; - $nc3PageId = $pageMap['Page']['id']; + + // Debug用 + /*$menuFramePageId = Hash::get( + ClassRegistry::init('Menus.MenuFramesPage') + ->findByFrameKeyAndPageId( + $nc3MenuFrameSetting['MenuFrameSetting']['frame_key'], + $nc3PageId, + 'id', + null, + -1 + ), + ['MenuFramesPage', 'id'], + null + );*/ + $nc3MenuFrameSetting['Menus'][$nc3RoomId][$nc3PageId]['MenuFramesPage'] = [ + 'id' => $menuFramePageId, 'frame_key' => $nc3MenuFrameSetting['MenuFrameSetting']['frame_key'], 'page_id' => $nc3PageId, 'is_hidden' => '1', @@ -125,7 +152,73 @@ public function generateNc3MenuFramePageOrRoomData(Model $model, $nc2MenuDetail, } /** - * Add other room and page data. + * Add readable room hidden data. + * + * @param array $nc3MenuFrameSetting Nc3MenuFrameSetting data. + * @return array Nc3MenuFrameSetting data. + */ + private function __addReadableRoomHiddenData($nc3MenuFrameSetting) { + /* @var $Room Room */ + $Room = ClassRegistry::init('Rooms.Room'); + $query = $Room->getReadableRoomsConditions([], $nc3MenuFrameSetting['MenuFrameSetting']['created_user']); + $query['fields'] = [ + 'Room.id', + 'Room.page_id_top', + ]; + $nc3PageIdTops = $Room->find('list', $query); + + /* @var $Nc2ToNc3Map Nc2ToNc3Map */ + $Nc2ToNc3Map = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Map'); + $query = [ + 'fields' => 'nc3_id', + 'conditions' => [ + 'model_name' => 'Page', + 'nc3_id' => $nc3PageIdTops, + ], + 'recursive' => -1 + ]; + $nc3RoomIds = $Nc2ToNc3Map->find('list', $query); + + foreach ($nc3RoomIds as $nc3RoomId) { + if (!isset($nc3PageIdTops[$nc3RoomId])) { + continue; + } + + $menuFramePageId = null; + $nc3PageId = $nc3PageIdTops[$nc3RoomId]; + + // Debug用 + /*$menuFramePageId = Hash::get( + ClassRegistry::init('Menus.MenuFramesPage') + ->findByFrameKeyAndPageId( + $nc3MenuFrameSetting['MenuFrameSetting']['frame_key'], + $nc3PageIdTops[$nc3RoomId], + 'id', + null, + -1 + ), + ['MenuFramesPage', 'id'], + null + );*/ + + if (!isset($nc3MenuFrameSetting['Menus'][$nc3RoomId][$nc3PageId])) { + $nc3MenuFrameSetting['Menus'][$nc3RoomId][$nc3PageId]['MenuFramesPage'] = [ + 'id' => $menuFramePageId, + 'frame_key' => $nc3MenuFrameSetting['MenuFrameSetting']['frame_key'], + 'page_id' => $nc3PageId, + 'is_hidden' => '1', + 'created_user' => $nc3MenuFrameSetting['MenuFrameSetting']['created_user'], + 'created' => $nc3MenuFrameSetting['MenuFrameSetting']['created'], + ]; + } + + } + + return $nc3MenuFrameSetting; + } + +/** + * Add other room and page data. * * @param Model $model Model using this behavior. * @param array $nc3MenuFrameSetting Nc3MenuFrameSetting data. @@ -136,18 +229,14 @@ public function addOtherRoomAndPageData(Model $model, $nc3MenuFrameSetting) { // propertyに保持するタイミングと、unsetのタイミングを合わせようと初期処理っぽくやろうとしたが、 // Nc3MenuFrameSetting.created_user,createdがまだなかったので、とりあえず毎回取得する - if ($nc3MenuFrameSetting['MenuFrameSetting']['display_type'] !== 'header') { - return $nc3MenuFrameSetting; - } - - // Nc3MenuFrameSetting.display_type が'header' の場合、Nc2MenuDetail に存在しないRoom,Pageのデータを作成する + // Nc2MenuDetail に存在しないRoom,Pageのデータを作成する // Room::getReadableRoomsConditionsでプライベートルームの条件ははいらないはず。 // @see https://github.com/NetCommons3/Menus/blob/3.1.0/Controller/MenusAppController.php#L52-L56 // @see https://github.com/NetCommons3/Menus/blob/3.1.0/Controller/MenusController.php#L58-L63 // @see https://github.com/NetCommons3/Rooms/blob/3.1.0/Model/Behavior/RoomBehavior.php#L93-L95 /* @var $Room Room */ $Room = ClassRegistry::init('Rooms.Room'); - $query = $Room->getReadableRoomsConditions(); + $query = $Room->getReadableRoomsConditions([], $nc3MenuFrameSetting['MenuFrameSetting']['created_user']); $query['fields'] = 'Room.id'; $nc3RoomIds = $Room->find('list', $query); @@ -190,22 +279,29 @@ public function addOtherRoomAndPageData(Model $model, $nc3MenuFrameSetting) { $mapedNc3PageIds = $Nc2ToNc3Map->find('list', $query); foreach ($nc3PageList as $nc3PageId => $nc3RoomId) { - if (!isset($nc3MenuFrameSetting['MenuRooms'][$nc3RoomId])) { - $nc3MenuFrameSetting['MenuRooms'][$nc3RoomId]['MenuFramesRoom'] = [ - 'frame_key' => $nc3MenuFrameSetting['MenuFrameSetting']['frame_key'], - 'room_id' => $nc3RoomId, - 'is_hidden' => '0', - 'created_user' => $nc3MenuFrameSetting['MenuFrameSetting']['created_user'], - 'created' => $nc3MenuFrameSetting['MenuFrameSetting']['created'], - ]; - } - if (!in_array($nc3PageId, $mapedNc3PageIds)) { continue; } + $menuFramePageId = null; + + // Debug用 + /*$menuFramePageId = Hash::get( + ClassRegistry::init('Menus.MenuFramesPage') + ->findByFrameKeyAndPageId( + $nc3MenuFrameSetting['MenuFrameSetting']['frame_key'], + $nc3PageId, + 'id', + null, + -1 + ), + ['MenuFramesPage', 'id'], + null + );*/ + if (!isset($nc3MenuFrameSetting['Menus'][$nc3RoomId][$nc3PageId])) { $nc3MenuFrameSetting['Menus'][$nc3RoomId][$nc3PageId]['MenuFramesPage'] = [ + 'id' => $menuFramePageId, 'frame_key' => $nc3MenuFrameSetting['MenuFrameSetting']['frame_key'], 'page_id' => $nc3PageId, 'is_hidden' => '0', @@ -263,9 +359,14 @@ private function __convertDisplayType($nc2MenuDetail) { return $nc3DisplayType; } + + $nc2TemplateName = $nc2Block['Nc2Block']['temp_name']; + if ($nc2TemplateName === 'topic_path') { + return $nc2TemplateName; + } + $nc2Page = $Nc2Page->findByPageId($nc2Block['Nc2Block']['page_id'], 'display_position', null, -1); $nc2DisplayPosition = $nc2Page['Nc2Page']['display_position']; - $displayTypeMap = [ '1' => 'major', '2' => 'minor', @@ -275,13 +376,12 @@ private function __convertDisplayType($nc2MenuDetail) { return $displayTypeMap[$nc2DisplayPosition]; } - $nc2TemplateName = $nc2Block['Nc2Block']['temp_name']; if (strpos($nc2TemplateName, 'header') === 0 || strpos($nc2TemplateName, 'jq_gnavi') === 0) { return $displayTypeMap['3']; } - return 'main'; + return 'major'; } } diff --git a/Model/Behavior/Nc2ToNc3MultidatabaseBehavior.php b/Model/Behavior/Nc2ToNc3MultidatabaseBehavior.php index 57012be..1105c18 100644 --- a/Model/Behavior/Nc2ToNc3MultidatabaseBehavior.php +++ b/Model/Behavior/Nc2ToNc3MultidatabaseBehavior.php @@ -1,6 +1,6 @@ @@ -11,7 +11,7 @@ App::uses('Nc2ToNc3BaseBehavior', 'Nc2ToNc3.Model/Behavior'); /** - * Nc2ToNc3BlogBehavior + * Nc2ToNc3MultidatabaseBehavior * */ @@ -77,12 +77,14 @@ public function generateNc3MultidatabaseData(Model $model, $nc2Multidatabase) { /* @var $Frame Frame */ $Frame = ClassRegistry::init('Frames.Frame'); $nc3RoomId = $roomMap['Room']['id']; - $nc3Frame = $Frame->findByRoomIdAndPluginKey($nc3RoomId, 'multidatabases', ['id','key'], null, -1); - if (!$nc3Frame) { - $message = __d('nc2_to_nc3', '%s does not migration.', $this->__getLogArgument($nc2Multidatabase)); - $this->_writeMigrationLog($message); - return []; - } + $nc3Frame = $Frame->findByRoomIdAndPluginKey($nc3RoomId, 'multidatabases', ['id', 'key'], + null, -1); + // フレーム配置がなくても移行する + //if (!$nc3Frame) { + // $message = __d('nc2_to_nc3', '%s does not migration.', $this->__getLogArgument($nc2Multidatabase)); + // $this->_writeMigrationLog($message); + // return []; + //} /* @var $Nc2ToNc3Map Nc2ToNc3Map */ $Nc2MultidatabaseId = $nc2Multidatabase['Nc2Multidatabase']['multidatabase_id']; @@ -98,21 +100,23 @@ public function generateNc3MultidatabaseData(Model $model, $nc2Multidatabase) { $nc3CreatedUser = $Nc2ToNc3User->getCreatedUser($nc2Multidatabase['Nc2Multidatabase']); $nc3Created = $this->_convertDate($nc2Multidatabase['Nc2Multidatabase']['insert_time']); - //$Nc2MultidatabaseBlock = $model->getNc2Model($model, 'multidatabase_block'); - //$nc2MultidatabaseBlock = $Nc2MultidatabaseBlock->find('first', [ - // 'conditions' => [ - // - // ] - //]) + // use_workflowはRoom.need_approval = 0のときに変更可能。need_approval=1なら1で固定 + $Room = ClassRegistry::init('Rooms.Room'); + $room = $Room->findById($roomMap['Room']['id']); + if ($room['Room']['need_approval']) { + $useWorkflow = 1; + } else { + $useWorkflow = $nc2Multidatabase['Nc2Multidatabase']['agree_flag']; + } $data = [ - 'Frame' => [ - 'id' => $nc3Frame['Frame']['id'] - ], + //'Frame' => [ + // 'id' => $nc3Frame['Frame']['id'] + //], 'Block' => [ 'id' => '', 'room_id' => $nc3RoomId, - 'plugin_key' => 'blogs', + 'plugin_key' => 'multidatabase', 'name' => $nc2Multidatabase['Nc2Multidatabase']['multidatabase_name'], 'public_type' => $nc2Multidatabase['Nc2Multidatabase']['active_flag'], 'created_user' => $nc3CreatedUser, @@ -135,7 +139,7 @@ public function generateNc3MultidatabaseData(Model $model, $nc2Multidatabase) { 'use_like' => $nc2Multidatabase['Nc2Multidatabase']['vote_flag'], 'use_unlike' => '0', 'use_comment' => $nc2Multidatabase['Nc2Multidatabase']['comment_flag'], - 'use_workflow' => $nc2Multidatabase['Nc2Multidatabase']['agree_flag'], + 'use_workflow' => $useWorkflow, 'use_comment_approval' => $nc2Multidatabase['Nc2Multidatabase']['agree_flag'], 'created_user' => $nc3CreatedUser, 'created' => $nc3Created, @@ -161,6 +165,12 @@ public function generateNc3MultidatabaseData(Model $model, $nc2Multidatabase) { 3 => [], ] ]; + if ($nc3Frame) { + // フレームがあったらセット + $data['Frame'] = [ + 'id' => $nc3Frame['Frame']['id'] + ]; + } // 権限データ $data = Hash::merge($data, $this->_makePermissiondata($nc2Multidatabase['Nc2Multidatabase']['contents_authority'], $nc3RoomId)); @@ -171,11 +181,25 @@ public function generateNc3MultidatabaseData(Model $model, $nc2Multidatabase) { return $data; } +/** + * メールの置き換え変数のコンバート。必要であればここで置換する + * + * @param string $text メール定型文 + * @return string + */ protected function _convertMailValiable($text) { - // TODO X-DATA, X-MDB使えないけどどうしよう + // 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 = [ @@ -209,7 +233,6 @@ protected function _makeMailSetting($model, $nc2Multidb, $nc3RoomId) { ]); $rolesRoomIdByRoleKey = Hash::combine($rolesRooms, '{n}.RolesRoom.role_key', '{n}.RolesRoom.id'); - switch ($nc2Multidb['mail_authority']) { case 4: // NC2主担以上→Nc3ルーム管理者以上 @@ -251,6 +274,13 @@ protected function _makeMailSetting($model, $nc2Multidb, $nc3RoomId) { return $data; } +/** + * 権限配列の作成 + * + * @param int $nc2AuthorityCode NC2での投稿権限 + * @param int $nc3RoomId ルームID + * @return mixed + */ protected function _makePermissiondata($nc2AuthorityCode, $nc3RoomId) { $RoomRole = ClassRegistry::init('Rooms.RoomRole'); $RolesRoom = ClassRegistry::init('Rooms.RolesRoom'); @@ -263,7 +293,6 @@ protected function _makePermissiondata($nc2AuthorityCode, $nc3RoomId) { ]); $rolesRoomIdByRoleKey = Hash::combine($rolesRooms, '{n}.RolesRoom.role_key', '{n}.RolesRoom.id'); - switch ($nc2AuthorityCode) { case 4: // NC2主担以上→Nc3ルーム管理者以上 @@ -293,15 +322,16 @@ protected function _makePermissiondata($nc2AuthorityCode, $nc3RoomId) { $commentPublishable = 1; } - // 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_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') { @@ -313,6 +343,7 @@ protected function _makePermissiondata($nc2AuthorityCode, $nc3RoomId) { ]; } + // コメント投稿権限とコメント承認権限はroom_administrator, chief_editor以外を設定する if (!in_array($roleKey, ['room_administrator', 'chief_editor'])) { $data['BlockRolePermission']['content_comment_publishable'][$roleKey] = [ 'id' => null, @@ -387,7 +418,11 @@ public function generateNc3MultidatabaseFrameSettingData(Model $model, $nc2Multi switch($nc2MultidatabaseBlock['Nc2MultidatabaseBlock']['default_sort']){ case 'seq': //カスタマイズ順 - $sortType = '0'; // 指定無し にマッピングしておく + case '': // 空 表示設定未保存時に空文字列になる NC2でこれもカスタマイズ順となる + // NC2でデフォルト(カスタマイズ順)のまま汎用DBコンテンツを追加すると、 + // 作成日時順にdisplay_sequenceが設定され、手動で並べ替えない限り作成日時昇順になるので、 + // NC2でカスタマイズ順になっていたら 作成日時の昇順として移行する + $sortType = 'created'; break; case 'date': // 新着順 $sortType = 'created_desc'; // 作成日順 @@ -398,8 +433,15 @@ public function generateNc3MultidatabaseFrameSettingData(Model $model, $nc2Multi case 'vote' : // 投票順  $sortType = '0'; // 指定無しにマッピングしておく break; - case '1': // タイトル順 - $sortType = 'value1'; + default: + // タイトル順 + // default_sortが数字(seq, date, date_asc, vote以外)ならそれは並び順についかいたいカラムのmetadata_id + $metadataId = $nc2MultidatabaseBlock['Nc2MultidatabaseBlock']['default_sort']; + // nc3のmetadata_idを取得 + // nc3のmetadataからcol_noを取得 + // 'value' . col_noを$sort_typeにすればOK + $colNo = $this->__getColNoByNc2MetadataId($metadataId); + $sortType = 'value' . $colNo; break; } @@ -420,6 +462,35 @@ public function generateNc3MultidatabaseFrameSettingData(Model $model, $nc2Multi return $data; } + private function __getColNoByNc2MetadataId($nc2MetadataId) { + // nc3のmetadata_idを取得 + /** @var Nc2ToNc3Map $Nc2ToNc3Map */ + $Nc2ToNc3Map = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Map'); + $multidbMetadata = ClassRegistry::init('Multidatabases.MultidatabaseMetadata'); + + $mapIdList = $Nc2ToNc3Map->getMapIdList('MultidatabaseMetadata', $nc2MetadataId); + $nc3metadataId = $mapIdList[$nc2MetadataId]; + + // nc3のmetadataからcol_noを取得 + $result = $multidbMetadata->find('first', [ + 'recursive' => -1, + 'callbacks' => false, + 'fields' => ['MultidatabaseMetadata.col_no'], + 'conditions' => [ + 'MultidatabaseMetadata.id' => $nc3metadataId + ] + ]); + + return isset($result['MultidatabaseMetadata']['col_no']) ? $result['MultidatabaseMetadata']['col_no'] : null; + } + +/** + * NC3 metadataの準備 + * + * @param Model $model Nc2ToNc3Multidatabase + * @param array $nc2Metadatum NC2メタデータ + * @return array + */ public function generateNc3MultidatabaseMetadata(Model $model, $nc2Metadatum) { /* @var $Nc2ToNc3Map Nc2ToNc3Map */ $Nc2ToNc3Map = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Map'); @@ -461,7 +532,7 @@ public function generateNc3MultidatabaseMetadata(Model $model, $nc2Metadatum) { 9 => 'date', 10 => 'created', 11 => 'updated' - ]; + ]; $type = $metadataTypeMap[$nc2Metadatum['Nc2MultidatabaseMetadata']['type']]; @@ -486,7 +557,6 @@ public function generateNc3MultidatabaseMetadata(Model $model, $nc2Metadatum) { $isTitle = ($nc2Metadatum['Nc2MultidatabaseMetadata']['metadata_id'] == $nc2Multidatabase['Nc2Multidatabase']['title_metadata_id']); - $data['MultidatabaseMetadata'] = [ //'key' => $nc3Multidatabase['Multidatabase']['key'], // 'multidatabase_id' => $nc3MultidatabaseId, @@ -494,8 +564,8 @@ public function generateNc3MultidatabaseMetadata(Model $model, $nc2Metadatum) { 'name' => $nc2Metadatum['Nc2MultidatabaseMetadata']['name'], 'col_no' => $colNo, 'type' => $type, - 'rank' => $nc2Metadatum['Nc2MultidatabaseMetadata']['display_sequence'] -1, - 'position' => $nc2Metadatum['Nc2MultidatabaseMetadata']['display_pos'] -1, + 'rank' => $nc2Metadatum['Nc2MultidatabaseMetadata']['display_sequence'] - 1, + 'position' => $nc2Metadatum['Nc2MultidatabaseMetadata']['display_pos'] - 1, 'selections' => $selections, 'is_require' => $nc2Metadatum['Nc2MultidatabaseMetadata']['require_flag'], 'is_title' => $isTitle, @@ -531,9 +601,7 @@ public function generateNc3MultidatabaseMetadata(Model $model, $nc2Metadatum) { * @param array $nc2MultidbContent Nc2MultidatabaseContent data. * @return array Nc3BlogEntry data. */ - public function generateNc3MultidbContent(Model $model, $nc2MultidbContent) { - $nc2ContentId = $nc2MultidbContent['Nc2MultidatabaseContent']['content_id']; $Nc2ToNc3Map = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Map'); $mapIdList = $Nc2ToNc3Map->getMapIdList('MultidatabaseContent', $nc2ContentId); @@ -553,7 +621,7 @@ public function generateNc3MultidbContent(Model $model, $nc2MultidbContent) { $multidatabase = $Multidatabase->findById($nc3DbId, ['id', 'block_id', 'key'], null, -1); $Metadata = ClassRegistry::init('Multidatabases.MultidatabaseMetadata'); - $metadata =$Metadata->find('all', [ + $metadata = $Metadata->find('all', [ 'conditions' => [ 'multidatabase_id' => $nc3DbId, ] @@ -594,7 +662,7 @@ public function generateNc3MultidbContent(Model $model, $nc2MultidbContent) { // $data = [ - 'MultidatabaseContent' => [ + 'MultidatabaseContent' => [ 'multidatabase_key' => $dbKey, 'multidatabase_id' => $multidatabase['Multidatabase']['id'], 'language_id' => $this->getLanguageIdFromNc2($model), @@ -610,7 +678,6 @@ public function generateNc3MultidbContent(Model $model, $nc2MultidbContent) { ] ]; - $data['Like'] = [ 'like_count' => $nc2MultidbContent['Nc2MultidatabaseContent']['vote_count'], 'plugin_key' => 'multidatabases', @@ -621,7 +688,7 @@ public function generateNc3MultidbContent(Model $model, $nc2MultidbContent) { $Nc2DbFile = $this->getNc2Model($model, 'multidatabase_file'); // metadata content mapping - foreach ($nc2metadataContents as $nc2metadataContent){ + foreach ($nc2metadataContents as $nc2metadataContent) { $nc2MetadataId = $nc2metadataContent['Nc2MultidatabaseMetadataContent']['metadata_id']; $metadataMapIds = $Nc2ToNc3Map->getMapIdList('MultidatabaseMetadata', $nc2MetadataId); $nc3MetadataId = $metadataMapIds[$nc2MetadataId]; @@ -629,22 +696,24 @@ public function generateNc3MultidbContent(Model $model, $nc2MultidbContent) { $colNo = $colNoList[$nc3MetadataId]; if (in_array($metadata[$nc3MetadataId]['type'], ['image', 'file'])) { + $fileFieldName = 'value' . $colNo . '_attach'; + $DbContent->uploadSettings($fileFieldName); + // ?action=multidatabase_action_main_filedownload&upload_id=1 $value = $nc2metadataContent['Nc2MultidatabaseMetadataContent']['content']; - $eualPos = strrpos($value, '='); - if ($eualPos === false) { + $equalPos = strrpos($value, '='); + if ($equalPos === false) { // アップロードされてない →何もすることないか - } else { // アップロードファイルあり $data['MultidatabaseContent']['value' . $colNo] = ''; - $nc2UploadId = substr($value, $eualPos + 1); + $nc2UploadId = substr($value, $equalPos + 1); $file = $Nc2ToNc3Upload->generateUploadFile($nc2UploadId); - $fileFieldName = 'value' . $colNo . '_attach'; + //$fileFieldName = 'value' . $colNo . '_attach'; //$fileFieldName = 'value'.$colNo.''; $data['MultidatabaseContent'][$fileFieldName] = $file; - $DbContent->uploadSettings($fileFieldName); + //$DbContent->uploadSettings($fileFieldName); // ダウンロードパスワード $nc2DbFile = $Nc2DbFile->findByUploadId($nc2UploadId); @@ -659,11 +728,12 @@ public function generateNc3MultidbContent(Model $model, $nc2MultidbContent) { // download_content $data['DownloadCount']['value' . $colNo] = $nc2DbFile['Nc2MultidatabaseFile']['download_count']; - } - } elseif ($metadata[$nc3MetadataId]['type'] == 'checkbox') { + } elseif ($metadata[$nc3MetadataId]['type'] === 'checkbox') { $data['MultidatabaseContent']['value' . $colNo] = str_replace('|', '||', $nc2metadataContent['Nc2MultidatabaseMetadataContent']['content']); + } elseif ($metadata[$nc3MetadataId]['type'] === 'wysiwyg') { + $data['MultidatabaseContent']['value' . $colNo] = $model->convertWYSIWYG($nc2metadataContent['Nc2MultidatabaseMetadataContent']['content']); } else { $data['MultidatabaseContent']['value' . $colNo] = $nc2metadataContent['Nc2MultidatabaseMetadataContent']['content']; } @@ -749,24 +819,24 @@ public function generateNc3ContentCommentData(Model $model, $Nc2MultidbComment) /** * Get Log argument. * - * @param array $nc2Journal Array data of Nc2CalendarManage, Nc2CalendarBlock and Nc2CalendarPlan. + * @param array $nc2Multidatabase Array data of Nc2Multidatabase. * @return string Log argument */ - private function __getLogArgument($nc2Journal) { - if (isset($nc2Journal['Nc2Journal'])) { - return 'Nc2Journal ' . - 'journal_id:' . $nc2Journal['Nc2Journal']['journal_id']; - } - - if (isset($nc2Journal['Nc2MultidatabaseBlock'])) { - return 'Nc2MultidatabaseBlock ' . - 'block_id:' . $nc2Journal['Nc2MultidatabaseBlock']['block_id']; - } - - if (isset($nc2Journal['Nc2MultidatabaseContent'])) { - return 'Nc2MultidatabaseContent ' . - 'post_id:' . $nc2Journal['Nc2MultidatabaseContent']['post_id']; - } - } - -} \ No newline at end of file + private function __getLogArgument($nc2Multidatabase) { + if (isset($nc2Multidatabase['Nc2Multidatabase'])) { + return 'Nc2Multidatabase ' . + 'multidatabase_id:' . $nc2Multidatabase['Nc2Multidatabase']['multidatabase_id'] . + ' room_id:' . $nc2Multidatabase['Nc2Multidatabase']['room_id']; + } + + if (isset($nc2Multidatabase['Nc2MultidatabaseBlock'])) { + return 'Nc2MultidatabaseBlock ' . + 'block_id:' . $nc2Multidatabase['Nc2MultidatabaseBlock']['block_id']; + } + + if (isset($nc2Multidatabase['Nc2MultidatabaseContent'])) { + return 'Nc2MultidatabaseContent ' . + 'post_id:' . $nc2Multidatabase['Nc2MultidatabaseContent']['post_id']; + } + } +} diff --git a/Model/Behavior/Nc2ToNc3PageBaseBehavior.php b/Model/Behavior/Nc2ToNc3PageBaseBehavior.php index f9faba6..0842093 100644 --- a/Model/Behavior/Nc2ToNc3PageBaseBehavior.php +++ b/Model/Behavior/Nc2ToNc3PageBaseBehavior.php @@ -36,13 +36,29 @@ class Nc2ToNc3PageBaseBehavior extends Nc2ToNc3BaseBehavior { * Convert Nc2Page permalink. * * @param Model $model Model using this behavior. - * @param strine $nc2Permalink Nc2Item data. + * @param string $nc2Permalink Nc2Item data. * @return string Converted Nc2Page permalink. */ public function convertPermalink(Model $model, $nc2Permalink) { return $this->_convertPermalink($nc2Permalink); } +/** + * Convert Nc2 permalink to Nc3Page slug. + * + * @param Model $model Model using this behavior. + * @param string $nc2Permalink Nc2Item data. + * @return string Converted Nc2Page permalink. + */ + public function getConvertSlug(Model $model, $nc2Permalink) { + $permalink = $this->_convertPermalink($nc2Permalink); + $pos = strrpos($permalink, '/'); + if ($pos === false) { + return $permalink; + } + return substr($permalink, strrpos($permalink, DS) + 1); + } + /** * Get map * @@ -110,7 +126,7 @@ protected function _getMap($nc2PageIds) { /** * Convert Nc2Page permalink. * - * @param strine $nc2Permalink Nc2Item data. + * @param string $nc2Permalink Nc2Item data. * @return string Converted Nc2Page permalink. */ protected function _convertPermalink($nc2Permalink) { @@ -124,6 +140,7 @@ protected function _convertPermalink($nc2Permalink) { $url = '/' . $nc2Permalink; $route = $this->__CakeRouter->parse($url); if (!$route['pass']) { + $nc2Permalink = $this->__replacePermalink($nc2Permalink); return $nc2Permalink; } @@ -139,7 +156,32 @@ protected function _convertPermalink($nc2Permalink) { unset($route['pass'][0]); } - return implode('/', $route['pass']); + $permalink = implode('/', $route['pass']); + $permalink = $this->__replacePermalink($permalink); + return $permalink; + } + +/** + * Replace Converted permalink. + * + * @param string $permalink Converted Nc2Page permalink. + * @return string Replaced permalink. + * @see https://github.com/NetCommons3/Pages/blob/master/Model/Page.php#L235-L270 + * @see https://github.com/NetCommons3/Pages/blob/master/Model/Page.php#L300-L311 + */ + private function __replacePermalink($permalink) { + // 半角を全角に置換 + // 置換の羅列のため、phpcs除外 + // @codingStandardsIgnoreStart + $search = ['%', ' ', '#', '<', '>', '+', '\\', '"', "'", '&', '?', '=', '~', ':', ';', ',', '$', '@', './', '/.', '|', ']', '[', '!', '(', ')', '*']; + $replace = ['%', ' ', '#', '<', '>', '+', '¥¥', '”', '’', '&', '?', '=', '~', ':', ';', ',', '$', '@', './', '/.', '|', ']', '[', '!', '(', ')', '*']; + // @codingStandardsIgnoreEnd + $permalink = str_replace($search, $replace, $permalink); + + // 「^/(最初にスラッシュ)」「/$(最後にスラッシュ)」「.$(最後にドット)」「^.(最初にドット)」は取り除く + // @see https://regexper.com/#%2F%28%5E%5C%2F%7C%5C%2F%24%7C%5C.%24%7C%5E%5C.%29%2F + $pattern = '/(^\/|\/$|\.$|^\.)/'; + return preg_replace($pattern, '', $permalink); } /** diff --git a/Model/Behavior/Nc2ToNc3PhotoAlbumBehavior.php b/Model/Behavior/Nc2ToNc3PhotoAlbumBehavior.php index 1c98899..52bf597 100644 --- a/Model/Behavior/Nc2ToNc3PhotoAlbumBehavior.php +++ b/Model/Behavior/Nc2ToNc3PhotoAlbumBehavior.php @@ -51,13 +51,11 @@ public function getLogArgument(Model $model, $nc2Photoalbum) { * @param Model $model Model using this behavior. * @param array $frameMap FrameMap data. * @param array $nc2PhotoalbumAlbum Nc2PhotoalbumAlbum data. - * @param array $nc2Photo Nc2PhotoalbumPhoto data. + * @param array $nc3RoomId nc3 room id. * @return array Nc3PhotoAlbum data. */ - public function generateNc3PhotoAlbumData(Model $model, $frameMap, $nc2PhotoalbumAlbum, $nc2Photo) { - /* @var $Block Block */ + public function generateNc3PhotoAlbumData(Model $model, $frameMap, $nc2PhotoalbumAlbum, $nc3RoomId) { /* @var $Nc2ToNc3Map Nc2ToNc3Map */ - $Block = ClassRegistry::init('Blocks.Block'); $Nc2ToNc3Map = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Map'); $nc2AlbumId = $nc2PhotoalbumAlbum['Nc2PhotoalbumAlbum']['album_id']; $mapIdList = $Nc2ToNc3Map->getMapIdList('PhotoAlbum', $nc2AlbumId); @@ -66,14 +64,6 @@ public function generateNc3PhotoAlbumData(Model $model, $frameMap, $nc2Photoalbu return []; } - $nc3Block = $Block->findByRoomIdAndPluginKey( - $frameMap['Frame']['room_id'], - 'photo_albums', - ['id', 'key'], - null, - -1 - ); - /* @var $Nc2ToNc3User Nc2ToNc3User */ /* @var $Nc2ToNc3Upload Nc2ToNc3Upload */ $Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); @@ -85,18 +75,14 @@ public function generateNc3PhotoAlbumData(Model $model, $frameMap, $nc2Photoalbu $nc2Jacket = $nc2PhotoalbumAlbum['Nc2PhotoalbumAlbum']['album_jacket']; $jacket = $this->__generatePresetFile($nc2Jacket); } - $nc3Photo = $Nc2ToNc3Upload->generateUploadFile($nc2Photo['Nc2PhotoalbumPhoto']['upload_id']); + $nc3Photo = $jacket; - $data['Frame'] = [ - 'id' => $frameMap['Frame']['id'], - ]; - $data['Block'] = [ - 'id' => $nc3Block['Block']['id'], - 'key' => $nc3Block['Block']['key'], - 'room_id' => $frameMap['Frame']['room_id'], - 'plugin_key' => 'photo_albums', - 'public_type' => 1, - ]; + if ($frameMap) { + // フレームがあったらセット + $data['Frame'] = [ + 'id' => $frameMap['Frame']['id'], + ]; + } $data['PhotoAlbum'] = [ 'id' => '', 'key' => '', @@ -105,7 +91,7 @@ public function generateNc3PhotoAlbumData(Model $model, $frameMap, $nc2Photoalbu 'name' => $nc2PhotoalbumAlbum['Nc2PhotoalbumAlbum']['album_name'], 'description' => $nc2PhotoalbumAlbum['Nc2PhotoalbumAlbum']['album_description'], 'selectedJacketIndex' => '0', - 'jacket' => $jacket, + 'jacket' => [], 'created_user' => $Nc2ToNc3User->getCreatedUser($nc2PhotoalbumAlbum['Nc2PhotoalbumAlbum']), 'created' => $this->_convertDate($nc2PhotoalbumAlbum['Nc2PhotoalbumAlbum']['insert_time']), ]; @@ -216,9 +202,9 @@ public function generateNc3PhotoAlbumFrameSettingData(Model $model, $data, $fram 'created_user' => $Nc2ToNc3User->getCreatedUser($nc2PhotoalbumBlock['Nc2PhotoalbumBlock']), 'created' => $this->_convertDate($nc2PhotoalbumBlock['Nc2PhotoalbumBlock']['insert_time']), ]; - $data += $photoAlbumFrameSet; + $photoAlbumFrameSet['PhotoAlbumFrameSetting'] += $data['PhotoAlbumFrameSetting']; - return $data; + return $photoAlbumFrameSet; } /** @@ -276,9 +262,9 @@ private function __generatePresetFile($nc2Jacket) { * @return string Log argument */ private function __getLogArgument($nc2Photoalbum) { - if (!isset($nc2PhotoalbumBlock['Nc2PhotoalbumBlock']['block_id'])) { + if (isset($nc2Photoalbum['Nc2PhotoalbumBlock']['block_id'])) { return 'Nc2PhotoalbumBlock' . - 'block_id' . $nc2PhotoalbumBlock['Nc2PhotoalbumBlock']['block_id']; + 'block_id' . $nc2Photoalbum['Nc2PhotoalbumBlock']['block_id']; } if (isset($nc2Photoalbum['Nc2Photoalbum'])) { diff --git a/Model/Behavior/Nc2ToNc3RegistrationBehavior.php b/Model/Behavior/Nc2ToNc3RegistrationBehavior.php index b8a52ff..03b10ce 100644 --- a/Model/Behavior/Nc2ToNc3RegistrationBehavior.php +++ b/Model/Behavior/Nc2ToNc3RegistrationBehavior.php @@ -94,36 +94,61 @@ public function generateNc3RegistrationData(Model $model, $nc2Registration) { $endPeriod = $this->_convertDate($nc2Registration['Nc2Registration']['period']); } + /* @var $Nc2ToNc3Room Nc2ToNc3Room */ + $Nc2ToNc3Room = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Room'); + $roomMap = $Nc2ToNc3Room->getMap($nc2Registration['Nc2Registration']['room_id']); + if (!$roomMap) { + $message = __d('nc2_to_nc3', '%s does not migration.', $this->__getLogArgument($nc2Registration)); + $this->_writeMigrationLog($message); + return []; + } + /* @var $Nc2ToNc3User Nc2ToNc3User */ $Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); - $data['Registration'] = [ - 'key' => Hash::get($registrationMap, ['Registration', 'key']), - 'is_active' => '0', - 'status' => '3', - 'title' => $nc2Registration['Nc2Registration']['registration_name'], - //'title_icon' => $this->_convertTitleIcon($nc2Registration['Nc2Registration']['title_icon']), - 'is_total_show' => '0', - 'answer_timing' => $answerTiming, - 'is_key_pass_use' => RegistrationsComponent::USES_NOT_USE, - 'total_show_timing' => '0', - 'registration_mail_subject' => $nc2Registration['Nc2Registration']['mail_subject'], - 'registration_mail_body' => $nc2Registration['Nc2Registration']['mail_body'], - 'sub_title' => '', - 'is_answer_mail_send' => $nc2Registration['Nc2Registration']['mail_send'], - 'is_image_authentication' => $nc2Registration['Nc2Registration']['image_authentication'], - 'reply_to' => $nc2Registration['Nc2Registration']['rcpt_to'], - 'answer_start_period' => '', - 'answer_end_period' => $endPeriod, - 'is_limit_number' => (empty($nc2Registration['Nc2Registration']['limit_number']) ? '0' : '1'), - 'limit_number' => $nc2Registration['Nc2Registration']['limit_number'], - 'created_user' => $Nc2ToNc3User->getCreatedUser($nc2Registration['Nc2Registration']), - 'created' => $this->_convertDate($nc2Registration['Nc2Registration']['insert_time']), + $nc3CreatedUser = $Nc2ToNc3User->getCreatedUser($nc2Registration['Nc2Registration']); + $nc3Created = $this->_convertDate($nc2Registration['Nc2Registration']['insert_time']); + $data = [ + 'Registration' => [ + 'key' => Hash::get($registrationMap, ['Registration', 'key']), + 'is_active' => '1', + 'status' => '1', + 'title' => $nc2Registration['Nc2Registration']['registration_name'], + //'title_icon' => $this->_convertTitleIcon($nc2Registration['Nc2Registration']['title_icon']), + 'is_total_show' => '0', + 'answer_timing' => $answerTiming, + 'is_key_pass_use' => RegistrationsComponent::USES_NOT_USE, + 'total_show_timing' => '0', + 'thanks_content' => nl2br($nc2Registration['Nc2Registration']['accept_message']), + 'is_regist_user_send' => $nc2Registration['Nc2Registration']['regist_user_send'], + 'registration_mail_subject' => str_replace('{X-REGISTRATION_NAME}', '{X-SUBJECT}', $nc2Registration['Nc2Registration']['mail_subject']), + 'registration_mail_body' => str_replace('{X-REGISTRATION_NAME}', '{X-SUBJECT}', $nc2Registration['Nc2Registration']['mail_body']), + 'sub_title' => '', + 'is_answer_mail_send' => $nc2Registration['Nc2Registration']['mail_send'], + 'is_image_authentication' => $nc2Registration['Nc2Registration']['image_authentication'], + //'reply_to' => $nc2Registration['Nc2Registration']['rcpt_to'], + 'answer_start_period' => '', + 'answer_end_period' => $endPeriod, + 'is_limit_number' => (empty($nc2Registration['Nc2Registration']['limit_number']) ? '0' : '1'), + 'limit_number' => $nc2Registration['Nc2Registration']['limit_number'], + 'created_user' => $nc3CreatedUser, + 'created' => $nc3Created, + ], + 'Block' => [ + 'id' => '', + 'room_id' => $roomMap['Room']['id'], + 'plugin_key' => 'registrations', + 'name' => $nc2Registration['Nc2Registration']['registration_name'], + 'created_user' => $nc3CreatedUser, + 'created' => $nc3Created, + ], + 'BlocksLanguage' => [ + 'language_id' => '', + 'name' => $nc2Registration['Nc2Registration']['registration_name'], + 'created_user' => $nc3CreatedUser, + 'created' => $nc3Created, + ], ]; - if ($nc2Registration['Nc2Registration']['status'] != '0') { - $data['Registration']['is_active'] = '1'; - $data['Registration']['status'] = '1'; - } if ($nc2Registration['Nc2Registration']['image_authentication'] == '1') { $data['Registration']['is_image_authentication'] = '0'; } @@ -158,6 +183,11 @@ public function generateNc3RegistrationData(Model $model, $nc2Registration) { * @return array Nc3RegistrationAnswerSummary data. */ public function generateNc3RegistrationAnswerSummaryData(Model $model, $nc2ItemDataFirst, $nc3Registration) { + if (empty($nc3Registration)) { + // 回答なし + return []; + } + $nc2RegistrationId = $nc2ItemDataFirst['Nc2RegistrationItemData']['registration_id']; $registrationMap = $this->_getMap($nc2RegistrationId); if (!$registrationMap) { @@ -190,6 +220,7 @@ public function generateNc3RegistrationAnswerSummaryData(Model $model, $nc2ItemD } $data['RegistrationAnswerSummary'] = [ + 'serial_number' => $nc2DataId, 'answer_status' => '2', 'test_status' => '0', 'answer_number' => $nc3AnswerNumber, @@ -334,6 +365,7 @@ private function __generateNc3RegistrationPageData($nc2Registration) { */ private function __generateNc3RegistrationChoiceData($nc2Item) { $nc2Choices = explode('|', $nc2Item['Nc2RegistrationItem']['option_value']); + $nc2Choices = $this->__unsetEmptyNc2Choices($nc2Choices); /* @var $Nc2ToNc3User Nc2ToNc3User */ $Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); @@ -343,7 +375,7 @@ private function __generateNc3RegistrationChoiceData($nc2Item) { $data[] = [ 'choice_sequence' => $nc3ChoiceSequence, 'choice_label' => $nc2Choice, - //'graph_color' => $this->_getGraphColor($nc3ChoiceSequence), + 'graph_color' => $this->_getGraphColor($nc3ChoiceSequence), 'created_user' => $Nc2ToNc3User->getCreatedUser($nc2Item['Nc2RegistrationItem']), 'created' => $this->_convertDate($nc2Item['Nc2RegistrationItem']['insert_time']), ]; @@ -438,9 +470,10 @@ public function getQuestionMap(Model $model, $nc2ItemDataFirst, $nc3Registration ]; $nc2ChoiceListTmp = $Nc2Item->find('all', $query); $nc2ChoiceList = []; - foreach ($nc2ChoiceListTmp as $nc2Choice) { - $nc2ChoiceList[$nc2Choice['Nc2RegistrationItem']['item_id']] - = explode('|', $nc2Choice['Nc2RegistrationItem']['option_value']); + foreach ($nc2ChoiceListTmp as $nc2ChoiceTmp) { + $nc2ChoiceSeqList = explode('|', $nc2ChoiceTmp['Nc2RegistrationItem']['option_value']); + $nc2ChoiceSeqList = $this->__unsetEmptyNc2Choices($nc2ChoiceSeqList); + $nc2ChoiceList[$nc2ChoiceTmp['Nc2RegistrationItem']['item_id']] = $nc2ChoiceSeqList; } // $nc3RegistrationのRegistrationPage階層を除去RegistrationQuestion @@ -493,6 +526,29 @@ public function getQuestionMap(Model $model, $nc2ItemDataFirst, $nc3Registration return $map; } +/** + * unset empty nc2Choices + * + * @param array $nc2Choices nc2Choices + * @return array nc2Choices + */ + private function __unsetEmptyNc2Choices($nc2Choices) { + foreach ($nc2Choices as $key => $nc2Choice) { + // NC2ではOKだった全角空白のみの選択肢も、NC3ではRegistrationChoiceモデルでvalidateエラーになるため、取り除く。 + // @see https://github.com/NetCommons3/Registrations/blob/master/Model/RegistrationChoice.php#L80-L89 + $checkEmpty = str_replace([' ', ' '], '', $nc2Choice); + if ($checkEmpty == '') { + unset($nc2Choices[$key]); + } else { + // NC2ではOKだった「:」「|」を含む選択肢も、NC3ではRegistrationChoiceモデルでvalidateエラーになるため、全角に置換してセットする。 + $nc2Choice = str_replace(':', ':', $nc2Choice); + $nc2Choice = str_replace('|', '|', $nc2Choice); + $nc2Choices[$key] = $nc2Choice; + } + } + return $nc2Choices; + } + /** * Get choice map * @@ -546,6 +602,7 @@ protected function _convertAnswerValue($nc2AnswerValue, $registrationMap) { } $nc2Choices = explode('|', $nc2AnswerValue); + $nc2Choices = $this->__unsetEmptyNc2Choices($nc2Choices); $nc3AnswerValue = ''; $nc3AnswerArray = []; //foreach ($nc2Choices as $key => $nc2Choice) { diff --git a/Model/Behavior/Nc2ToNc3ReservationBehavior.php b/Model/Behavior/Nc2ToNc3ReservationBehavior.php index b57a51c..c67d2c5 100644 --- a/Model/Behavior/Nc2ToNc3ReservationBehavior.php +++ b/Model/Behavior/Nc2ToNc3ReservationBehavior.php @@ -11,44 +11,41 @@ App::uses('Nc2ToNc3BaseBehavior', 'Nc2ToNc3.Model/Behavior'); /** - * Nc2ToNc3BlogBehavior - * TODO Reservationにあわせる + * Nc2ToNc3ReservationBehavior */ - class Nc2ToNc3ReservationBehavior extends Nc2ToNc3BaseBehavior { /** * Get Log argument. * * @param Model $model Model using this behavior. - * @param array $nc2Journal Array data of Nc2Journal, Nc2JournalPost. + * @param array $Nc2Reservation Array data of Nc2Reservation, Nc2ReservationPost. * @return string Log argument */ - public function getLogArgument(Model $model, $nc2Journal) { - return $this->__getLogArgument($nc2Journal); + public function getLogArgument(Model $model, $Nc2Reservation) { + return $this->__getLogArgument($Nc2Reservation); } /** * Get Log argument. * - * @param array $nc2Journal Array data of Nc2CalendarManage, Nc2CalendarBlock and Nc2CalendarPlan. + * @param array $Nc2Reservation Array data of Nc2CalendarManage, Nc2CalendarBlock and Nc2CalendarPlan. * @return string Log argument */ - private function __getLogArgument($nc2Journal) { - if (isset($nc2Journal['Nc2Journal'])) { - return 'Nc2Journal ' . - 'journal_id:' . $nc2Journal['Nc2Journal']['journal_id']; + private function __getLogArgument($Nc2Reservation) { + if (isset($Nc2Reservation['Nc2Reservation'])) { + return 'Nc2Reservation ' . + 'journal_id:' . $Nc2Reservation['Nc2Reservation']['journal_id']; } - if (isset($nc2Journal['Nc2JournalBlock'])) { - return 'Nc2JournalBlock ' . - 'block_id:' . $nc2Journal['Nc2JournalBlock']['block_id']; + if (isset($Nc2Reservation['Nc2ReservationBlock'])) { + return 'Nc2ReservationBlock ' . + 'block_id:' . $Nc2Reservation['Nc2ReservationBlock']['block_id']; } - if (isset($nc2Journal['Nc2JournalPost'])) { - return 'Nc2JournalPost ' . - 'post_id:' . $nc2Journal['Nc2JournalPost']['post_id']; + if (isset($Nc2Reservation['Nc2ReservationPost'])) { + return 'Nc2ReservationPost ' . + 'post_id:' . $Nc2Reservation['Nc2ReservationPost']['post_id']; } } - } \ No newline at end of file diff --git a/Model/Behavior/Nc2ToNc3RssReaderBehavior.php b/Model/Behavior/Nc2ToNc3RssReaderBehavior.php index 3fb2bc2..755e908 100644 --- a/Model/Behavior/Nc2ToNc3RssReaderBehavior.php +++ b/Model/Behavior/Nc2ToNc3RssReaderBehavior.php @@ -63,15 +63,21 @@ public function generateNc3RssReaderData(Model $model, $frameMap, $nc2RssBlock) return []; } - $rss = Xml::build($nc2RssBlock['Nc2RssBlock']['url']); - if ($rss->getName() === 'feed') { - $name = (string)$rss->title; - $link = (string)$rss->link->attributes()->href; - $summary = (string)$rss->subtitle; - } else { - $name = (string)$rss->channel->title; - $link = (string)$rss->channel->link; - $summary = (string)$rss->channel->description; + try { + $rss = Xml::build($nc2RssBlock['Nc2RssBlock']['url']); + if ($rss->getName() === 'feed') { + $name = (string)$rss->title; + $link = (string)$rss->link->attributes()->href; + $summary = (string)$rss->subtitle; + } else { + $name = (string)$rss->channel->title; + $link = (string)$rss->channel->link; + $summary = (string)$rss->channel->description; + } + } catch (Exception $ex) { + $name = ''; + $link = ''; + $summary = ''; } if (!$name) { $name = $nc2RssBlock['Nc2RssBlock']['site_name']; diff --git a/Model/Behavior/Nc2ToNc3TopicBehavior.php b/Model/Behavior/Nc2ToNc3TopicBehavior.php index 1fa787f..89327ea 100644 --- a/Model/Behavior/Nc2ToNc3TopicBehavior.php +++ b/Model/Behavior/Nc2ToNc3TopicBehavior.php @@ -86,7 +86,6 @@ public function generateNc3TopicFrameSettingData(Model $model, $nc2WhatsnewBlock /* @var $Nc2ToNc3User Nc2ToNc3User */ $Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); - $data = []; $data = [ 'Frame' => [ 'id' => $frameMap['Frame']['id'] @@ -127,6 +126,42 @@ public function generateNc3TopicFrameSettingData(Model $model, $nc2WhatsnewBlock 'plugin_key' => $nc3FramePluginKey ] ]; + // 指定したルームのみ表示する=ONなら、room_id登録 + if ($nc2WhatsnewBlock['Nc2WhatsnewBlock']['select_room']) { + /* @see Nc2ToNc3Map::getMapIdList() */ + $mapRoomIdList = $Nc2ToNc3Map->getMapIdList('Room'); + + /* @see Nc2ToNc3BaseBehavior::getNc2Model() */ + $Nc2SelectRoom = $model->getNc2Model('whatsnew_select_room'); + $nc2SelectRooms = $Nc2SelectRoom->find('all', [ + 'recursive' => -1, + 'conditions' => [ + 'block_id' => $nc2BlockId + ], + ]); + + $nc3RoomIds = []; + foreach ($nc2SelectRooms as $nc2SelectRoom) { + $nc2RoomId = $nc2SelectRoom['Nc2WhatsnewSelectRoom']['room_id']; + if (! isset($mapRoomIdList[$nc2RoomId])) { + $message = __d('nc2_to_nc3', '%s No room ID corresponding to nc3', + $model->getLogArgument($nc2WhatsnewBlock) . 'nc2_room_id:' . $nc2RoomId); + $model->writeMigrationLog($message); + continue; + } + $nc3RoomIds[] = $mapRoomIdList[$nc2RoomId]; + } + if ($nc3RoomIds) { + /* @see TopicFramesRoom::saveTopicFramesRoom() */ + /* @see TopicFrameSetting::afterSave() */ + // 指定したルームのみ表示する room_idは配列でセット可能 + // また、TopicFrameSetting::afterSave()からTopicFramesRoom->saveTopicFramesRoom()を呼び出している + $data['TopicFramesRoom'] = [ + 'frame_key' => $frameMap['Frame']['key'], + 'room_id' => $nc3RoomIds + ]; + } + } return $data; } diff --git a/Model/Behavior/Nc2ToNc3UserBaseBehavior.php b/Model/Behavior/Nc2ToNc3UserBaseBehavior.php index be1ed8f..333baab 100644 --- a/Model/Behavior/Nc2ToNc3UserBaseBehavior.php +++ b/Model/Behavior/Nc2ToNc3UserBaseBehavior.php @@ -26,6 +26,16 @@ class Nc2ToNc3UserBaseBehavior extends Nc2ToNc3BaseBehavior { public function getCreatedUser(Model $model, $nc2Data) { return $this->_getCreatedUser($nc2Data); } +/** + * Get Nc3 modified_uer. + * + * @param Model $model Model using this behavior. + * @param array $nc2Data Nc2 data having insert_user_id and insert_user_name + * @return string Nc3 created_uer. + */ + public function getModifiedUser(Model $model, $nc2Data) { + return $this->_getModifiedUser($nc2Data); + } /** * Get map @@ -114,6 +124,53 @@ protected function _getCreatedUser($nc2Data) { ]; $this->_saveMap('User', $idMap); + return $User->id; + } +/** + * Get Nc3 modified_uer. + * + * @param array $nc2Data Nc2 data having update_user_id and update_user_name + * @return string Nc3 updated_user. + */ + protected function _getModifiedUser($nc2Data) { + $nc2UserId = $nc2Data['update_user_id']; + if (!$nc2UserId) { + return null; + } + + $map = $this->_getMap($nc2UserId); + if ($map) { + return $map['User']['id']; + } + + /* @var $User User */ + $User = ClassRegistry::init('Users.User'); + $saveOptions = [ + 'validate' => false, + 'fieldList' => [ + 'handlename', + 'is_deleted', + 'created_user', + 'created', + 'modified_user', + 'modified', + ], + 'callbacks' => false, + ]; + $data = [ + 'User' => [ + 'handlename' => $nc2Data['update_user_name'], + 'is_deleted' => '1', + ] + ]; + $User->create($data); + $User->save($data, $saveOptions); + + $idMap = [ + $nc2UserId => $User->id + ]; + $this->_saveMap('User', $idMap); + return $User->id; } diff --git a/Model/Behavior/Nc2ToNc3WysiwygBehavior.php b/Model/Behavior/Nc2ToNc3WysiwygBehavior.php index 95e830f..f2d1855 100644 --- a/Model/Behavior/Nc2ToNc3WysiwygBehavior.php +++ b/Model/Behavior/Nc2ToNc3WysiwygBehavior.php @@ -53,8 +53,19 @@ public function convertWYSIWYG(Model $model, $content) { $replaces = array_merge($replaces, $strReplaceArguments[1]); } - $content = str_replace($searches, $replaces, $content); + $strReplaceArguments = $this->__getStrReplaceArgumentsOfTex($content); + if ($strReplaceArguments) { + $searches = array_merge($searches, $strReplaceArguments[0]); + $replaces = array_merge($replaces, $strReplaceArguments[1]); + } + + $strReplaceArguments = $this->__getStrReplaceArgumentsOfTable($content); + if ($strReplaceArguments) { + $searches = array_merge($searches, $strReplaceArguments[0]); + $replaces = array_merge($replaces, $strReplaceArguments[1]); + } + $content = str_replace($searches, $replaces, $content); return $content; } @@ -67,6 +78,11 @@ public function convertWYSIWYG(Model $model, $content) { private function __getStrReplaceArgumentsOfDownloadAction($content) { $strReplaceArguments = []; + /* @var $Nc2ToNc3 Nc2ToNc3 */ + $Nc2ToNc3 = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3'); + $nc2BaseUrl = Hash::get($Nc2ToNc3->data, ['Nc2ToNc3', 'base_url']); + $nc2BaseUrl = preg_quote($nc2BaseUrl, '/'); + // save〇〇に渡すデータを、WysiwygBehavior::REPLACE_BASE_URL({{__BASE_URL__}})にすると、 // HTMLPurifierで除去される(詳細箇所については未調査) // なので、WysiwygBehavior::beforeSave で置換される文字列にしとく @@ -74,10 +90,11 @@ private function __getStrReplaceArgumentsOfDownloadAction($content) { //$replace = WysiwygBehavior::REPLACE_BASE_URL . './?action=common_download_main&upload_id='; $replaceUrl = Router::url('/', true); - $pattern = '/(src|href)="\.\/\?action=common_download_main&(?:amp;)?upload_id=(\d+)"/'; + // @see https://regexper.com/#%2F(src%7Chref)%3D%22(http%3A%5C%2F%5C%2Flocalhost%5C%2F%7C%5C.%5C%2F)(%5C%3F%7Cindex%5C.php%5C%3F)action%3Dcommon_download_main%26(%3F%3Aamp%3B)%3Fupload_id%3D(%5Cd%2B)%22%2F + $pattern = '/(src|href)="(' . $nc2BaseUrl . '\/|\.\/)(\?|index\.php\?)action=common_download_main&(?:amp;)?upload_id=(\d+)"/'; preg_match_all($pattern, $content, $matches, PREG_SET_ORDER); foreach ($matches as $match) { - $nc3UploadFile = $this->__saveUploadFileFromNc2($match[2]); + $nc3UploadFile = $this->__saveUploadFileFromNc2($match[4]); if (!$nc3UploadFile) { // エラー処理どうする?とりあえず継続しとく。 continue; @@ -87,14 +104,16 @@ private function __getStrReplaceArgumentsOfDownloadAction($content) { // @see https://github.com/NetCommons3/Wysiwyg/blob/3.1.0/Config/routes.php#L11-L19 $controller = 'file'; $size = ''; + $class = ''; if ($match[1] === 'src') { $controller = 'image'; $size = '/' . $this->__getImageSize($nc3UploadFile); + $class = 'class="img-responsive nc3-img nc3-img-block" '; } $strReplaceArguments[0][] = $match[0]; - $strReplaceArguments[1][] = $match[1] . '="' . + $strReplaceArguments[1][] = $class . $match[1] . '="' . $replaceUrl . 'wysiwyg/' . $controller . '/download' . '/' . $nc3UploadFile['UploadFile']['room_id'] . '/' . $nc3UploadFile['UploadFile']['id'] . @@ -143,6 +162,9 @@ private function __saveUploadFileFromNc2($nc2UploadId) { // @see https://github.com/NetCommons3/Wysiwyg/blob/3.1.0/Controller/WysiwygFileController.php#L88 // @see https://github.com/NetCommons3/Files/blob/3.1.0/Model/UploadFile.php#L260-L263 $CakeFile = new File($fileData['tmp_name']); + // ウィジウィグのNC2アップロード時ファイル名を移行する + $CakeFile->originalName = $nc2Upload['Nc2Upload']['file_name']; + $data = $UploadFile->registByFile($CakeFile, 'wysiwyg', null, 'Wysiwyg.file', $nc3UploadFile); // Room.idを戻す Current::write('Room.id', $contentRoomId); @@ -257,10 +279,11 @@ private function __getStrReplaceArgumentsOfBaseUrlLink($content) { $nc2BaseUrl = preg_quote($nc2BaseUrl, '/'); $replaceBaseUrl = Router::url('/', true); - $pattern = '/href="' . $nc2BaseUrl . '\/(.*?)"/'; + // @see https://regexper.com/#%2Fhref%3D(http%3A%5C%2F%5C%2Flocalhost%5C%2F%7C%5C.%5C%2F)(.*%3F)%22%2F + $pattern = '/href="(' . $nc2BaseUrl . '\/|\.\/)(.*?)"/'; preg_match_all($pattern, $content, $matches, PREG_SET_ORDER); foreach ($matches as $match) { - $replacePath = $match[1]; + $replacePath = $match[2]; preg_match('/page_id=(\d+)/', $replacePath, $pageIdMatches); if ($pageIdMatches) { @@ -342,4 +365,66 @@ private function __getStrReplaceArgumentsOfCabinetFile($content) { return $strReplaceArguments; } +/** + * Get str_replace arguments of TeX. + * + * @param string $content Nc2 content. + * @return array str_replace arguments.(0:$search,1:$replace) + */ + private function __getStrReplaceArgumentsOfTex($content) { + $strReplaceArguments = []; + + $pattern = '//'; + preg_match_all($pattern, $content, $matches, PREG_SET_ORDER); + foreach ($matches as $match) { + $strReplaceArguments[0][] = $match[0]; + + $texValue = str_replace("%_", "%", $match[1]); + $texValue = rawurldecode($texValue); + + $strReplaceArguments[1][] = + '' . + '$$' . $texValue . '$$' . + ''; + } + + return $strReplaceArguments; + } + +/** + * Get str_replace arguments of Table. + * + * @param string $content Nc2 content. + * @return array str_replace arguments.(0:$search,1:$replace) + */ + private function __getStrReplaceArgumentsOfTable($content) { + $strReplaceArguments = []; + + // のstyleをclassに置き換え + $patterns[] = [ + 'pattern' => '//', + 'replace' => 'class="table table-bordered table-responsive"' + ]; + //
のstyle消す + // $patterns[] = [ + // 'pattern' => '//', + // 'replace' => '' + // ]; + // $patterns[] = [ + // 'pattern' => '//', + // 'replace' => '' + // ]; + foreach ($patterns as $pattern) { + preg_match_all($pattern['pattern'], $content, $matches, PREG_SET_ORDER); + foreach ($matches as $match) { + + $replaceTable = str_replace($match[1], $pattern['replace'], $match[0]); + $strReplaceArguments[0][] = $match[0]; + $strReplaceArguments[1][] = $replaceTable; + } + } + + return $strReplaceArguments; + } + } diff --git a/Model/Nc2ToNc3.php b/Model/Nc2ToNc3.php index 36a68bc..2cfacf0 100644 --- a/Model/Nc2ToNc3.php +++ b/Model/Nc2ToNc3.php @@ -74,7 +74,7 @@ class Nc2ToNc3 extends Nc2ToNc3AppModel { * @see Model::save() */ public function beforeValidate($options = array()) { - $this->validate = Hash::merge( + $this->validate = ValidateMerge::merge( $this->validate, [ 'database' => [ @@ -239,6 +239,7 @@ public function migration($data) { 'Nc2ToNc3Room', 'Nc2ToNc3Page', 'Nc2ToNc3Frame', + 'Nc2ToNc3AccessCounter', 'Nc2ToNc3Announcement', 'Nc2ToNc3Bbs', 'Nc2ToNc3Blog', @@ -263,6 +264,12 @@ public function migration($data) { ]; $excludePlugins = explode(',', $this->data['Nc2ToNc3']['exclude']); foreach ($migrationModelNames as $migrationModelName) { + //前回処理のプラグインのデータが残存することを防ぐ + $Block = ClassRegistry::init('Blocks.Block'); + $Frame = ClassRegistry::init('Frames.Frame'); + $Block->clear(); + $Frame->clear(); + if (in_array(substr($migrationModelName, 8), $excludePlugins, true)) { continue; } diff --git a/Model/Nc2ToNc3AccessCounter.php b/Model/Nc2ToNc3AccessCounter.php new file mode 100644 index 0000000..ff70c13 --- /dev/null +++ b/Model/Nc2ToNc3AccessCounter.php @@ -0,0 +1,330 @@ + + * @link http://www.netcommons.org NetCommons Project + * @license http://www.netcommons.org/license.txt NetCommons License + */ + +App::uses('Nc2ToNc3AppModel', 'Nc2ToNc3.Model'); +App::uses('Current', 'NetCommons.Utility'); + +/** + * Nc2ToNc3AccessCounter + * + * @see Nc2ToNc3BaseBehavior + * @method void writeMigrationLog($message) + * @method Model getNc2Model($tableName) + * @method string getLanguageIdFromNc2() + * @method string convertDate($date) + * @method string convertLanguage($langDirName) + * @method array saveMap($modelName, $idMap) + * @method array getMap($nc2Id) + * @method void changeNc3CurrentLanguage($langDirName = null) + * @method void restoreNc3CurrentLanguage() + * + */ +class Nc2ToNc3AccessCounter extends Nc2ToNc3AppModel { + +/** + * Custom database table name, or null/false if no table association is desired. + * + * @var string + * @link http://book.cakephp.org/2.0/en/models/model-attributes.html#usetable + */ + public $useTable = false; + +/** + * List of behaviors to load when the model object is initialized. Settings can be + * passed to behaviors by using the behavior name as index. + * + * @var array + * @link http://book.cakephp.org/2.0/en/models/behaviors.html#using-behaviors + */ + public $actsAs = [ + 'Nc2ToNc3.Nc2ToNc3Base' + ]; + +/** + * Migration method. + * + * @return bool True on success. + */ + public function migrate() { + $this->writeMigrationLog(__d('nc2_to_nc3', 'AccessCounter Migration start.')); + + /* @var $Nc2Counter AppModel */ + $Nc2Counter = $this->getNc2Model('counter'); + $nc2Counters = $Nc2Counter->find('all'); + if (!$this->__saveAccessCounterFromNc2($nc2Counters)) { + return false; + } + + $this->writeMigrationLog(__d('nc2_to_nc3', 'AccessCounter Migration end.')); + return true; + } + +/** + * Save AccessCounter from Nc2. + * + * @param array $nc2Counters Nc2Counter data. + * @return bool True on success + * @throws Exception + */ + private function __saveAccessCounterFromNc2($nc2Counters) { + $this->writeMigrationLog(__d('nc2_to_nc3', ' AccessCounter data Migration start.')); + + /* @var $AccessCounter AccessCounter */ + /* @var $CounterFrameSetting AccessCounterFrameSetting */ + $AccessCounter = ClassRegistry::init('AccessCounters.AccessCounter'); + $CounterFrameSetting = ClassRegistry::init('AccessCounters.AccessCounterFrameSetting'); + $Frame = ClassRegistry::init('Frames.Frame'); + + //BlockBehaviorがシングルトンで利用されるため、BlockBehavior::settingsを初期化 + //@see https://github.com/cakephp/cakephp/blob/2.9.6/lib/Cake/Model/BehaviorCollection.php#L128-L133 + //@see https://github.com/NetCommons3/AccessCounters/blob/3.1.3/Model/AccessCounter.php#L35 + $AccessCounter->Behaviors->Block->settings = []; + + $Nc2ToNc3Frame = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Frame'); + $Block = ClassRegistry::init('Blocks.Block'); + $BlocksLanguage = ClassRegistry::init('Blocks.BlocksLanguage'); + foreach ($nc2Counters as $nc2Counter) { + $AccessCounter->begin(); + + $nc2Blockld = $nc2Counter['Nc2Counter']['block_id']; + $nc3Frame = $Nc2ToNc3Frame->getMap($nc2Blockld); + if (!$nc3Frame) { + $AccessCounter->rollback(); + continue; + } + + $data = $this->__generateNc3AccessCounterData($nc2Counter, $nc3Frame); + if (!$data) { + $AccessCounter->rollback(); + continue; + } + + //AccessCounter テーブルの移行を実施。SAVE前にCurrentのデータを書き換えが必要なため + $nc3RoomId = $nc3Frame['Frame']['room_id']; + Current::write('Plugin.key', 'access_counters'); + Current::write('Room.id', $nc3RoomId); + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + + // Model::idを初期化しないとUpdateになってしまう。 + $AccessCounter->create(); + $Block->create(); + $BlocksLanguage->create(); + + if (!$AccessCounter->saveAccessCounter($data)) { + // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、 ここでrollback + $AccessCounter->rollback(); + + $message = $this->getLogArgument($nc2Counter) . "\n" . + var_export($AccessCounter->validationErrors, true); + $this->writeMigrationLog($message); + + $AccessCounter->rollback(); + continue; + } + + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + + $data = $this->__generateNc3AccessCounterFrameSettingData($nc2Counter, $nc3Frame, $AccessCounter->id); + $CounterFrameSetting->create(); + if (!$CounterFrameSetting->saveAccessCounterFrameSetting($data)) { + // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、ここでrollback + $AccessCounter->rollback(); + + $message = $this->getLogArgument($nc2Counter) . "\n" . + var_export($CounterFrameSetting->validationErrors, true); + $this->writeMigrationLog($message); + + $AccessCounter->rollback(); + continue; + } + + if (!$Frame->saveFrame($data)) { + $message = $this->getLogArgument($nc2Counter) . "\n" . + var_export($Frame->validationErrors, true); + $this->writeMigrationLog($message); + + $AccessCounter->rollback(); + continue; + } + + $idMap = [ + $nc2Blockld => $AccessCounter->id + ]; + $this->saveMap('AccessCounter', $idMap); + + $AccessCounter->commit(); + } + + Current::remove('Room.id'); + Current::remove('Plugin.key'); + + $this->writeMigrationLog(__d('nc2_to_nc3', ' AccessCounter data Migration end.')); + return true; + } + +/** + * Generate AccessCounter data. + * + * @param array $nc2Counter Nc2Counter data. + * @param array $nc3Frame Nc3Frame data. + * @return bool True on success + */ + private function __generateNc3AccessCounterData($nc2Counter, $nc3Frame) { + /* @var $Nc2ToNc3User Nc2ToNc3User */ + $Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); + + // Nc2Counterのshow_char_before,show_char_after,commentの優先順位でBlocksLanguage.nameとする。 + // すべてなければCounter + $nc3BlockName = $nc2Counter['Nc2Counter']['show_char_before']; + if (!strlen($nc3BlockName)) { + $nc3BlockName = $nc2Counter['Nc2Counter']['show_char_after']; + } + if (!strlen($nc3BlockName)) { + $nc3BlockName = $nc2Counter['Nc2Counter']['comment']; + } + if (!strlen($nc3BlockName)) { + $nc3BlockName = 'Counter'; + } + + $data = [ + 'AccessCounter' => [ + 'count' => $nc2Counter['Nc2Counter']['counter_num'], + 'created_user' => $Nc2ToNc3User->getCreatedUser($nc2Counter['Nc2Counter']), + 'created' => $this->convertDate($nc2Counter['Nc2Counter']['insert_time']), + ], + 'Block' => [ + 'room_id' => $nc3Frame['Frame']['room_id'], + 'plugin_key' => 'access_counters' + ], + 'BlocksLanguage' => [ + 'name' => $nc3BlockName, + ], + 'Frame' => [ + 'id' => $nc3Frame['Frame']['id'] + ] + ]; + + $data = $this->__mergeExistData($nc2Counter, $data); + + return $data; + } + +/** + * Generate AccessCounterFrameSetting data. + * + * @param array $nc2Counter Nc2Counter data. + * @param array $nc3Frame Nc3Frame data. + * @param string $nc3AccessCounterId Nc3AccessCounter id. + * @return bool True on success + */ + private function __generateNc3AccessCounterFrameSettingData($nc2Counter, $nc3Frame, $nc3AccessCounterId) { + /* @var $Nc2ToNc3User Nc2ToNc3User */ + $Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); + + $data['AccessCounterFrameSetting'] = [ + 'frame_key' => $nc3Frame['Frame']['key'], + 'display_type' => '1', // 対応できなのでとりあえず1 + 'display_digit' => $nc2Counter['Nc2Counter']['counter_digit'], + 'created_user' => $Nc2ToNc3User->getCreatedUser($nc2Counter['Nc2Counter']), + 'created' => $this->convertDate($nc2Counter['Nc2Counter']['insert_time']), + ]; + + /* @var $AccessCounter AccessCounter */ + $AccessCounter = ClassRegistry::init('AccessCounters.AccessCounter'); + $nc3AccessCounter = $AccessCounter->findById($nc3AccessCounterId, 'Block.id', null, 0); + $data['Frame'] = [ + 'id' => $nc3Frame['Frame']['id'], + 'plugin_key' => 'access_counters', + 'block_id' => Hash::get($nc3AccessCounter, ['Block', 'id']), + ]; + + return $data; + } + +/** + * Get Log argument. + * + * @param array $nc2Counter Nc2Counter data + * @return string Log argument + */ + public function getLogArgument($nc2Counter) { + return 'Nc2Counter ' . + 'block_id:' . $nc2Counter['Nc2Counter']['block_id']; + } + +/** + * Merge exist data + * + * @param array $nc2Counter Nc2Counter data. + * @param array $nc3AccessCounter Nc3AccessCounter data. + * @return array Merge exist data. + */ + private function __mergeExistData($nc2Counter, $nc3AccessCounter) { + $AccessCounterMap = $this->__getMap($nc2Counter['Nc2Counter']['block_id']); + if ($AccessCounterMap) { + // 移行済み + return []; + + // Debug用 + /* + //$nc3AccessCounter['AccessCounter']['id'] = $AccessCounterMap['AccessCounter']['id']; + $nc3AccessCounter['AccessCounter']['block_key'] = $AccessCounterMap['AccessCounter']['block_key']; + + $nc3AccessCounter['Block']['id'] = $AccessCounterMap['AccessCounter']['block_id']; + $nc3AccessCounter['Block']['key'] = $AccessCounterMap['AccessCounter']['block_key']; + */ + } + + return $nc3AccessCounter; + } + +/** + * Get map + * + * @param array|string $nc2Blocklds Nc2Counter block_id. + * @return array Map data with Nc2Counter block_id as key. + */ + private function __getMap($nc2Blocklds) { + /* @var $Nc2ToNc3Map Nc2ToNc3Map */ + /* @var $AccessCounter AccessCounter */ + $Nc2ToNc3Map = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Map'); + $AccessCounter = ClassRegistry::init('AccessCounters.AccessCounter'); + + $mapIdList = $Nc2ToNc3Map->getMapIdList('AccessCounter', $nc2Blocklds); + $query = [ + 'fields' => [ + 'AccessCounter.id', + 'AccessCounter.block_key', + ], + 'conditions' => [ + 'AccessCounter.id' => $mapIdList + ], + 'recursive' => -1, + ]; + $nc3AccessCounters = $AccessCounter->find('all', $query); + if (!$nc3AccessCounters) { + return $nc3AccessCounters; + } + + $map = []; + foreach ($nc3AccessCounters as $nc3AccessCounter) { + $nc2Id = array_search($nc3AccessCounter['AccessCounter']['id'], $mapIdList); + $map[$nc2Id] = $nc3AccessCounter; + } + + if (is_string($nc2Blocklds)) { + $map = $map[$nc2Blocklds]; + } + + return $map; + } + +} + diff --git a/Model/Nc2ToNc3Announcement.php b/Model/Nc2ToNc3Announcement.php index bfde432..92d1b20 100644 --- a/Model/Nc2ToNc3Announcement.php +++ b/Model/Nc2ToNc3Announcement.php @@ -120,7 +120,7 @@ public function migrate() { //Announcement テーブルの移行を実施。AVE前にCurrentのデータを書き換えが必要なため Current::write('Plugin.key', 'announcements'); Current::write('Room.id', $nc3RoomId); - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; // Model::idを初期化しないとUpdateになってしまう。 $Announcement->create(); @@ -139,7 +139,7 @@ public function migrate() { continue; } - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $idMap = [ $nc2Blockld => $Announcement->id diff --git a/Model/Nc2ToNc3Bbs.php b/Model/Nc2ToNc3Bbs.php index d733df7..2d057e6 100644 --- a/Model/Nc2ToNc3Bbs.php +++ b/Model/Nc2ToNc3Bbs.php @@ -119,16 +119,33 @@ private function __saveNc3BbsFromNc2($nc2Bbses) { $Block = ClassRegistry::init('Blocks.Block'); $Topic = ClassRegistry::init('Topics.Topic'); + /* @see Nc2ToNc3Map::getMapIdList() */ + $Nc2ToNc3Map = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Map'); + $mapRoomIdList = $Nc2ToNc3Map->getMapIdList('Room'); + foreach ($nc2Bbses as $nc2Bbs) { //var_dump($nc2Bbs);exit; /** @var array $nc2BbsBlock */ $nc2BbsBlock = $Nc2BbsBlock->findByBbsId($nc2Bbs['Nc2Bb']['bbs_id'], null, null, -1); - if (!$nc2BbsBlock) { - continue; - } + // nc2配置してなくても移行する + //if (!$nc2BbsBlock) { + // continue; + //} $Bbs->begin(); try { - $data = $this->generateNc3BbsData($nc2Bbs, $nc2BbsBlock); + $nc2RoomId = $nc2Bbs['Nc2Bb']['room_id']; + // nc3 room_id取得 + if (! isset($mapRoomIdList[$nc2RoomId])) { + // 基本ありえない想定 + $message = __d('nc2_to_nc3', '%s No room ID corresponding to nc3', + 'nc2_room_id:' . $nc2RoomId); + $this->writeMigrationLog($message); + $Bbs->rollback(); + continue; + } + $nc3RoomId = $mapRoomIdList[$nc2RoomId]; + + $data = $this->generateNc3BbsData($nc2Bbs, $nc2BbsBlock, $nc3RoomId); if (!$data) { $Bbs->rollback(); continue; @@ -141,7 +158,7 @@ private function __saveNc3BbsFromNc2($nc2Bbses) { $nc3Room = $Nc2ToNc3Room->getMap($nc2Bbs['Nc2Bb']['room_id']); $nc3RoomId = $nc3Room['Room']['id']; Current::write('Room.id', $nc3RoomId); - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; $BlocksLanguage->create(); $Bbs->create(); @@ -164,7 +181,7 @@ private function __saveNc3BbsFromNc2($nc2Bbses) { continue; } - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2BbsId = $nc2Bbs['Nc2Bb']['bbs_id']; $idMap = [ @@ -215,6 +232,7 @@ private function __saveNc3BbsArticleFromNc2($nc2BbsPosts) { $Block = ClassRegistry::init('Blocks.Block'); $Topic = ClassRegistry::init('Topics.Topic'); $BbsArticleTree = ClassRegistry::init('Bbses.BbsArticleTree'); + $Like = ClassRegistry::init('Likes.Like'); foreach ($nc2BbsPosts as $nc2BbsPost) { @@ -227,10 +245,12 @@ private function __saveNc3BbsArticleFromNc2($nc2BbsPosts) { continue; } - $Block = ClassRegistry::init('Blocks.Block'); $Blocks = $Block->findById($data['Block']['id'], null, null, -1); $nc3RoomId = $Blocks['Block']['room_id']; + // @see https://github.com/NetCommons3/Topics/blob/3.1.0/Model/Behavior/TopicsBaseBehavior.php#L365 + Current::write('Block.id', $data['Block']['id']); + Current::write('Room.id', $nc3RoomId); $BlocksLanguage->create(); @@ -241,7 +261,7 @@ private function __saveNc3BbsArticleFromNc2($nc2BbsPosts) { $Block->create(); $Topic->create(); - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; // Hash::merge で BbsArticle::validate['publish_start']['datetime']['rule']が // ['datetime','datetime'] になってしまうので初期化 @@ -249,9 +269,7 @@ private function __saveNc3BbsArticleFromNc2($nc2BbsPosts) { $BbsArticle->validate = []; $BbsArticleTree->validate = []; - //error_log(print_r('dddddddddddddddddddddddddddddddddddd', true)."\n\n", 3, LOGS."/debug.log"); - - if (!$BbsArticle->saveBbsArticle($data)) { + if (!($nc3BbsArticle = $BbsArticle->saveBbsArticle($data))) { // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、 // ここでrollback $BbsArticle->rollback(); @@ -265,8 +283,13 @@ private function __saveNc3BbsArticleFromNc2($nc2BbsPosts) { $BbsArticle->rollback(); continue; } + if (isset($data['Like'])) { + $data['Like']['content_key'] = $nc3BbsArticle['BbsArticle']['key']; + $Like->create(); + $Like->save($data); + } - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2PostId = $nc2BbsPost['Nc2BbsPost']['post_id']; $idMap = [ @@ -283,6 +306,7 @@ private function __saveNc3BbsArticleFromNc2($nc2BbsPosts) { } } + Current::remove('Block.id'); Current::remove('Room.id'); Current::remove('Plugin.key'); @@ -365,4 +389,4 @@ private function __saveNc3BbsFrameSettingFromNc2($nc2BbsBlocks) { return true; } -} \ No newline at end of file +} diff --git a/Model/Nc2ToNc3Blog.php b/Model/Nc2ToNc3Blog.php index aef0a98..e27969f 100644 --- a/Model/Nc2ToNc3Blog.php +++ b/Model/Nc2ToNc3Blog.php @@ -141,7 +141,7 @@ private function __saveNc3BlogFromNc2($nc2Journals) { // いる? $nc3RoomId = $data['Block']['room_id']; Current::write('Room.id', $nc3RoomId); - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; $BlocksLanguage->create(); $Blog->create(); @@ -161,7 +161,7 @@ private function __saveNc3BlogFromNc2($nc2Journals) { continue; } - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2JournalId = $nc2Journal['Nc2Journal']['journal_id']; $idMap = [ @@ -298,6 +298,7 @@ private function __saveNc3BlogEntryFromNc2($nc2JournalPosts) { $BlocksLanguage = ClassRegistry::init('Blocks.BlocksLanguage'); $Block = ClassRegistry::init('Blocks.Block'); $Topic = ClassRegistry::init('Topics.Topic'); + $Like = ClassRegistry::init('Likes.Like'); foreach ($nc2JournalPosts as $nc2JournalPost) { $BlogEntry->begin(); @@ -326,14 +327,14 @@ private function __saveNc3BlogEntryFromNc2($nc2JournalPosts) { // @see https://github.com/NetCommons3/Workflow/blob/3.1.0/Model/Behavior/WorkflowBehavior.php#L171-L175 $nc3Status = $data['BlogEntry']['status']; - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = ($nc3Status != 2); + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = ($nc3Status != 2); // Hash::merge で BlogEntry::validate['publish_start']['datetime']['rule']が // ['datetime','datetime'] になってしまうので初期化 // @see https://github.com/NetCommons3/Blogs/blob/3.1.0/Model/BlogEntry.php#L138-L141 $BlogEntry->validate = []; - if (!$BlogEntry->saveEntry($data)) { + if (!($nc3BlogEntry = $BlogEntry->saveEntry($data))) { // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、 // ここでrollback $BlogEntry->rollback(); @@ -348,8 +349,13 @@ private function __saveNc3BlogEntryFromNc2($nc2JournalPosts) { $BlogEntry->rollback(); continue; } + if (isset($data['Like'])) { + $data['Like']['content_key'] = $nc3BlogEntry['BlogEntry']['key']; + $Like->create(); + $Like->save($data); + } - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2PostId = $nc2JournalPost['Nc2JournalPost']['post_id']; $idMap = [ @@ -407,7 +413,7 @@ private function __saveNc3ContentCommentFromNc2($nc2JournalPosts) { // @see https://github.com/NetCommons3/Workflow/blob/3.1.0/Model/Behavior/WorkflowBehavior.php#L171-L175 Current::write('Room.id', $nc3RoomId); - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = ($nc3Status != 2); + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = ($nc3Status != 2); $ContentComment->create(); // 一応Model::validatの初期化 @@ -424,7 +430,7 @@ private function __saveNc3ContentCommentFromNc2($nc2JournalPosts) { continue; } - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2PostId = $nc2JournalPost['Nc2JournalPost']['post_id']; $idMap = [ @@ -456,4 +462,4 @@ private function __saveNc3ContentCommentFromNc2($nc2JournalPosts) { return true; } -} \ No newline at end of file +} diff --git a/Model/Nc2ToNc3Cabinet.php b/Model/Nc2ToNc3Cabinet.php index cebf81f..26977ce 100644 --- a/Model/Nc2ToNc3Cabinet.php +++ b/Model/Nc2ToNc3Cabinet.php @@ -139,7 +139,7 @@ private function __saveNc3CabinetFromNc2($nc2CabinetManages) { $Cabinet->create(); $Block->create(); - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; //error_log(print_r($data, true)."\n\n", 3, LOGS."/debug.log"); if (!$Cabinet->saveCabinet($data)) { @@ -158,7 +158,7 @@ private function __saveNc3CabinetFromNc2($nc2CabinetManages) { continue; } - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2CabinetId = $nc2CabinetManage['Nc2CabinetManage']['cabinet_id']; @@ -207,6 +207,7 @@ private function __saveNc3CabinetFileNc2($nc2CabinetFiles) { $BlocksLanguage = ClassRegistry::init('Blocks.BlocksLanguage'); $Block = ClassRegistry::init('Blocks.Block'); $Topic = ClassRegistry::init('Topics.Topic'); + $UploadFile = ClassRegistry::init('Files.UploadFile'); foreach ($nc2CabinetFiles as $nc2CabinetFile) { @@ -226,13 +227,13 @@ private function __saveNc3CabinetFileNc2($nc2CabinetFiles) { $nc3RoomId = $Blocks['Block']['room_id']; Current::write('Plugin.key', 'cabinets'); Current::write('Room.id', $nc3RoomId); - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; $BlocksLanguage->create(); $CabinetFile->create(); $Block->create(); $Topic->create(); - if (!$CabinetFile->saveFile($data)) { + if (!($nc3CabinetFile = $CabinetFile->saveFile($data))) { // print_rはPHPMD.DevelopmentCodeFragmentに引っかかった。 // var_exportは大丈夫らしい。。。 // @see https://phpmd.org/rules/design.html @@ -243,8 +244,25 @@ private function __saveNc3CabinetFileNc2($nc2CabinetFiles) { $CabinetFile->rollback(); continue; } + // php7のコードをphp5系に修正 + //$downloadCount = intval($data['DownloadCount'] ?? 0); + $downloadCount = isset($data['DownloadCount']) ? intval($data['DownloadCount']) : 0; + if ($downloadCount) { + // DownloadCount更新 + $file = $UploadFile->find('first', [ + 'conditions' => [ + 'plugin_key' => 'cabinets', + 'content_key' => $nc3CabinetFile['CabinetFile']['key'], + 'field_name' => 'file', + ] + ]); + $file['UploadFile']['download_count'] = $downloadCount; + $file['UploadFile']['total_download_count'] = $downloadCount; + $UploadFile->create(); + $UploadFile->save($file, false, false); + } - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2CabinetFileId = $nc2CabinetFile['Nc2CabinetFile']['file_id']; @@ -353,4 +371,4 @@ private function __saveFrameFromNc2($nc2CabinetBlocks) { return true; } -} \ No newline at end of file +} diff --git a/Model/Nc2ToNc3Calendar.php b/Model/Nc2ToNc3Calendar.php index 761e41c..223a887 100644 --- a/Model/Nc2ToNc3Calendar.php +++ b/Model/Nc2ToNc3Calendar.php @@ -235,7 +235,6 @@ private function __saveCalendarEventFromNc2($nc2CalendarPlans) { // @see https://github.com/NetCommons3/Calendars/blob/3.1.0/Utility/CalendarPermissiveRooms.php#L195 // @see https://github.com/NetCommons3/Calendars/blob/3.1.0/Controller/CalendarPlansController.php#L145-L147 // @see https://github.com/NetCommons3/Calendars/blob/3.1.0/Model/CalendarEvent.php#L313 - $CalendarEvent->initSetting(new WorkflowComponent(new ComponentCollection())); CalendarPermissiveRooms::setRoomPermRoles($CalendarEvent->prepareCalRoleAndPerm()); // @see https://github.com/NetCommons3/Topics/blob/3.1.0/Model/Behavior/TopicsBaseBehavior.php#L347 @@ -243,15 +242,6 @@ private function __saveCalendarEventFromNc2($nc2CalendarPlans) { /* @var $CalendarActionPlan CalendarActionPlan */ $CalendarActionPlan = ClassRegistry::init('Calendars.CalendarActionPlan'); - - // コード補完のため、@var宣言すると、PHPMDで coupling between objects に引っかかる(1クラスにオブジェクト参照は13個までらしい)。 - // PHPMDのどのルールかは不明。なので、コメントにしとく - ///* @var $Block Block */ - /* @var $CalendarActionPlan CalendarActionPlan */ - /* @var $CalendarEvent CalendarEvent */ - $CalendarActionPlan = ClassRegistry::init('Calendars.CalendarActionPlan'); - $CalendarEvent = ClassRegistry::init('Calendars.CalendarEvent'); - $Block = ClassRegistry::init('Blocks.Block'); foreach ($nc2CalendarPlans as $nc2CalendarPlan) { $CalendarActionPlan->begin(); try { @@ -261,32 +251,21 @@ private function __saveCalendarEventFromNc2($nc2CalendarPlans) { continue; } + // Blockデータ作成処理が追加されたので呼び出す + // https://github.com/NetCommons3/Calendars/commit/50d9fb10c624220778aab773186973b3bae1ecea + $data = $CalendarActionPlan->Calendar->prepareBlockWithoutFrame($data); + // 予定登録処理で使用しているデータをセット // データの有無しか使ってないっっぽいけど、一応予定のroom_idから取得したblock_idをセット // @see https://github.com/NetCommons3/Calendars/blob/3.1.0/Model/CalendarActionPlan.php#L545 // @see https://github.com/NetCommons3/Calendars/blob/3.1.0/Model/Calendar.php#L153-L155 // @see https://github.com/NetCommons3/Calendars/blob/3.1.0/Model/Behavior/CalendarInsertPlanBehavior.php#L97 - $nc3RoomId = $data['CalendarActionPlan']['plan_room_id']; - $nc3Block = $Block->findByRoomIdAndPluginKey( - $nc3RoomId, - 'calendars', - [ - 'id', - 'key', - ], - null, - -1 - ); - - Current::write('Frame.block_id', $nc3Block['Block']['id']); + $nc3RoomId = $data['Block']['room_id']; + Current::write('Frame.block_id', $data['Block']['id']); Current::write('Frame.room_id', $nc3RoomId); Current::write('Frame.plugin_key', 'calendars'); Current::write('Room.id', $nc3RoomId); - // Block.keyは、配置してあるルームのブロックっぽいが、Nc2CalendarPlanから配置場所がたどれないため、予定のroom_idのブロックを設定しとく - $data['Block']['id'] = $nc3Block['Block']['id']; - $data['Block']['key'] = $nc3Block['Block']['key']; - // Validation で throw されるため、事前にチェック $validationData = $CalendarActionPlan->convertToPlanParamFormat($data); if (!$CalendarEvent->checkMaxMinDate([$validationData['start_date']], 'start') || diff --git a/Model/Nc2ToNc3CircularNotice.php b/Model/Nc2ToNc3CircularNotice.php index b1e318c..81ca176 100644 --- a/Model/Nc2ToNc3CircularNotice.php +++ b/Model/Nc2ToNc3CircularNotice.php @@ -43,7 +43,10 @@ class Nc2ToNc3CircularNotice extends Nc2ToNc3AppModel { * @var array * @link http://book.cakephp.org/2.0/en/models/behaviors.html#using-behaviors */ - public $actsAs = ['Nc2ToNc3.Nc2ToNc3CircularNotice']; + public $actsAs = [ + 'Nc2ToNc3.Nc2ToNc3CircularNotice', + 'Nc2ToNc3.Nc2ToNc3Wysiwyg', + ]; /** * Migration method. @@ -53,6 +56,14 @@ class Nc2ToNc3CircularNotice extends Nc2ToNc3AppModel { public function migrate() { $this->writeMigrationLog(__d('nc2_to_nc3', 'CircularNotice Migration start.')); + /* @var $Nc2ToNc3Plugin Nc2ToNc3Plugin */ + $Nc2ToNc3Plugin = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Plugin'); + $pluginMap = $Nc2ToNc3Plugin->getMap(); + if (!Hash::extract($pluginMap, '{n}.Plugin[key=circular_notices]')) { + $this->writeMigrationLog(__d('nc2_to_nc3', 'CircularNotice is not installed.')); + return true; + } + /* @var $Nc2CircularBlock AppModel */ $Nc2CircularBlock = $this->getNc2Model('circular_block'); $nc2CircularBlocks = $Nc2CircularBlock->find('all'); @@ -124,7 +135,7 @@ private function __saveNc3CircularNoticeFrameSettingFromNc2($nc2CircularBlocks) //$Nc2ToNc3Room = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Room'); $nc3RoomId = $data['Block']['room_id']; Current::write('Room.id', $nc3RoomId); - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; Current::write('Plugin.key', 'circular_notices'); $BlocksLanguage->create(); @@ -146,7 +157,7 @@ private function __saveNc3CircularNoticeFrameSettingFromNc2($nc2CircularBlocks) continue; } - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2CircularBlockId = $nc2CircularBlock['Nc2CircularBlock']['block_id']; $idMap = []; @@ -227,7 +238,7 @@ private function __saveNc3CircularNoticeContentFromNc2($nc2Circulars) { $Block->create(); $Topic->create(); - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; // Hash::merge で BlogEntry::validate['publish_start']['datetime']['rule']が // ['datetime','datetime'] になってしまうので初期化 @@ -250,7 +261,7 @@ private function __saveNc3CircularNoticeContentFromNc2($nc2Circulars) { continue; } - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2CircularId = $nc2Circular['Nc2Circular']['circular_id']; $idMap = [ @@ -273,4 +284,4 @@ private function __saveNc3CircularNoticeContentFromNc2($nc2Circulars) { return true; } -} \ No newline at end of file +} diff --git a/Model/Nc2ToNc3Faq.php b/Model/Nc2ToNc3Faq.php index 36ee676..2b55188 100644 --- a/Model/Nc2ToNc3Faq.php +++ b/Model/Nc2ToNc3Faq.php @@ -30,6 +30,7 @@ * @method array generateNc3FaqQuestionData($nc3Faq, $nc2Question) * @method array generateNc3FaqFrameSettingData($nc2FaqBlock) * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class Nc2ToNc3Faq extends Nc2ToNc3AppModel { @@ -61,6 +62,14 @@ class Nc2ToNc3Faq extends Nc2ToNc3AppModel { public function migrate() { $this->writeMigrationLog(__d('nc2_to_nc3', 'Faq Migration start.')); + /* @var $Nc2ToNc3Plugin Nc2ToNc3Plugin */ + $Nc2ToNc3Plugin = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Plugin'); + $pluginMap = $Nc2ToNc3Plugin->getMap(); + if (!Hash::extract($pluginMap, '{n}.Plugin[key=faqs]')) { + $this->writeMigrationLog(__d('nc2_to_nc3', 'Faq is not installed.')); + return true; + } + /* @var $Nc2Faq AppModel */ $Nc2Faq = $this->getNc2Model('faq'); $nc2Faqs = $Nc2Faq->find('all'); @@ -165,7 +174,7 @@ private function __saveFaqFromNc2($nc2Faqs) { // 登録処理で使用しているデータを空に戻す $nc3RoomId = $frameMap['Frame']['room_id']; - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2FaqId = $nc2Faq['Nc2Faq']['faq_id']; $idMap = [ @@ -237,7 +246,7 @@ private function __saveFaqQuestionFromNc2($nc2Questions) { $nc3RoomId = $mapIdList[$nc2RoomId]; // @see https://github.com/NetCommons3/Workflow/blob/3.1.0/Model/Behavior/WorkflowBehavior.php#L171-L175 Current::write('Room.id', $nc3RoomId); - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; // 一応Model::validatの初期化 $FaqQuestion->validate = []; @@ -255,7 +264,7 @@ private function __saveFaqQuestionFromNc2($nc2Questions) { continue; } - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2FaqQuestionId = $nc2Question['Nc2FaqQuestion']['question_id']; $idMap = [ diff --git a/Model/Nc2ToNc3Frame.php b/Model/Nc2ToNc3Frame.php index 2cc2e39..d20098a 100644 --- a/Model/Nc2ToNc3Frame.php +++ b/Model/Nc2ToNc3Frame.php @@ -84,8 +84,12 @@ private function __saveFrameFromNc2WhileDividing() { $query = [ 'conditions' => [ 'Nc2Block.module_id !=' => '0', - // デフォルトのNc2Blockデータ(お知らせ3つ)、メニュー、imagineは移行しない方が良いと思う。 - 'Nc2Block.block_id >' => '5' + 'or' => [ + // デフォルトのメニュー、imagineは移行しない方が良いと思う。 + 'Nc2Block.block_id >' => '5', + // Nc2Blockデータ(お知らせ3つ = block_id:1 ヘッダーのNCロゴ、block_id:2 検索リンク、block_id:3 welcometo)は書き換えて再利用しているパターンがあるため移行する + 'Nc2Block.block_id' => ['1', '2', '3'] + ] ], // Nc2Block.parent_idから再帰処理するのと同じ結果になると思う。 // Frame::saveFrame で 追加時は一番上に配置する処理があるため、どうするのが良いのか? @@ -134,8 +138,10 @@ private function __saveFrameFromNc2WhileDividing() { private function __saveFrameFromNc2($nc2Blocks) { /* @var $Frame Frame */ /* @var $Room Room */ + /* @var $Block Block */ $Frame = ClassRegistry::init('Frames.Frame'); $Room = ClassRegistry::init('Rooms.Room'); + $Block = ClassRegistry::init('Blocks.Block'); //$this->saveExistingMap($nc2Blocks); $nc3CurrentRoom = null; @@ -161,6 +167,9 @@ private function __saveFrameFromNc2($nc2Blocks) { } $nc3Room = $Room->findById($data['Frame']['room_id'], null, null, -1); Current::write('Room', $nc3Room['Room']); + // @see https://github.com/NetCommons3/Questionnaires/blob/3.1.3/Model/Questionnaire.php#L442 + // @see https://github.com/NetCommons3/Questionnaires/blob/3.1.3/Model/QuestionnaireSetting.php#L138-L141 + $Block->create(false); $Frame->create(false); if (!($data = $Frame->saveFrame($data))) { @@ -275,4 +284,4 @@ private function __generateNc3Data($nc2Block) { return $data; } -} \ No newline at end of file +} diff --git a/Model/Nc2ToNc3Iframe.php b/Model/Nc2ToNc3Iframe.php index 278392e..b463ec2 100644 --- a/Model/Nc2ToNc3Iframe.php +++ b/Model/Nc2ToNc3Iframe.php @@ -106,7 +106,7 @@ private function __saveIframeFromNc2($nc2Iframes) { $Iframe->rollback(); continue; } - + $this->writeCurrent($frameMap, 'iframes'); $Frame->create(); @@ -145,7 +145,7 @@ private function __saveIframeFromNc2($nc2Iframes) { // 登録処理で使用しているデータを空に戻す $nc3RoomId = $frameMap['Frame']['room_id']; - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2IframeId = $nc2Iframe['Nc2Iframe']['block_id']; $idMap = [ diff --git a/Model/Nc2ToNc3Link.php b/Model/Nc2ToNc3Link.php index a38a77d..1737f79 100644 --- a/Model/Nc2ToNc3Link.php +++ b/Model/Nc2ToNc3Link.php @@ -33,6 +33,13 @@ */ class Nc2ToNc3Link extends Nc2ToNc3AppModel { +/** + * NC3のダミーのフレームキー。NC2でモジュール未配置の場合に一時的に利用する. 基本ここでは活用されない + * + * @var string + */ + const DUMMY_FRAME_KEY = 'Nc2toNc3Dummy'; + /** * Custom database table name, or null/false if no table association is desired. * @@ -64,6 +71,7 @@ public function migrate() { if (!$this->__saveLinkBlockFromNc2($nc2Linklists)) { return false; } + unset($nc2Linklists); /* @var $Nc2LinklistLink AppModel */ $Nc2LinklistLink = $this->getNc2Model('linklist_link'); @@ -75,6 +83,7 @@ public function migrate() { if (!$this->__saveLinkFromNc2($nc2LinklistLinks)) { return false; } + unset($nc2LinklistLinks); /* @var $Nc2LinklistBlock AppModel */ $Nc2LinklistBlock = $this->getNc2Model('linklist_block'); @@ -82,6 +91,7 @@ public function migrate() { if (!$this->__saveLinkFrameSettingFromNc2($nc2LinklistBlocks)) { return false; } + unset($nc2LinklistBlocks); $this->writeMigrationLog(__d('nc2_to_nc3', 'Link Migration end.')); @@ -113,27 +123,46 @@ private function __saveLinkBlockFromNc2($nc2Linklists) { $Nc2ToNc3Frame = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Frame'); $BlocksLanguage = ClassRegistry::init('Blocks.BlocksLanguage'); $Nc2ToNc3Category = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Category'); + + /* @see Nc2ToNc3Map::getMapIdList() */ + $Nc2ToNc3Map = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Map'); + $mapRoomIdList = $Nc2ToNc3Map->getMapIdList('Room'); + foreach ($nc2Linklists as $nc2Linklist) { $LinkBlock->begin(); try { $nc2RoomId = $nc2Linklist['Nc2Linklist']['room_id']; $nc2LinklistBlock = $Nc2LinklistBlock->findByRoomId($nc2RoomId, 'block_id', null, -1); - if (!$nc2LinklistBlock) { - $message = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2Linklist)); - $this->writeMigrationLog($message); - $LinkBlock->rollback(); - continue; + //if (!$nc2LinklistBlock) { + // $message = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2Linklist)); + // $this->writeMigrationLog($message); + // $LinkBlock->rollback(); + // continue; + //} + //$frameMap = $Nc2ToNc3Frame->getMap($nc2LinklistBlock['Nc2LinklistBlock']['block_id']); + //if (!$frameMap) { + // $message = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2Linklist)); + // $this->writeMigrationLog($message); + // $LinkBlock->rollback(); + // continue; + //} + $frameMap = []; + if ($nc2LinklistBlock) { + $frameMap = $Nc2ToNc3Frame->getMap($nc2LinklistBlock['Nc2LinklistBlock']['block_id']); } - $frameMap = $Nc2ToNc3Frame->getMap($nc2LinklistBlock['Nc2LinklistBlock']['block_id']); - if (!$frameMap) { - $message = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2Linklist)); + // nc3 room_id取得 + if (! isset($mapRoomIdList[$nc2RoomId])) { + // 基本ありえない想定 + $message = __d('nc2_to_nc3', '%s No room ID corresponding to nc3', + 'nc2_room_id:' . $nc2RoomId); $this->writeMigrationLog($message); $LinkBlock->rollback(); continue; } + $nc3RoomId = $mapRoomIdList[$nc2RoomId]; - $data = $this->generateNc3LinkBlockData($frameMap, $nc2Linklist); + $data = $this->generateNc3LinkBlockData($frameMap, $nc2Linklist, $nc3RoomId); if (!$data) { $LinkBlock->rollback(); continue; @@ -148,7 +177,8 @@ private function __saveLinkBlockFromNc2($nc2Linklists) { $nc2CategoryList = $Nc2ToNc3Category->getNc2CategoryList('linklist_category', $query); $data['Categories'] = $Nc2ToNc3Category->generateNc3CategoryData($nc2CategoryList); - $this->writeCurrent($frameMap, 'links'); + //$this->writeCurrent($frameMap, 'links'); + $this->__writeCurrent($frameMap, 'links', $nc3RoomId); $LinkBlock->create(); $BlocksLanguage->create(); if (!$LinkBlock->saveLinkBlock($data)) { @@ -159,13 +189,12 @@ private function __saveLinkBlockFromNc2($nc2Linklists) { $message = $this->getLogArgument($nc2Linklist) . "\n" . var_export($LinkBlock->validationErrors, true); $this->writeMigrationLog($message); - $LinkBlock->rollback(); continue; } // 登録処理で使用しているデータを空に戻す - $nc3RoomId = $frameMap['Frame']['room_id']; - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + //$nc3RoomId = $frameMap['Frame']['room_id']; + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2LinklistId = $nc2Linklist['Nc2Linklist']['linklist_id']; $idMap = [ @@ -245,7 +274,7 @@ private function __saveLinkFromNc2($nc2LinklistLinks) { $nc3RoomId = $mapIdList[$nc2RoomId]; // @see https://github.com/NetCommons3/Workflow/blob/3.1.0/Model/Behavior/WorkflowBehavior.php#L171-L175 Current::write('Room.id', $nc3RoomId); - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; // 一応Model::validatの初期化 $Link->validate = []; @@ -263,7 +292,7 @@ private function __saveLinkFromNc2($nc2LinklistLinks) { continue; } - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2LinkId = $nc2LinklistLink['Nc2LinklistLink']['link_id']; $idMap = [ @@ -363,5 +392,30 @@ private function __saveLinkFrameSettingFromNc2($nc2LinklistBlocks) { return true; } + +/** + * Write Current. + * + * @param array $frameMap array data. + * @param string $pluginKey plugin key. + * @param string $nc3RoomId nc3 room id. + * @return void + * @see Nc2ToNc3BaseBehavior::_writeCurrent()からコピー + */ + private function __writeCurrent($frameMap, $pluginKey, $nc3RoomId) { + if ($frameMap) { + Current::write('Frame.key', $frameMap['Frame']['key']); + } else { + // 基本ここでは使ってない + Current::write('Frame.key', self::DUMMY_FRAME_KEY); + } + Current::write('Frame.room_id', $nc3RoomId); + Current::write('Frame.plugin_key', $pluginKey); + // @see https://github.com/NetCommons3/Topics/blob/3.1.0/Model/Behavior/TopicsBaseBehavior.php#L347 + Current::write('Plugin.key', $pluginKey); + // @see https://github.com/NetCommons3/Workflow/blob/3.1.0/Model/Behavior/WorkflowBehavior.php#L171-L175 + Current::write('Room.id', $nc3RoomId); + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + } } diff --git a/Model/Nc2ToNc3Menu.php b/Model/Nc2ToNc3Menu.php index f070c9a..887bc8a 100644 --- a/Model/Nc2ToNc3Menu.php +++ b/Model/Nc2ToNc3Menu.php @@ -24,7 +24,7 @@ * @method void changeNc3CurrentLanguage($langDirName = null) * @method void restoreNc3CurrentLanguage() * - * @see Nc2ToNc3BaseBehavior + * @see Nc2ToNc3MenuBehavior * @method string getLogArgument($nc2MenuDetail) * @method array generateNc3MenuFrameSettingData($nc2MenuDetail) * @method array generateNc3MenuFramePageOrRoomData($nc2MenuDetail, $nc3MenuFrameSetting) diff --git a/Model/Nc2ToNc3Multidatabase.php b/Model/Nc2ToNc3Multidatabase.php index a1eab6d..19ed438 100644 --- a/Model/Nc2ToNc3Multidatabase.php +++ b/Model/Nc2ToNc3Multidatabase.php @@ -1,6 +1,6 @@ @@ -12,7 +12,7 @@ App::uses('Current', 'NetCommons.Utility'); /** - * Nc2ToNc3Blog + * Nc2ToNc3Multidatabase * * @see Nc2ToNc3BaseBehavior * @method void writeMigrationLog($message) @@ -58,29 +58,30 @@ class Nc2ToNc3Multidatabase extends Nc2ToNc3AppModel { public function migrate() { $this->writeMigrationLog(__d('nc2_to_nc3', 'Multidatabase Migration start.')); - /* @var $Nc2Blog AppModel */ + /* @var $Nc2Multidatabase AppModel */ $Nc2Multidatabase = $this->getNc2Model('multidatabase'); $nc2Multidatabases = $Nc2Multidatabase->find('all'); if (!$this->__saveNc3MultidatabaseFromNc2($nc2Multidatabases)) { return false; } - /* @var $Nc2MultidatabaseBlock AppModel */ + // 先にmetadataを移行しないとframeの移行で並び順カラムを設定できない + $Nc2MultidatabaseMetadata = $this->getNc2Model('multidatabase_metadata'); + // col_noをうめるためにmultidatabase_id + $nc2MultidatabaseMetadatas = $Nc2MultidatabaseMetadata->find('all', [ + 'order' => 'multidatabase_id ASC' + ]); + if (!$this->__saveNc3MultidatabaseMetadataFromNc2($nc2MultidatabaseMetadatas)) { + return false; + } + + /* @var $Nc2MultidatabaseBlock AppModel */ $Nc2MultidatabaseBlock = $this->getNc2Model('multidatabase_block'); $nc2MultidatabaseBlocks = $Nc2MultidatabaseBlock->find('all'); if (!$this->__saveNc3MultidatabaseFrameSettingFromNc2($nc2MultidatabaseBlocks)) { return false; } - $Nc2MultidatabaseMetadata = $this->getNc2Model('multidatabase_metadata'); - // col_noをうめるためにmultidatabase_id - $nc2MultidatabaseMetadatas = $Nc2MultidatabaseMetadata->find('all', [ - 'order' => 'multidatabase_id ASC' - ]); - if (!$this->__saveNc3MultidatabaseMetadataFromNc2($nc2MultidatabaseMetadatas)) { - return false; - } - $Nc2MultidbContent = $this->getNc2Model('multidatabase_content'); $nc2MultidbContents = $Nc2MultidbContent->find('all', [ 'order' => 'display_sequence' @@ -89,7 +90,6 @@ public function migrate() { return false; } - // Comment $Nc2MultidbComment = $this->getNc2Model('multidatabase_comment'); $nc2MultidbComments = $Nc2MultidbComment->find('all'); @@ -107,7 +107,7 @@ public function migrate() { $MetadataContent = ClassRegistry::init('Multidatabases.MultidatabaseContent'); $MetadataSetting = ClassRegistry::init('Multidatabases.MultidatabaseMetadataSetting'); //$MetadataContent->virtualFields['number'] = 0; - foreach($metadata as $metadatum) { + foreach ($metadata as $metadatum) { $colNo = $metadatum['MultidatabaseMetadata']['col_no']; $result = $MetadataContent->find('first', [ 'conditions' => [ @@ -123,7 +123,7 @@ public function migrate() { if ($number === null) { $number = 0; } - }else{ + } else { $number = 0; } @@ -151,8 +151,7 @@ public function migrate() { private function __saveNc3MultidatabaseFromNc2($nc2Multidatabases) { $this->writeMigrationLog(__d('nc2_to_nc3', ' Multidatabase data Migration start.')); - /* @var $Multidatabase Blog */ - /* @var $Nc2ToNc3Category Nc2ToNc3Category */ + /* @var $Multidatabase Multidatabase */ $Multidatabase = ClassRegistry::init('Multidatabases.Multidatabase'); Current::write('Plugin.key', 'multidatabases'); @@ -171,7 +170,6 @@ private function __saveNc3MultidatabaseFromNc2($nc2Multidatabases) { $MultidatabaseSetting = ClassRegistry::init('Multidatabases.MultidatabaseSetting'); $MailSetting = ClassRegistry::init('Mails.MailSetting'); - foreach ($nc2Multidatabases as $nc2Multidatabase) { $Multidatabase->begin(); try { @@ -184,7 +182,7 @@ private function __saveNc3MultidatabaseFromNc2($nc2Multidatabases) { // いる? $nc3RoomId = $data['Block']['room_id']; Current::write('Room.id', $nc3RoomId); - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; $BlocksLanguage->create(); $Multidatabase->create(); @@ -215,8 +213,8 @@ private function __saveNc3MultidatabaseFromNc2($nc2Multidatabases) { // 'BlockRolePermission' =>$data['BlockRolePermission'] //]; - foreach($data['BlockRolePermission'] as &$permission){ - foreach ($permission as &$role){ + foreach ($data['BlockRolePermission'] as &$permission) { + foreach ($permission as &$role) { $role['block_key'] = $block['Block']['key']; } } @@ -228,7 +226,7 @@ private function __saveNc3MultidatabaseFromNc2($nc2Multidatabases) { // print_rはPHPMD.DevelopmentCodeFragmentに引っかかった。var_exportは大丈夫らしい。。。 // @see https://phpmd.org/rules/design.html $message = $this->getLogArgument($data) . "\n" . - var_export($Multidatabase->validationErrors, true); + var_export($MultidatabaseSetting->validationErrors, true); $this->writeMigrationLog($message); $Multidatabase->rollback(); continue; @@ -251,14 +249,13 @@ private function __saveNc3MultidatabaseFromNc2($nc2Multidatabases) { // print_rはPHPMD.DevelopmentCodeFragmentに引っかかった。var_exportは大丈夫らしい。。。 // @see https://phpmd.org/rules/design.html $message = $this->getLogArgument($data) . "\n" . - var_export($Multidatabase->validationErrors, true); + var_export($MailSetting->validationErrors, true); $this->writeMigrationLog($message); $Multidatabase->rollback(); continue; } - - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2MultidatabaseId = $nc2Multidatabase['Nc2Multidatabase']['multidatabase_id']; $idMap = [ @@ -268,14 +265,13 @@ private function __saveNc3MultidatabaseFromNc2($nc2Multidatabases) { // ダミーでSaveしたmetadataレコードの削除 $savedData = $Multidatabase->findById($Multidatabase->id); - $key = $savedData['Multidatabase']['key']; + $key = $savedData['Multidatabase']['key']; $Metadata->deleteAll(['key' => $key], false, false); $Multidatabase->commit(); } catch (Exception $ex) { // NetCommonsAppModel::rollback()でthrowされるので、以降の処理は実行されない - // $BlogFrameSetting::savePage()でthrowされるとこの処理に入ってこない $Multidatabase->rollback($ex); throw $ex; } @@ -286,12 +282,12 @@ private function __saveNc3MultidatabaseFromNc2($nc2Multidatabases) { Current::remove('Room.id'); Current::remove('Plugin.key'); - $this->writeMigrationLog(__d('nc2_to_nc3', ' Blog Multidatabase Migration end.')); + $this->writeMigrationLog(__d('nc2_to_nc3', 'Multidatabase Migration end.')); return true; } /** - * Save BlogFrameSetting from Nc2. + * Save MultidatabaseFrameSetting from Nc2. * * @param array $nc2MultidatabaseBlocks Nc2ournalBlock data. * @return bool True on success @@ -300,8 +296,7 @@ private function __saveNc3MultidatabaseFromNc2($nc2Multidatabases) { private function __saveNc3MultidatabaseFrameSettingFromNc2($nc2MultidatabaseBlocks) { $this->writeMigrationLog(__d('nc2_to_nc3', ' MultidatabaseFrameSetting data Migration start.')); - /* @var $MultidbFrameSetting BlogFrameSetting */ - /* @var $Frame Frame */ + /* @var $MultidbFrameSetting MultidatabaseFrameSetting */ $MultidbFrameSetting = ClassRegistry::init('Multidatabases.MultidatabaseFrameSetting'); $Frame = ClassRegistry::init('Frames.Frame'); foreach ($nc2MultidatabaseBlocks as $nc2MultidatabaseBlock) { @@ -348,7 +343,6 @@ private function __saveNc3MultidatabaseFrameSettingFromNc2($nc2MultidatabaseBloc } catch (Exception $ex) { // NetCommonsAppModel::rollback()でthrowされるので、以降の処理は実行されない - // $BlogFrameSetting::saveBlogFrameSetting()でthrowされるとこの処理に入ってこない $MultidbFrameSetting->rollback($ex); throw $ex; } @@ -375,8 +369,7 @@ private function __saveNc3MultidatabaseFrameSettingFromNc2($nc2MultidatabaseBloc private function __saveNc3MultidatabaseMetadataFromNc2($nc2Metadata) { $this->writeMigrationLog(__d('nc2_to_nc3', ' MultidatabaseMetadata Migration start.')); - /* @var $MultidbMetadata BlogFrameSetting */ - /* @var $Frame Frame */ + /** @var MultidatabaseMetadata $MultidbMetadata */ $MultidbMetadata = ClassRegistry::init('Multidatabases.MultidatabaseMetadata'); $MultidbMetadata->Behaviors->load('NetCommons.OriginalKey'); @@ -419,7 +412,6 @@ private function __saveNc3MultidatabaseMetadataFromNc2($nc2Metadata) { } catch (Exception $ex) { // NetCommonsAppModel::rollback()でthrowされるので、以降の処理は実行されない - // $BlogFrameSetting::saveBlogFrameSetting()でthrowされるとこの処理に入ってこない $MultidbMetadata->rollback($ex); throw $ex; } @@ -437,17 +429,16 @@ private function __saveNc3MultidatabaseMetadataFromNc2($nc2Metadata) { } /** - * Save BlogEntry from Nc2. + * Save Multidatabase Content from Nc2. * * @param array $nc2MultidbContents Nc2JournalPost data. * @return bool True on success - * @throws Exception + * @throws InternalErrorException */ private function __saveNc3MultidbContentFromNc2($nc2MultidbContents) { $this->writeMigrationLog(__d('nc2_to_nc3', ' Multidatabase Content Migration start.')); - /* @var $DbContent BlogEntry */ - /* @var $Nc2ToNc3Category Nc2ToNc3Category */ + /** @var MultidatabaseContent $DbContent */ $DbContent = ClassRegistry::init('Multidatabases.MultidatabaseContent'); Current::write('Plugin.key', 'multidatabases'); @@ -463,9 +454,13 @@ private function __saveNc3MultidbContentFromNc2($nc2MultidbContents) { $UploadFile = ClassRegistry::init('Files.UploadFile'); $Like = ClassRegistry::init('Likes.Like'); + + // ダミーでuploadの設定をしておく。何もないとAttachmentBehaviorでNotice発生するので + // \AttachmentBehavior::afterSave にファイルの保存等をまかせてるので AttachmentBehaviorをunloadはできない。 + $DbContent->uploadSettings('__dummy'); + foreach ($nc2MultidbContents as $nc2MultidbContent) { $DbContent->begin(); - //$DbContent->Behaviors->disable('Attachment'); try { $data = $this->generateNc3MultidbContent($nc2MultidbContent); @@ -492,15 +487,11 @@ private function __saveNc3MultidbContentFromNc2($nc2MultidbContents) { // @see https://github.com/NetCommons3/Workflow/blob/3.1.0/Model/Behavior/WorkflowBehavior.php#L171-L175 $nc3Status = $data['MultidatabaseContent']['status']; - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = ($nc3Status != 2); + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = ($nc3Status != 2); - // Hash::merge で BlogEntry::validate['publish_start']['datetime']['rule']が - // ['datetime','datetime'] になってしまうので初期化 - // @see https://github.com/NetCommons3/Blogs/blob/3.1.0/Model/BlogEntry.php#L138-L141 $DbContent->validate = []; - //if (!$DbContent->saveContent($data, false)) { - if (!$DbContent->save($data, false)) { + if (!$DbContent->save($data, ['validate' => false])) { // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、 // ここでrollback $DbContent->rollback(); @@ -518,7 +509,7 @@ private function __saveNc3MultidbContentFromNc2($nc2MultidbContents) { // ここでファイルパスワード保存 if (isset($data['AuthorizationKey'])) { - foreach($data['AuthorizationKey'] as $authKey) { + foreach ($data['AuthorizationKey'] as $authKey) { if (! $AuthorizationKey->saveAuthorizationKey( 'MultidatabaseContent', $DbContent->id, @@ -556,7 +547,7 @@ private function __saveNc3MultidbContentFromNc2($nc2MultidbContents) { $Like->save($data); } - //unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + //unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2PostId = $nc2MultidbContent['Nc2MultidatabaseContent']['content_id']; $idMap = [ @@ -567,7 +558,6 @@ private function __saveNc3MultidbContentFromNc2($nc2MultidbContents) { } catch (Exception $ex) { // NetCommonsAppModel::rollback()でthrowされるので、以降の処理は実行されない - // $BlogFrameSetting::savePage()でthrowされるとこの処理に入ってこない $DbContent->rollback($ex); throw $ex; } @@ -615,7 +605,7 @@ private function __saveNc3ContentCommentFromNc2($nc2MultidbComments) { // @see https://github.com/NetCommons3/Workflow/blob/3.1.0/Model/Behavior/WorkflowBehavior.php#L171-L175 Current::write('Room.id', $nc3RoomId); - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = ($nc3Status != 2); + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = ($nc3Status != 2); $ContentComment->create(); // 一応Model::validatの初期化 @@ -632,7 +622,7 @@ private function __saveNc3ContentCommentFromNc2($nc2MultidbComments) { continue; } - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2PostId = $nc2MultidbComment['Nc2MultidatabaseComment']['comment_id']; $idMap = [ @@ -664,4 +654,4 @@ private function __saveNc3ContentCommentFromNc2($nc2MultidbComments) { return true; } -} \ No newline at end of file +} diff --git a/Model/Nc2ToNc3Page.php b/Model/Nc2ToNc3Page.php index 8133a23..05c9e35 100644 --- a/Model/Nc2ToNc3Page.php +++ b/Model/Nc2ToNc3Page.php @@ -309,7 +309,7 @@ private function __generateNc3Page($nc2Page, $nc3Page) { 'room_id' => $roomMap['Room']['id'], 'root_id' => $this->getNc3RootId($nc2Page, $roomMap), 'parent_id' => $map['Page']['id'], - 'slug' => $this->convertPermalink($nc2Page['Nc2Page']['permalink']), + 'slug' => $this->getConvertSlug($nc2Page['Nc2Page']['permalink']), ], 'Room' => [ 'id' => $roomMap['Room']['id'], diff --git a/Model/Nc2ToNc3PhotoAlbum.php b/Model/Nc2ToNc3PhotoAlbum.php index d449e79..adde098 100644 --- a/Model/Nc2ToNc3PhotoAlbum.php +++ b/Model/Nc2ToNc3PhotoAlbum.php @@ -35,6 +35,13 @@ */ class Nc2ToNc3PhotoAlbum extends Nc2ToNc3AppModel { +/** + * NC3のダミーのフレームキー。NC2でモジュール未配置の場合に一時的に利用する + * + * @var string + */ + const DUMMY_FRAME_KEY = 'Nc2toNc3Dummy'; + /** * Custom database table name, or null/false if no table association is desired. * @@ -56,6 +63,7 @@ class Nc2ToNc3PhotoAlbum extends Nc2ToNc3AppModel { * Migration method. * * @return bool True on success. + * @throws Exception */ public function migrate() { $this->writeMigrationLog(__d('nc2_to_nc3', 'PhotoAlbum Migration start.')); @@ -68,9 +76,14 @@ public function migrate() { } /* @var $Nc2Photoalbum AppModel */ - $Nc2PhotoalbumAlbum = $this->getNc2Model('photoalbum_album'); - $nc2PhotoalbumAlbums = $Nc2PhotoalbumAlbum->find('all'); - if (!$this->__savePhotoAlbumFromNc2($nc2PhotoalbumAlbums)) { + $Nc2Photoalbum = $this->getNc2Model('photoalbum'); + $nc2Photoalbums = $Nc2Photoalbum->find('all'); + $nc2PhotoalbumIdList = $this->__getNc2PhotoalbumIdList($nc2Photoalbums); + unset($nc2Photoalbums); + //$Nc2PhotoalbumAlbum = $this->getNc2Model('photoalbum_album'); + //$nc2PhotoalbumAlbums = $Nc2PhotoalbumAlbum->find('all'); + //if (!$this->__savePhotoAlbumFromNc2($nc2PhotoalbumAlbums)) { + if (!$this->__savePhotoAlbumFromNc2($nc2PhotoalbumIdList)) { return false; } @@ -97,9 +110,11 @@ private function __savePhotoAlbumFrameSettingFromNc2($nc2PhotoalbumBlocks) { /* @var $Block Block */ $PhotoAlbum = ClassRegistry::init('PhotoAlbums.PhotoAlbum'); $FrameSetting = ClassRegistry::init('PhotoAlbums.PhotoAlbumFrameSetting'); + $PhotoAlbumSetting = ClassRegistry::init('PhotoAlbums.PhotoAlbumSetting'); $PhotoAlbumsComponent = new PhotoAlbumsComponent(new ComponentCollection()); $Frame = ClassRegistry::init('Frames.Frame'); $Block = ClassRegistry::init('Blocks.Block'); + $BlocksLanguage = ClassRegistry::init('Blocks.BlocksLanguage'); $Nc2ToNc3Frame = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Frame'); foreach ($nc2PhotoalbumBlocks as $nc2PhotoalbumBlock) { $PhotoAlbum->begin(); @@ -107,18 +122,24 @@ private function __savePhotoAlbumFrameSettingFromNc2($nc2PhotoalbumBlocks) { $nc2BlockId = $nc2PhotoalbumBlock['Nc2PhotoalbumBlock']['block_id']; $frameMap = $Nc2ToNc3Frame->getMap($nc2BlockId); + if (!$frameMap) { + $message = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2PhotoalbumBlock)); + $this->writeMigrationLog($message); + $PhotoAlbum->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); $Block->create(); + $BlocksLanguage->create(); + $PhotoAlbumSetting->create(false); $PhotoAlbumsComponent->initializeSetting(); $frameSetting = $FrameSetting->read(); $data = [ 'PhotoAlbumFrameSetting' => $frameSetting['PhotoAlbumFrameSetting'], ]; - //error_log(print_r('fddsdfdfs', true)."\n\n", 3, LOGS."/tail.log"); - //error_log(print_r($frameSetting, true)."\n\n", 3, LOGS."/tail.log"); $data = $this->generateNc3PhotoAlbumFrameSettingData($data, $frameMap, $nc2PhotoalbumBlock); if (!$data) { @@ -126,16 +147,7 @@ private function __savePhotoAlbumFrameSettingFromNc2($nc2PhotoalbumBlocks) { continue; } - Current::write('Frame.key', $frameMap['Frame']['key']); - Current::write('Frame.room_id', $nc3RoomId); - Current::write('Frame.plugin_key', 'photo_albums'); - - // @see https://github.com/NetCommons3/Topics/blob/3.1.0/Model/Behavior/TopicsBaseBehavior.php#L347 - Current::write('Plugin.key', 'photo_albums'); - - // @see https://github.com/NetCommons3/Workflow/blob/3.1.0/Model/Behavior/WorkflowBehavior.php#L171-L175 - Current::write('Room.id', $nc3RoomId); - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + $this->__writeCurrent($frameMap, 'photo_albums', $nc3RoomId); $FrameSetting->validate = []; if (!$FrameSetting->savePhotoAlbumFrameSetting($data)) { @@ -148,7 +160,7 @@ private function __savePhotoAlbumFrameSettingFromNc2($nc2PhotoalbumBlocks) { } // 登録処理で使用しているデータを空に戻す - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $idMap = [ $nc2BlockId => $FrameSetting->id, @@ -176,12 +188,12 @@ private function __savePhotoAlbumFrameSettingFromNc2($nc2PhotoalbumBlocks) { * PHPMD.ExcessiveMethodLengthに引っかかるが、PhotoAlbum::saveAlbumForAddとPhotoAlbumPhoto::savePhotoを * 分けたいので、とりあえずSuppressWarningsの定義で回避 * - * @param array $nc2PhotoalbumAlbums Nc2PhotoalbumAlbum data. + * @param array $nc2PhotoalbumIdList [[nc3 room_id][] = photoalbum_id] * @return bool True on success * @throws Exception * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ - private function __savePhotoAlbumFromNc2($nc2PhotoalbumAlbums) { + private function __savePhotoAlbumFromNc2($nc2PhotoalbumIdList) { $this->writeMigrationLog(__d('nc2_to_nc3', ' PhotoAlbum data Migration start.')); /* @var $PhotoAlbum PhotoAlbum */ @@ -189,92 +201,112 @@ private function __savePhotoAlbumFromNc2($nc2PhotoalbumAlbums) { /* @var $Nc2ToNc3Frame Nc2ToNc3Frame */ /* @var $Nc2PhotoalbumBlock AppModel */ /* @var $Nc2PhotoalbumPhoto AppModel */ - /* @var $Block Block */ + /* @var $Nc2Photoalbum AppModel */ $PhotoAlbum = ClassRegistry::init('PhotoAlbums.PhotoAlbum'); $PhotoAlbumPhoto = ClassRegistry::init('PhotoAlbums.PhotoAlbumPhoto'); $Nc2ToNc3Frame = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Frame'); - $Block = ClassRegistry::init('Blocks.Block'); $Nc2PhotoalbumBlock = $this->getNc2Model('photoalbum_block'); $Nc2PhotoalbumPhoto = $this->getNc2Model('photoalbum_photo'); - foreach ($nc2PhotoalbumAlbums as $nc2PhotoalbumAlbum) { - $PhotoAlbum->begin(); - try { - $nc2PhotoalbumId = $nc2PhotoalbumAlbum['Nc2PhotoalbumAlbum']['photoalbum_id']; - $nc2PhotoalbumBlock = $Nc2PhotoalbumBlock->findByPhotoalbumId($nc2PhotoalbumId); - if (!$nc2PhotoalbumBlock) { - $PhotoAlbum->rollback(); - continue; - } - $frameMap = $Nc2ToNc3Frame->getMap($nc2PhotoalbumBlock['Nc2PhotoalbumBlock']['block_id']); + $Nc2PhotoalbumAlbum = $this->getNc2Model('photoalbum_album'); - $nc2AlbumId = $nc2PhotoalbumAlbum['Nc2PhotoalbumAlbum']['album_id']; - $nc2Photos = $Nc2PhotoalbumPhoto->findAllByAlbumId($nc2AlbumId, null, ['photo_sequence' => 'ASC'], -1); - if (count($nc2Photos) === 0) { - $message = $this->getLogArgument($nc2Photos); - $this->writeMigrationLog($message); + foreach ($nc2PhotoalbumIdList as $nc3RoomId => $nc2PhotoalbumIds) { + // フォトアルバムはNC2からNC3でデータの持ち方が変わった。 + // nc2 [新規フォトアルバム1][新規アルバム1][写真] + // nc3 [新規フォトアルバム1][写真] + // このため、移行時にnc2のアルバムを1つに纏める必要があるため、ルーム単位で纏める。 + $nc2PhotoalbumAlbums = $Nc2PhotoalbumAlbum->find('all', [ + 'recursive' => -1, + 'conditions' => [ + 'photoalbum_id' => $nc2PhotoalbumIds + ], + ]); + + foreach ($nc2PhotoalbumAlbums as $nc2PhotoalbumAlbum) { + $PhotoAlbum->begin(); + try { + $frameMap = []; + // 最初のblock_idを取得。残りは後処理の__saveDisplayAlbumで登録する。 + $nc2PhotoalbumBlock = $Nc2PhotoalbumBlock->find('first', [ + 'conditions' => [ + 'photoalbum_id' => $nc2PhotoalbumAlbum['Nc2PhotoalbumAlbum']['photoalbum_id'], + 'display_album_id' => ['0', $nc2PhotoalbumAlbum['Nc2PhotoalbumAlbum']['album_id']] + ], + 'fields' => 'block_id', + 'order' => 'block_id', + 'recursive' => -1, + ]); + if ($nc2PhotoalbumBlock) { + $frameMap = $Nc2ToNc3Frame->getMap($nc2PhotoalbumBlock['Nc2PhotoalbumBlock']['block_id']); + } - $PhotoAlbum->rollback(); - continue; - } - $firstPhoto = array_shift($nc2Photos); - $data = $this->generateNc3PhotoAlbumData($frameMap, $nc2PhotoalbumAlbum, $firstPhoto); - if (!$data) { - $PhotoAlbum->rollback(); - continue; - } + $data = $this->generateNc3PhotoAlbumData($frameMap, $nc2PhotoalbumAlbum, $nc3RoomId); + if (!$data) { + $PhotoAlbum->rollback(); + continue; + } - $nc3Block = $Block->findByRoomIdAndPluginKey( - $frameMap['Frame']['room_id'], - 'photo_albums', - null, - null, - -1 - ); - $data['Block'] = $nc3Block['Block']; - $data['PhotoAlbum']['block_id'] = $nc3Block['Block']['id']; - Current::write('Block.id', $nc3Block['Block']['id']); - - $this->writeCurrent($frameMap, 'photo_albums'); - - $PhotoAlbum->create(); - $PhotoAlbum->validate = []; - if (!$PhotoAlbum->saveAlbumForAdd($data)) { - $message = $this->getLogArgument($nc2PhotoalbumAlbum) . "\n" . - var_export($PhotoAlbum->validationErrors, true); - $this->writeMigrationLog($message); + //$this->writeCurrent($frameMap, 'photo_albums'); + $this->__writeCurrent($frameMap, 'photo_albums', $nc3RoomId); - $PhotoAlbum->rollback(); - continue; - } + if (!($data = $this->__savePhotoAlbumSetting($nc3RoomId, $data))) { + $message = $this->getLogArgument($nc2PhotoalbumAlbum); + $this->writeMigrationLog($message); - $nc3PhotoAlbum = $PhotoAlbum->read(); - foreach ($nc2Photos as $nc2Photo) { - $data = $this->generateNc3PhotoData($nc3PhotoAlbum['PhotoAlbum'], $nc2Photo); - $PhotoAlbumPhoto->create(); - $PhotoAlbumPhoto->validate = []; - if (!$PhotoAlbumPhoto->savePhoto($data)) { - $message = $this->getLogArgument($nc2Photo) . "\n" . - var_export($PhotoAlbumPhoto->validationErrors, true); + $PhotoAlbum->rollback(); + continue; + } + Current::write('Block.id', $data['Block']['id']); + + $PhotoAlbum->create(); + $PhotoAlbum->validate = []; + if (!$PhotoAlbum->saveAlbumForAdd($data)) { + $message = $this->getLogArgument($nc2PhotoalbumAlbum) . "\n" . + var_export($PhotoAlbum->validationErrors, true); $this->writeMigrationLog($message); - $PhotoAlbumPhoto->rollback(); + $PhotoAlbum->rollback(); continue; } - } - // 登録処理で使用しているデータを空に戻す - unset(CurrentBase::$permission[$frameMap['Frame']['room_id']]['Permission']['content_publishable']['value']); + $nc3PhotoAlbum = $PhotoAlbum->read(); + if (!$this->__saveDisplayAlbum($nc2PhotoalbumAlbum, $nc3PhotoAlbum)) { + $message = $this->getLogArgument($nc2PhotoalbumAlbum); + $this->writeMigrationLog($message); - $idMap = [ - $nc2PhotoalbumAlbum['Nc2PhotoalbumAlbum']['album_id'] => $PhotoAlbum->id, - ]; - $this->saveMap('PhotoAlbum', $idMap); + $PhotoAlbum->rollback(); + continue; + } - $PhotoAlbum->commit(); + $nc2AlbumId = $nc2PhotoalbumAlbum['Nc2PhotoalbumAlbum']['album_id']; + $nc2Photos = $Nc2PhotoalbumPhoto->findAllByAlbumId($nc2AlbumId, null, ['photo_sequence' => 'ASC'], -1); + foreach ($nc2Photos as $nc2Photo) { + $data = $this->generateNc3PhotoData($nc3PhotoAlbum['PhotoAlbum'], $nc2Photo); + $PhotoAlbumPhoto->create(); + $PhotoAlbumPhoto->validate = []; + if (!$PhotoAlbumPhoto->savePhoto($data)) { + $message = $this->getLogArgument($nc2Photo) . "\n" . + var_export($PhotoAlbumPhoto->validationErrors, true); + $this->writeMigrationLog($message); + + continue; + } + } - } catch (Exception $ex) { - $PhotoAlbum->rollback($ex); - throw $ex; + // 登録処理で使用しているデータを空に戻す + //unset(Current::$permission[$frameMap['Frame']['room_id']]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + + $idMap = [ + $nc2PhotoalbumAlbum['Nc2PhotoalbumAlbum']['album_id'] => $PhotoAlbum->id, + ]; + $this->saveMap('PhotoAlbum', $idMap); + + $PhotoAlbum->commit(); + + } catch (Exception $ex) { + $PhotoAlbum->rollback($ex); + throw $ex; + } } } @@ -284,5 +316,165 @@ private function __savePhotoAlbumFromNc2($nc2PhotoalbumAlbums) { return true; } + +/** + * __getNc2PhotoalbumIdList + * + * @param array $nc2Photoalbums Nc2Photoalbum data. + * @return array [[nc3 room_id][] = photoalbum_id] + */ + private function __getNc2PhotoalbumIdList($nc2Photoalbums) { + /* @see Nc2ToNc3Map::getMapIdList() */ + $Nc2ToNc3Map = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Map'); + $mapRoomIdList = $Nc2ToNc3Map->getMapIdList('Room'); + + //$nc2PhotoalbumIdList [[nc3 room_id][] = photoalbum_id] + $nc2PhotoalbumIdList = []; + foreach ($nc2Photoalbums as $nc2Photoalbum) { + $nc2RoomId = $nc2Photoalbum['Nc2Photoalbum']['room_id']; + // nc3 room_id取得 + if (! isset($mapRoomIdList[$nc2RoomId])) { + // 基本ありえない想定 + $message = __d('nc2_to_nc3', '%s No room ID corresponding to nc3', + 'nc2_room_id:' . $nc2RoomId); + $this->writeMigrationLog($message); + continue; + } + $nc3RoomId = $mapRoomIdList[$nc2RoomId]; + $nc2PhotoalbumIdList[$nc3RoomId][] = $nc2Photoalbum['Nc2Photoalbum']['photoalbum_id']; + } + return $nc2PhotoalbumIdList; + } + +/** + * Save PhotoAlbumSetting. + * + * @param string $nc3RoomId nc3 room id. + * @param array $nc3PhotoAlbum data. + * @return array Nc3PhotoAlbum data. + */ + private function __savePhotoAlbumSetting($nc3RoomId, $nc3PhotoAlbum) { + /* @var $Block Block */ + $Block = ClassRegistry::init('Blocks.Block'); + $PhotoAlbumSetting = ClassRegistry::init('PhotoAlbums.PhotoAlbumSetting'); + + $nc3Block = $Block->findByRoomIdAndPluginKey( + $nc3RoomId, + 'photo_albums', + ['id', 'key'], + null, + -1 + ); + + if (!$nc3Block) { + $PhotoAlbumSetting->create(false); + $Block->create(false); + $data = $PhotoAlbumSetting->createBlockSetting(); + if (!$PhotoAlbumSetting->savePhotoAlbumSetting($data)) { + return []; + } + + $nc3Block = $Block->findByRoomIdAndPluginKey( + $nc3RoomId, + 'photo_albums', + ['id', 'key'], + null, + -1 + ); + } + + $nc3PhotoAlbum['Block'] = [ + 'id' => $nc3Block['Block']['id'], + 'key' => $nc3Block['Block']['key'], + 'room_id' => $nc3RoomId, + 'plugin_key' => 'photo_albums', + 'public_type' => 1, + ]; + $nc3PhotoAlbum['PhotoAlbum']['block_id'] = $nc3Block['Block']['id']; + + return $nc3PhotoAlbum; + } + +/** + * Save DisplayAlbum. + * + * @param array $nc2PhotoalbumAlbum data. + * @param array $nc3PhotoAlbum data. + * @return bool + */ + private function __saveDisplayAlbum($nc2PhotoalbumAlbum, $nc3PhotoAlbum) { + $DisplayAlbum = ClassRegistry::init('PhotoAlbums.PhotoAlbumDisplayAlbum'); + if (Current::read('Frame.key') == self::DUMMY_FRAME_KEY) { + // $PhotoAlbum->saveAlbumForAdd($data)では、新規登録時に$PhotoAlbumDisplayAlbumが必須で登録される。 + // ダミーで登録したFrameKeyのデータを削除 + $conditions = array('frame_key' => self::DUMMY_FRAME_KEY); + $DisplayAlbum->deleteAll($conditions, false); + } + + if ($nc2PhotoalbumAlbum['Nc2PhotoalbumAlbum']['public_flag'] === '0' ) { + $conditions = [ + 'frame_key' => Current::read('Frame.key'), + 'album_key' => $nc3PhotoAlbum['PhotoAlbum']['key'] + ]; + $DisplayAlbum->deleteAll($conditions, false); + + // 非公開はどのフレームにも表示しない + return true; + } + + $Nc2PhotoalbumBlock = $this->getNc2Model('photoalbum_block'); + $nc2PhotoalbumBlocks = $Nc2PhotoalbumBlock->find('all', [ + 'conditions' => [ + 'photoalbum_id' => $nc2PhotoalbumAlbum['Nc2PhotoalbumAlbum']['photoalbum_id'], + 'display_album_id' => ['0', $nc2PhotoalbumAlbum['Nc2PhotoalbumAlbum']['album_id']] + ], + 'fields' => 'block_id', + 'order' => 'block_id', + 'recursive' => -1, + ]); + // 先頭のblock_idは前処理で登録済み + array_shift($nc2PhotoalbumBlocks); + + $Nc2ToNc3Frame = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Frame'); + foreach($nc2PhotoalbumBlocks as $nc2PhotoalbumBlock) { + $frameMap = $Nc2ToNc3Frame->getMap($nc2PhotoalbumBlock['Nc2PhotoalbumBlock']['block_id']); + if ($frameMap) { + $displayAlbum = [ + 'frame_key' => $frameMap['Frame']['key'], + 'album_key' => $nc3PhotoAlbum['PhotoAlbum']['key'] + ]; + $DisplayAlbum->create($displayAlbum); + if (!$DisplayAlbum->save()) { + return false; + } + } + } + + return true; + } + +/** + * Write Current. + * + * @param array $frameMap array data. + * @param string $pluginKey plugin key. + * @param string $nc3RoomId nc3 room id. + * @return void + * @see Nc2ToNc3BaseBehavior::_writeCurrent()からコピー + */ + private function __writeCurrent($frameMap, $pluginKey, $nc3RoomId) { + if ($frameMap) { + Current::write('Frame.key', $frameMap['Frame']['key']); + } else { + Current::write('Frame.key', self::DUMMY_FRAME_KEY); + } + Current::write('Frame.room_id', $nc3RoomId); + Current::write('Frame.plugin_key', $pluginKey); + // @see https://github.com/NetCommons3/Topics/blob/3.1.0/Model/Behavior/TopicsBaseBehavior.php#L347 + Current::write('Plugin.key', $pluginKey); + // @see https://github.com/NetCommons3/Workflow/blob/3.1.0/Model/Behavior/WorkflowBehavior.php#L171-L175 + Current::write('Room.id', $nc3RoomId); + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + } } diff --git a/Model/Nc2ToNc3Plugin.php b/Model/Nc2ToNc3Plugin.php index 6187a09..74f48ea 100644 --- a/Model/Nc2ToNc3Plugin.php +++ b/Model/Nc2ToNc3Plugin.php @@ -119,7 +119,8 @@ private function __setMap() { //'imagine_view_main_init' => null, //'language_view_main_init' => null, 'journal_view_main_init' => 'blogs', - 'login_view_main_init' => 'auth', + // 左カラムなど常時表示の場所にログインモジュールを置いて移行するとNC3ではページ閲覧しようとするとログイン画面に強制リダイレクトされるため、移行しない + //'login_view_main_init' => 'auth', 'linklist_view_main_init' => 'links', 'menu_view_main_init' => 'menus', 'multidatabase_view_main_init' => 'multidatabases', diff --git a/Model/Nc2ToNc3Questionnaire.php b/Model/Nc2ToNc3Questionnaire.php index 622b4ee..3b2241c 100644 --- a/Model/Nc2ToNc3Questionnaire.php +++ b/Model/Nc2ToNc3Questionnaire.php @@ -113,11 +113,9 @@ private function __saveQuestionnaireFromNc2($nc2Questionnaires) { /* @var $Questionnaire Questionnaire */ /* @var $Nc2Questionnaire AppModel */ - /* @var $Nc2ToNc3Frame Nc2ToNc3Frame */ /* @var $Frame Frame */ $Questionnaire = ClassRegistry::init('Questionnaires.Questionnaire'); $Nc2QBlock = $this->getNc2Model('questionnaire_block'); - $Nc2ToNc3Frame = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Frame'); $Frame = ClassRegistry::init('Frames.Frame'); foreach ($nc2Questionnaires as $nc2Questionnaire) { $Questionnaire->begin(); @@ -136,33 +134,23 @@ private function __saveQuestionnaireFromNc2($nc2Questionnaires) { $Questionnaire->rollback(); continue; } - // 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) { + + // PHPMD.ExcessiveMethodLength になるので、別メソッドにした。 + if (!$this->__setCurrentData($nc2QBlock)) { $message = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2Questionnaire)); $this->writeMigrationLog($message); $Questionnaire->rollback(); continue; } - $nc3RoomId = $frameMap['Frame']['room_id']; - Current::write('Frame.key', $frameMap['Frame']['key']); - Current::write('Frame.room_id', $nc3RoomId); - Current::write('Frame.plugin_key', 'questionnaires'); - - // @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 - Current::write('Room.id', $nc3RoomId); - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + + // 画像保存の時にBlockが必要なので + $data['Block'] = Current::read('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(); + $data = $this->__cleansingChoiceText($data); if (!$Questionnaire->saveQuestionnaire($data)) { // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、 @@ -180,9 +168,6 @@ private function __saveQuestionnaireFromNc2($nc2Questionnaires) { continue; } - // 登録処理で使用しているデータを空に戻す - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); - $nc2QuestionnaireId = $nc2Questionnaire['Nc2Questionnaire']['questionnaire_id']; $idMap = [ $nc2QuestionnaireId => $Questionnaire->id @@ -199,20 +184,49 @@ private function __saveQuestionnaireFromNc2($nc2Questionnaires) { } } - // 登録処理で使用しているデータを空に戻す - Current::remove('Frame.key'); - Current::remove('Frame.room_id'); - Current::remove('Frame.plugin_key'); - Current::remove('Plugin.key'); - Current::remove('Room.id'); - // Fatal error: Attempt to unset static property が発生。keyを指定した場合は発生しない。なんで? - //unset(CurrentBase::$permission); + // PHPMD.ExcessiveMethodLength になるので、別メソッドにした。 + $this->__unSetCurrentData(); $this->writeMigrationLog(__d('nc2_to_nc3', ' Questionnaire data Migration end.')); return true; } +/** + * 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. * @@ -438,4 +452,66 @@ private function __saveQuestionnaireAnswerFromNc2($nc2QSummary, $nc3QAnswerSumma return true; } +/** + * Set Current data. + * + * @param array $nc2QBlock Nc2QuizBlock data. + * @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) { + return false; + } + // Block情報も必要 上のFrame.block_idで存在は確かなので戻り値チェックはしない + $Block = ClassRegistry::init('Blocks.Block'); + $nc3Block = $Block->findById($frameMap['Frame']['block_id'], null, null, -1); + + $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にBlock情報も追加 + Current::write('Block', $nc3Block['Block']); + + // @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 + 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'); + Current::remove('Block'); + + // Fatal error: Attempt to unset static property が発生。keyを指定した場合は発生しない。なんで? + //unset(Current::$permission); + $nc3RoomIds = array_keys(Current::$permission); + foreach ($nc3RoomIds as $nc3RoomId) { + unset(Current::$permission[$nc3RoomId]); + } + } } diff --git a/Model/Nc2ToNc3Quiz.php b/Model/Nc2ToNc3Quiz.php index 0630750..2f785fa 100644 --- a/Model/Nc2ToNc3Quiz.php +++ b/Model/Nc2ToNc3Quiz.php @@ -166,8 +166,8 @@ private function __saveQuizFromNc2($nc2Quizzes) { // 登録処理で使用しているデータを空に戻す // 別メソッドにしたため、ここじゃできなくなった。 - //unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); - //unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_editable']['value']); + //unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + //unset(Current::$permission[$nc3RoomId]['Permission']['content_editable']['value']); $nc2QuizId = $nc2Quiz['Nc2Quiz']['quiz_id']; $idMap = [ @@ -437,12 +437,17 @@ private function __setCurrentData($nc2QBlock) { if (!isset($frameMap['Frame']['block_id'])) { return false; } + // Block情報も必要 上のFrame.block_idで存在は確かなので戻り値チェックはしない + $Block = ClassRegistry::init('Blocks.Block'); + $nc3Block = $Block->findById($frameMap['Frame']['block_id'], null, null, -1); $nc3RoomId = $frameMap['Frame']['room_id']; Current::write('Frame.key', $frameMap['Frame']['key']); Current::write('Frame.room_id', $nc3RoomId); Current::write('Frame.plugin_key', 'quizzes'); Current::write('Frame.block_id', $frameMap['Frame']['block_id']); + // CurrentにBlock情報も追加 + Current::write('Block', $nc3Block['Block']); // QuizFrameDisplayQuiz::validates に引っかかる。is_ativeも条件になり、一時保存データが取得できないので、content_editableもtrue // Questionnaireはvalidateしてない。いいのか? @@ -450,14 +455,14 @@ private function __setCurrentData($nc2QBlock) { // @see https://github.com/NetCommons3/Quizzes/blob/3.1.0/Model/QuizFrameDisplayQuiz.php#L257 // @see https://github.com/NetCommons3/Questionnaires/blob/3.1.0/Model/QuestionnaireFrameDisplayQuestionnaire.php#L259 Current::write('Block.id', $frameMap['Frame']['block_id']); - CurrentBase::$permission[$nc3RoomId]['Permission']['content_editable']['value'] = true; + Current::$permission[$nc3RoomId]['Permission']['content_editable']['value'] = true; // @see https://github.com/NetCommons3/Topics/blob/3.1.0/Model/Behavior/TopicsBaseBehavior.php#L347 Current::write('Plugin.key', 'quizzes'); // @see https://github.com/NetCommons3/Workflow/blob/3.1.0/Model/Behavior/WorkflowBehavior.php#L171-L175 Current::write('Room.id', $nc3RoomId); - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; return true; } @@ -476,12 +481,13 @@ private function __unSetCurrentData() { Current::remove('Frame.Block.id'); Current::remove('Plugin.key'); Current::remove('Room.id'); + Current::remove('Block'); // Fatal error: Attempt to unset static property が発生。keyを指定した場合は発生しない。なんで? - //unset(CurrentBase::$permission); - $nc3RoomIds = array_keys(CurrentBase::$permission); + //unset(Current::$permission); + $nc3RoomIds = array_keys(Current::$permission); foreach ($nc3RoomIds as $nc3RoomId) { - unset(CurrentBase::$permission[$nc3RoomId]); + unset(Current::$permission[$nc3RoomId]); } } } diff --git a/Model/Nc2ToNc3Registration.php b/Model/Nc2ToNc3Registration.php index a90e5ee..221344f 100644 --- a/Model/Nc2ToNc3Registration.php +++ b/Model/Nc2ToNc3Registration.php @@ -76,6 +76,12 @@ public function migrate() { return false; } + $Nc2RegistrationBlock = $this->getNc2Model('registration_block'); + $nc2RBlocks = $Nc2RegistrationBlock->find('all'); + if (!$this->__saveFrameFromNc2($nc2RBlocks)) { + return false; + } + $this->writeMigrationLog(__d('nc2_to_nc3', 'Registration Migration end.')); return true; @@ -92,15 +98,17 @@ private function __saveRegistrationFromNc2($nc2Registrations) { $this->writeMigrationLog(__d('nc2_to_nc3', ' Registration data Migration start.')); /* @var $Registration Registration */ - /* @var $Nc2RegistrationBlock AppModel */ /* @var $Nc2ToNc3Frame Nc2ToNc3Frame */ /* @var $Frame Frame */ /* @var $Block Block */ $Registration = ClassRegistry::init('Registrations.Registration'); + $Registration->MailSetting = ClassRegistry::init('Mails.MailSetting'); + $Registration->MailSettingFixedPhrase = ClassRegistry::init('Mails.MailSettingFixedPhrase'); $NcRBlock = $this->getNc2Model('registration_block'); $Nc2ToNc3Frame = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Frame'); $Frame = ClassRegistry::init('Frames.Frame'); $Block = ClassRegistry::init('Blocks.Block'); + $BlocksLanguage = ClassRegistry::init('Blocks.BlocksLanguage'); foreach ($nc2Registrations as $nc2Registration) { $Registration->begin(); try { @@ -113,12 +121,19 @@ private function __saveRegistrationFromNc2($nc2Registrations) { continue; } $frameMap = $Nc2ToNc3Frame->getMap($nc2RBlock['Nc2RegistrationBlock']['block_id']); + if (!$frameMap) { + $message = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2RBlock)); + $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); @@ -129,6 +144,12 @@ private function __saveRegistrationFromNc2($nc2Registrations) { $this->writeCurrent($frameMap, 'registrations'); + // 本来 Registrationの独自ビヘイビアMailSettingBehaviorでcreate()した方がよい。 + // とはいえ、ループで$Registration->saveRegistration()を繰り返し呼び出すのは、移行ツール位。 + // 移行ツールだけの対応でもメール設定が移行できるようにするため、ここでcreate()する + $Registration->MailSetting->create(); + $Registration->MailSettingFixedPhrase->create(); + if (!$Registration->saveRegistration($data)) { // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、 // ここでrollback @@ -143,7 +164,7 @@ private function __saveRegistrationFromNc2($nc2Registrations) { } // 登録処理で使用しているデータを空に戻す - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2RegistrationId = $nc2Registration['Nc2Registration']['registration_id']; $idMap = [ @@ -177,11 +198,12 @@ private function __saveRegistrationDataFromNc2($nc2RegistrationData) { $this->writeMigrationLog(__d('nc2_to_nc3', ' RegistrationData data Migration start.')); /* @var $Registration Registration */ - /* @var $Registration RegistrationAnswerSummary */ /* @var $Nc2RegistrationItemData AppModel */ $Registration = ClassRegistry::init('Registrations.Registration'); $RAnswerSummary = ClassRegistry::init('Registrations.RegistrationAnswerSummary'); $NcRItemData = $this->getNc2Model('registration_item_data'); + $Nc2ToNc3Map = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Map'); + $mapIdList = $Nc2ToNc3Map->getMapIdList('Registration'); foreach ($nc2RegistrationData as $nc2RegistrationDatum) { $RAnswerSummary->begin(); try { @@ -189,7 +211,16 @@ private function __saveRegistrationDataFromNc2($nc2RegistrationData) { $nc2RegistrationId = $nc2RegistrationDatum['Nc2RegistrationData']['registration_id']; $nc2DataId = $nc2RegistrationDatum['Nc2RegistrationData']['data_id']; $nc2ItemData = $NcRItemData->findAllByDataId($nc2DataId, null, null, -1); - $nc3Registration = $Registration->findById($nc2RegistrationId); + + // NC2のRegistrationIdから、NC3のRegistrationId取得. --> $mapIdList[$nc2RegistrationId] + if (!isset($mapIdList[$nc2RegistrationId])) { + $message = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2RegistrationDatum)); + $this->writeMigrationLog($message); + + $RAnswerSummary->rollback(); + continue; + } + $nc3Registration = $Registration->findById($mapIdList[$nc2RegistrationId]); $nc2ItemDataFirst = reset($nc2ItemData); $data = $this->generateNc3RegistrationAnswerSummaryData($nc2ItemDataFirst, $nc3Registration); @@ -248,7 +279,7 @@ private function __saveRegistrationAnswerFromNc2($nc2ItemData, $nc3Registration, /* @var $RegistrationAnswer RegistrationAnswer */ $RegistrationAnswer = ClassRegistry::init('Registrations.RegistrationAnswer'); //$RegistrationAnswer->begin(); - try { + try { $nc2ItemDataFirst = reset($nc2ItemData); $questionMap = $this->getQuestionMap($nc2ItemDataFirst, $nc3Registration); @@ -265,13 +296,101 @@ private function __saveRegistrationAnswerFromNc2($nc2ItemData, $nc3Registration, return false; } //$RegistrationAnswer->commit(); - } catch (Exception $ex) { + } catch (Exception $ex) { //$RegistrationAnswer->rollback(); throw $ex; - } + } $this->writeMigrationLog(__d('nc2_to_nc3', ' RegistrationAnswer data Migration end.')); return true; } + +/** + * Save Frame from Nc2. + * + * @param array $nc2RBlocks Nc2RegistrationBlock data. + * @return bool True on success + * @throws Exception + */ + private function __saveFrameFromNc2($nc2RBlocks) { + $this->writeMigrationLog(__d('nc2_to_nc3', ' Frame data Migration start.')); + + /* @var $Nc2ToNc3Frame Nc2ToNc3Frame */ + /* @var $Frame Frame */ + /* @var $Nc2ToNc3Map Nc2ToNc3Map */ + /* @var $Registration Registration */ + $Nc2ToNc3Frame = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Frame'); + $Frame = ClassRegistry::init('Frames.Frame'); + $Nc2ToNc3Map = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Map'); + $Registration = ClassRegistry::init('Registrations.Registration'); + foreach ($nc2RBlocks as $nc2RegistrationBlock) { + $Frame->begin(); + try { + $nc2BlockId = $nc2RegistrationBlock['Nc2RegistrationBlock']['block_id']; + $frameMap = $Nc2ToNc3Frame->getMap($nc2BlockId); + if (!$frameMap) { + $message = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2RegistrationBlock)); + $this->writeMigrationLog($message); + + $Frame->rollback(); + continue; + } + + // RegistrationFrameModelは存在しないが、移行済みデータのためにDummyModel名で取得 + $mapIdList = $Nc2ToNc3Map->getMapIdList('RegistrationFrame', $nc2BlockId); + if ($mapIdList) { + $Frame->rollback(); // 移行済み + continue; + } + + $nc2RegistrationId = $nc2RegistrationBlock['Nc2RegistrationBlock']['registration_id']; + $mapIdList = $Nc2ToNc3Map->getMapIdList('Registration', $nc2RegistrationId); + $nc3RegistrationId = Hash::get($mapIdList, [$nc2RegistrationId]); + $nc3Registration = $Registration->findById($nc3RegistrationId, ['block_id'], null, -1); + if (!$nc3Registration) { + $Frame->rollback(); // ブロックデータなし + continue; + } + + $data['Frame'] = [ + 'id' => $frameMap['Frame']['id'], + 'plugin_key' => 'registrations', + 'block_id' => $nc3Registration['Registration']['block_id'], + 'default_action' => 'registration_answers/view/', + ]; + // 前処理のFrame::data が残っている場合があるので、上書しとく。 + $Frame->read(array_keys($data['Frame']), $frameMap['Frame']['id']); + if (!$Frame->saveFrame($data)) { + // print_rはPHPMD.DevelopmentCodeFragmentに引っかかった。 var_exportは大丈夫らしい。。。 + // @see https://phpmd.org/rules/design.html + $message = $this->getLogArgument($nc2RBlocks) . "\n" . + var_export($Frame->validationErrors, true); + $this->writeMigrationLog($message); + + $Frame->rollback(); + continue; + } + + $idMap = [ + $nc2BlockId => $frameMap['Frame']['id'], + ]; + // RegistrationFrameModelは存在しないが、移行済みデータのためにDummyModel名で登録 + $this->saveMap('RegistrationFrame', $idMap); + + $Frame->commit(); + + } catch (Exception $ex) { + // NetCommonsAppModel::rollback()でthrowされるので、以降の処理は実行されない + // $QuestionnaireFrameSetting::savePage()でthrowされるとこの処理に入ってこない + $Frame->rollback($ex); + throw $ex; + } + } + + $this->writeMigrationLog(__d('nc2_to_nc3', ' Frame data Migration end.')); + + return true; + } + } diff --git a/Model/Nc2ToNc3Reservation.php b/Model/Nc2ToNc3Reservation.php index 423e855..3be76f7 100644 --- a/Model/Nc2ToNc3Reservation.php +++ b/Model/Nc2ToNc3Reservation.php @@ -70,13 +70,13 @@ public function migrate() { return false; } - if (!$this->_migrateLocationsRoom()) { - return false; - } + //if (!$this->_migrateLocationsRoom()) { + // return false; + //} - if (!$this->_migrateLocationReservable()) { - return false; - } + //if (!$this->_migrateLocationReservable()) { + // return false; + //} if (!$this->_migrateRrule()) { return false; @@ -198,7 +198,24 @@ protected function _migrateLocation() { $Nc2Model = $this->getNc2Model('reservation_location'); $nc2Records = $Nc2Model->find('all'); + $User = ClassRegistry::init('Users.User'); + $approvalUsers = $User->find('all', [ + 'conditions' => [ + 'User.role_key' => [ + 'system_administrator', + 'administrator' + ] + ], + 'fields' => ['User.id'], + 'recursive' => -1 + ]); + + $ApplovalUser = ClassRegistry::init('Reservations.ReservationLocationsApprovalUser'); + $Nc3Model = ClassRegistry::init('Reservations.ReservationLocation'); + + $LocationsReservable = ClassRegistry::init('Reservations.ReservationLocationReservable'); + foreach ($nc2Records as $nc2Record) { $Nc3Model->begin(); try { @@ -208,7 +225,7 @@ protected function _migrateLocation() { continue; } $Nc3Model->create(); - if (!$Nc3Model->save($data)) { + if (!$savedData = $Nc3Model->save($data)) { // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、ここでrollback $Nc3Model->rollback(); @@ -221,6 +238,48 @@ protected function _migrateLocation() { continue; } + // 承認者を登録しておく + $locationKey = $savedData['ReservationLocation']['key']; + foreach ($approvalUsers as $user) { + $approvalUser = [ + 'ReservationLocationsApprovalUser' => [ + 'location_key' => $locationKey, + 'user_id' => $user['User']['id'], + ] + ]; + $ApplovalUser->create(); + if (!$ApplovalUser->save($approvalUser)) { + $Nc3Model->rollback(); + + // print_rはPHPMD.DevelopmentCodeFragmentに引っかかった。var_exportは大丈夫らしい。。。 + // @see https://phpmd.org/rules/design.html + $message = $this->getLogArgument($approvalUser) . "\n" . + var_export($Nc3Model->validationErrors, true); + $this->writeMigrationLog($message); + continue; + } + } + + // Locationroomを移行する + $nc2LocationId = $nc2Record['Nc2ReservationLocation']['location_id']; + if (!$this->_migrateLocationsRoom($nc2LocationId, $savedData)) { + $Nc3Model->rollback(); + continue; + } + + // LocationReservableを登録する + if (!$this->_migrateLocationReservable($nc2LocationId, $savedData)) { + $Nc3Model->rollback(); + continue; + } + + //$data = $this->_generateNc3LocationReservable($nc2Record, $savedData); + ////$locationKey = $data['ReservationLocation']['key']; + //if (!$LocationsReservable->saveReservable($locationKey, $data)) { + // $Nc3Model->rollback(); + // continue; + //} + $nc2Id = $nc2Record['Nc2ReservationLocation']['location_id']; $idMap = [ $nc2Id => $Nc3Model->id @@ -275,7 +334,7 @@ protected function _generateNc3ReservationLocation($nc2Record) { 'language_id' => $this->getLanguageIdFromNc2(), 'category_id' => $categoryId, 'location_name' => $nc2Record['Nc2ReservationLocation']['location_name'], - 'detail' => $detail['Nc2ReservationLocationDetail']['description'], + 'detail' => $this->convertWYSIWYG($detail['Nc2ReservationLocationDetail']['description']), 'add_authority' => 0, // NC3では未使用 'time_table' => $this->_convertTimeTable($nc2Record['Nc2ReservationLocation']['time_table']), 'start_time' => $this->_convertLocationTime($nc2Record['Nc2ReservationLocation']['start_time']), @@ -298,20 +357,26 @@ protected function _generateNc3ReservationLocation($nc2Record) { /** * Migrate LocationsRoom * + * @param int $locationId 施設ID + * @param int $savedData 登録データ * @return bool * @throws Exception */ - protected function _migrateLocationsRoom() { + protected function _migrateLocationsRoom($locationId, $savedData) { $this->writeMigrationLog(__d('nc2_to_nc3', 'Reservation LocationsRoom start.')); $Nc2Model = $this->getNc2Model('reservation_location_rooms'); - $nc2Records = $Nc2Model->find('all'); + // NC2 location_idを元にそのlocation_roomsデータだけを移行する + $conditions = [ + 'location_id' => $locationId + ]; + $nc2Records = $Nc2Model->find('all', ['conditions' => $conditions]); $Nc3Model = ClassRegistry::init('Reservations.ReservationLocationsRoom'); foreach ($nc2Records as $nc2Record) { - $Nc3Model->begin(); + //$Nc3Model->begin(); try { - $data = $this->_generateNc3ReservationLocationsRoom($nc2Record); + $data = $this->_generateNc3ReservationLocationsRoom($nc2Record, $savedData); if (!$data) { $Nc3Model->rollback(); continue; @@ -331,7 +396,7 @@ protected function _migrateLocationsRoom() { // 関連テーブルなのでマッピングレコード不要 - $Nc3Model->commit(); + //$Nc3Model->commit(); } catch (Exception $ex) { // NetCommonsAppModel::rollback()でthrowされるので、以降の処理は実行されない @@ -349,18 +414,21 @@ protected function _migrateLocationsRoom() { * NC2 location_rooms dataからNC3 LocationsRoom dataを返す * * @param array $nc2Record NC2 location_room data + * @param array $nc3Location NC3の施設データ * @return array */ - protected function _generateNc3ReservationLocationsRoom($nc2Record) { + protected function _generateNc3ReservationLocationsRoom($nc2Record, $nc3Location) { $Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); - $Nc2ToNc3Map = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Map'); + //$Nc2ToNc3Map = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Map'); - $nc2LocationId = $nc2Record['Nc2ReservationLocationRoom']['location_id']; + //$nc2LocationId = $nc2Record['Nc2ReservationLocationRoom']['location_id']; // nc3location.id取得 - $mapIdList = $Nc2ToNc3Map->getMapIdList('ReservationLocation', $nc2LocationId); + //$mapIdList = $Nc2ToNc3Map->getMapIdList('ReservationLocation', $nc2LocationId); // ロケーションキー取得 - $ReservationLocation = ClassRegistry::init('Reservations.ReservationLocation'); - $location = $ReservationLocation->findById($mapIdList[$nc2LocationId]); + //$ReservationLocation = ClassRegistry::init('Reservations.ReservationLocation'); + //$location = $ReservationLocation->findById($mapIdList[$nc2LocationId]); + $location = $nc3Location; + $nc3LocationKey = $location['ReservationLocation']['key']; // nc3roomId取得 $nc2RoomId = $nc2Record['Nc2ReservationLocationRoom']['room_id']; @@ -394,22 +462,28 @@ protected function _generateNc3ReservationLocationsRoom($nc2Record) { /** * Migrate LocationReservable * + * @param int $nc2LocationId nc2の施設ID + * @param int $savedData 登録データ * @return bool * @throws Exception */ - protected function _migrateLocationReservable() { + protected function _migrateLocationReservable($nc2LocationId, $savedData) { $this->writeMigrationLog(__d('nc2_to_nc3', 'Reservation LocationReservable start.')); $Nc2Model = $this->getNc2Model('reservation_location'); - $nc2Records = $Nc2Model->find('all'); + $nc2Records = $Nc2Model->find('all', [ + 'conditions' => [ + 'location_id' => $nc2LocationId + ] + ]); $Nc3Model = ClassRegistry::init('Reservations.ReservationLocation'); $LocationsReservable = ClassRegistry::init('Reservations.ReservationLocationReservable'); foreach ($nc2Records as $nc2Record) { - $Nc3Model->begin(); + //$Nc3Model->begin(); try { - $data = $this->_generateNc3LocationReservable($nc2Record); + $data = $this->_generateNc3LocationReservable($nc2Record, $savedData); $locationKey = $data['ReservationLocation']['key']; @@ -656,6 +730,8 @@ protected function _generateNc3ReservationEvent($nc2Record) { $mapIdList = $Nc2ToNc3Map->getMapIdList('ReservationRrule', $nc2Detail['Nc2ReservationReserveDetail']['reserve_details_id']); $rruleId = $mapIdList[$nc2Detail['Nc2ReservationReserveDetail']['reserve_details_id']]; + $titleiCon = $this->convertTitleIcon($nc2Record['Nc2ReservationReserve']['title_icon']); + $titleiCon = ($titleiCon === null) ? '' : $titleiCon; $data = [ 'ReservationEvent' => [ 'reservation_rrule_id' => $rruleId, @@ -663,10 +739,10 @@ protected function _generateNc3ReservationEvent($nc2Record) { 'language_id' => $this->getLanguageIdFromNc2(), 'target_user' => $targetUser['User']['id'], 'title' => $nc2Record['Nc2ReservationReserve']['title'], - 'title_icon' => '', // TODO + 'title_icon' => $titleiCon, 'location' => '', 'contact' => $contact, - 'description' => $description, + 'description' => $this->convertWYSIWYG($description), 'is_allday' => $nc2Record['Nc2ReservationReserve']['allday_flag'], 'start_date' => $nc2Record['Nc2ReservationReserve']['start_date'], 'start_time' => $nc2Record['Nc2ReservationReserve']['start_time'], @@ -744,7 +820,7 @@ protected function _saveNc3ReservationFrameSettingFromNc2($nc2Records) { continue; } //  権限セットしてたらここで解除 - //unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + //unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2Id = $nc2Record['Nc2ReservationBlock']['block_id']; $idMap = [ @@ -802,6 +878,12 @@ protected function _generateNc3ReservationFrameSetting($nc2Record) { $Nc2ToNc3Frame = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Frame'); $frame = $Nc2ToNc3Frame->getMap($nc2Record['Nc2ReservationBlock']['block_id']); + if (!$frame) { + $message = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2Record)); + $this->writeMigrationLog($message); + return false; + } + $frameKey = $frame['Frame']['key']; // $categoryId @@ -888,7 +970,7 @@ protected function _saveNc3ReservationTimeframeFromNc2($nc2Timeframes) { $Timeframe->create(); - if (!$Timeframe->save($data)) { + if (!$Timeframe->saveTimeframe($data)) { // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、ここでrollback $Timeframe->rollback(); @@ -901,7 +983,7 @@ protected function _saveNc3ReservationTimeframeFromNc2($nc2Timeframes) { continue; } //  権限セットしてたらここで解除 - //unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + //unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2TimeframeId = $nc2Timeframe['Nc2ReservationTimeframe']['timeframe_id']; $idMap = [ @@ -943,9 +1025,9 @@ protected function _generateNc3ReservationTimeframe($nc2Timeframe) { 'ReservationTimeframe' => [ 'language_id' => $this->getLanguageIdFromNc2(), 'title' => $nc2Timeframe['Nc2ReservationTimeframe']['timeframe_name'], - 'start_time' => $this->_convertTimeframeTime( $nc2Timeframe['Nc2ReservationTimeframe']['start_time']), + 'start_time' => $this->_convertTimeframeTime( $nc2Timeframe['Nc2ReservationTimeframe']['start_time'], $nc2Timeframe['Nc2ReservationTimeframe']['timezone_offset']), // 150000形式からTIME形式→そのままでも入るので変換不要 - 'end_time' => $this->_convertTimeframeTime($nc2Timeframe['Nc2ReservationTimeframe']['end_time']), + 'end_time' => $this->_convertTimeframeTime($nc2Timeframe['Nc2ReservationTimeframe']['end_time'], $nc2Timeframe['Nc2ReservationTimeframe']['timezone_offset']), 'timezone' => $this->convertTimezone($nc2Timeframe['Nc2ReservationTimeframe']['timezone_offset']), 'color' => $nc2Timeframe['Nc2ReservationTimeframe']['timeframe_color'], 'created_user' => $Nc2ToNc3User->getCreatedUser($nc2Timeframe['Nc2ReservationTimeframe']), @@ -960,12 +1042,22 @@ protected function _generateNc3ReservationTimeframe($nc2Timeframe) { * convert TimeFrame time * * @param string $time 150000形式 + * @param float $timezoneOffset +12.0〜-12.0 * @return string */ - protected function _convertTimeframeTime($time) { + protected function _convertTimeframeTime($time, $timezoneOffset) { + // DBにはUTC時間で保存されてる + // saveTimeframe()にはtimezone で指定したタイムゾーンの時間で渡す $hour = substr($time, 0, 2); $min = substr($time, 2, 2); - return $hour . ':' . $min; + $time = $hour . ':' . $min; + + $userTimezone = $this->convertTimezone($timezoneOffset); + + $time = new DateTime($time, new DateTimeZone('UTC')); + $time->setTimezone(new DateTimeZone($userTimezone)); + $ret = $time->format('H:i'); + return $ret; } /** @@ -998,21 +1090,24 @@ protected function _convertTimeTable($timeTable) { * generate LocationReservable data * * @param array $nc2Record nc2location data + * @param array $nc3Location NC3の施設データ * @return array */ - protected function _generateNc3LocationReservable($nc2Record) { + protected function _generateNc3LocationReservable($nc2Record, $nc3Location) { $LocationsRoom = ClassRegistry::init('Reservations.ReservationLocationsRoom'); $RoomRole = ClassRegistry::init('Rooms.RoomRole'); - $Nc2ToNc3Map = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Map'); - $mapIdList = $Nc2ToNc3Map->getMapIdList('ReservationLocation'); + //$Nc2ToNc3Map = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Map'); + //$mapIdList = $Nc2ToNc3Map->getMapIdList('ReservationLocation'); - $Nc3Model = ClassRegistry::init('Reservations.ReservationLocation'); + //$Nc3Model = ClassRegistry::init('Reservations.ReservationLocation'); $data = []; - $location = $Nc3Model->findById( - $mapIdList[$nc2Record['Nc2ReservationLocation']['location_id']] - ); + //$location = $Nc3Model->findById( + // $mapIdList[$nc2Record['Nc2ReservationLocation']['location_id']] + //); + $location = $nc3Location; + $data['ReservationLocation'] = $location['ReservationLocation']; $locationKey = $location['ReservationLocation']['key']; @@ -1061,4 +1156,4 @@ protected function _generateNc3LocationReservable($nc2Record) { } return $data; } -} \ No newline at end of file +} diff --git a/Model/Nc2ToNc3Room.php b/Model/Nc2ToNc3Room.php index c36bfc1..83b5b0c 100644 --- a/Model/Nc2ToNc3Room.php +++ b/Model/Nc2ToNc3Room.php @@ -120,6 +120,12 @@ public function migrate() { // @see https://github.com/NetCommons3/Rooms/blob/3.1.0/Model/Room.php#L516 $this->changeNc3CurrentLanguage(); + // 既存のパブリックルームのTopを対応付け + if (!$this->__savePublicTopRoomFromNc2()) { + return false; + } + $this->saveExistingMap($nc2Pages); + foreach ($nc2Pages as $nc2Page) { if (!$this->__saveRoomFromNc2($nc2Page['Nc2Page']['lang_dirname'])) { $this->restoreNc3CurrentLanguage(); @@ -161,11 +167,6 @@ private function __saveRoomFromNc2($nc2LangDirName) { $Room = ClassRegistry::init('Rooms.Room'); $RolesRoomsUser = ClassRegistry::init('Rooms.RolesRoomsUser'); - if (!$this->__savePublicTopRoomFromNc2()) { - return false; - } - $this->saveExistingMap($nc2Pages); // 既存のパブリックルームのTopを対応付け - foreach ($nc2Pages as $nc2Page) { /* if (!$this->isMigrationRow($nc2User)) { @@ -403,6 +404,17 @@ private function __generateNc3NotExistsRooms($nc2Page) { $defaultRoleKey = $this->getNc3DefaultRoleKeyByNc2SpaceType($nc2SpaceType); } + $active = null; + if ($nc2Page['Nc2Page']['display_flag'] == '2') { + /* @see Room::beforeValidate() */ + // activeのvalidateはbooleanのため、display_flag = 2はエラーになる。 + // display_flag = 2 (プライベートスペース使用不可), 後からプライベートルーム使用不可にするとこのフラグ入る. データは残ってるため、非表示で移行 + // 理由不明だけど、リストアしたグループルームでdisplay_flag = 2を見かけた。 + $active = '0'; + } else { + $active = $nc2Page['Nc2Page']['display_flag']; + } + /* @var $Nc2ToNc3User Nc2ToNc3User */ $Nc2ToNc3User = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3User'); // root_idは親Roomのroot_idを引き継いでいるっぽいが、Migratoinで親Roomのroot_idが変わったため正常なroot_idが不明 @@ -412,7 +424,8 @@ private function __generateNc3NotExistsRooms($nc2Page) { 'space_id' => $spaceId, 'root_id' => $spaces[$spaceId]['Space']['room_id_root'], 'parent_id' => $parenId, - 'active' => $nc2Page['Nc2Page']['display_flag'], + //'active' => $nc2Page['Nc2Page']['display_flag'], + 'active' => $active, 'default_role_key' => $defaultRoleKey, 'need_approval' => $needApproval, 'default_participation' => $nc2Page['Nc2Page']['default_entry_flag'], diff --git a/Model/Nc2ToNc3RssReader.php b/Model/Nc2ToNc3RssReader.php index 5cfd551..ef1254b 100644 --- a/Model/Nc2ToNc3RssReader.php +++ b/Model/Nc2ToNc3RssReader.php @@ -107,6 +107,7 @@ private function __saveRssFromNc2($nc2RssBlocks) { $Frame->create(); $BlocksLanguage->create(); + $RssReader->create(); if (!$RssReader->saveRssReader($data)) { // 各プラグインのsave○○にてvalidation error発生時falseが返ってくるがrollbackしていないので、 // ここでrollback @@ -140,7 +141,7 @@ private function __saveRssFromNc2($nc2RssBlocks) { // 登録処理で使用しているデータを空に戻す $nc3RoomId = $frameMap['Frame']['room_id']; - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2RssBlockId = $nc2RssBlock['Nc2RssBlock']['block_id']; $idMap = [ diff --git a/Model/Nc2ToNc3Search.php b/Model/Nc2ToNc3Search.php index 1fec6db..b324816 100644 --- a/Model/Nc2ToNc3Search.php +++ b/Model/Nc2ToNc3Search.php @@ -93,7 +93,7 @@ private function __saveSearchFromNc2($nc2SearchBlocks) { try { $nc2BlockId = $nc2SearchBlock['Nc2SearchBlock']['block_id']; $frameMap = $Nc2ToNc3Frame->getMap($nc2BlockId); - if (!frameMap) { + if (!$frameMap) { $message = __d('nc2_to_nc3', '%s does not migration.', $this->getLogArgument($nc2SearchBlock)); $this->writeMigrationLog($message); @@ -125,7 +125,7 @@ private function __saveSearchFromNc2($nc2SearchBlocks) { // 登録処理で使用しているデータを空に戻す $nc3RoomId = $frameMap['Frame']['room_id']; - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2SearchBlockId = $nc2SearchBlock['Nc2SearchBlock']['block_id']; $idMap = [ diff --git a/Model/Nc2ToNc3Task.php b/Model/Nc2ToNc3Task.php index d6c75e1..325106f 100644 --- a/Model/Nc2ToNc3Task.php +++ b/Model/Nc2ToNc3Task.php @@ -155,7 +155,7 @@ private function __saveTaskFromNc2($nc2TodoDatas) { // 登録処理で使用しているデータを空に戻す $nc3RoomId = $frameMap['Frame']['room_id']; - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2TodoId = $nc2TodoData['Nc2Todo']['todo_id']; $idMap = [ @@ -237,7 +237,7 @@ private function __saveTaskContentFromNc2($nc2TodoTasks) { $nc3RoomId = $mapIdList[$nc2RoomId]; // @see https://github.com/NetCommons3/Workflow/blob/3.1.0/Model/Behavior/WorkflowBehavior.php#L171-L175 Current::write('Room.id', $nc3RoomId); - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; // 一応Model::validatの初期化 $TaskContent->validate = []; @@ -251,7 +251,7 @@ private function __saveTaskContentFromNc2($nc2TodoTasks) { continue; } - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2TaskId = $nc2TodoTask['Nc2TodoTask']['task_id']; $idMap = [ diff --git a/Model/Nc2ToNc3Topic.php b/Model/Nc2ToNc3Topic.php index 28bdae7..f7379eb 100644 --- a/Model/Nc2ToNc3Topic.php +++ b/Model/Nc2ToNc3Topic.php @@ -111,7 +111,7 @@ private function __saveTopicBlockFromNc2($nc2WhatsnewBlocks) { // 登録処理で使用しているデータを空に戻す $nc3RoomId = $frameMap['Frame']['room_id']; - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $idMap = [ $nc2BlockId => $TopicFrameSetting->id, @@ -130,4 +130,4 @@ private function __saveTopicBlockFromNc2($nc2WhatsnewBlocks) { return true; } -} \ No newline at end of file +} diff --git a/Model/Nc2ToNc3Upload.php b/Model/Nc2ToNc3Upload.php index 72686d9..79e8a7a 100644 --- a/Model/Nc2ToNc3Upload.php +++ b/Model/Nc2ToNc3Upload.php @@ -69,7 +69,7 @@ public function generateUploadFile($nc2UploadId) { return $data; } - $name = $nc2Upload['Nc2Upload']['file_name']; + $name = $nc2Upload['Nc2Upload']['physical_file_name']; $Nc2ToNc3 = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3'); $tmpName = Hash::get($Nc2ToNc3->data, ['Nc2ToNc3', 'upload_path']) . @@ -78,7 +78,7 @@ public function generateUploadFile($nc2UploadId) { if (!is_readable($tmpName)) { $message = __d('nc2_to_nc3', '%s not found .', 'Nc2Upload upload_id:' . $nc2Upload['Nc2Upload']['upload_id']); - $this->writeMigrationLog($message); + $this->writeMigrationLog($message . ' - ' . $tmpName); return $data; } @@ -117,4 +117,4 @@ public function getNc2UploadByUploadId($nc2UploadId) { return $nc2Upload; } -} \ No newline at end of file +} diff --git a/Model/Nc2ToNc3User.php b/Model/Nc2ToNc3User.php index ce50472..3cff994 100644 --- a/Model/Nc2ToNc3User.php +++ b/Model/Nc2ToNc3User.php @@ -88,7 +88,7 @@ public function beforeValidate($options = array()) { // https://github.com/cakephp/cakephp/blob/2.9.4/lib/Cake/Model/Validator/CakeValidationSet.php#L131 $this->set('database'); - $this->validate = Hash::merge( + $this->validate = ValidateMerge::merge( $this->validate, [ 'database' => [ @@ -615,7 +615,7 @@ private function __saveRoomAndPageFromNc2($nc2User, $nc3UserId) { // Page.slugに設定すれば良い? // @see https://github.com/NetCommons3/Pages/blob/3.0.1/Controller/PagesEditController.php#L151 // @see https://github.com/NetCommons3/Pages/blob/3.0.1/Model/Behavior/PageSaveBehavior.php#L49-L68 - $nc3Page['Page']['slug'] = $Nc2ToNc3Page->convertPermalink($nc2Page['Nc2Page']['permalink']); + $nc3Page['Page']['slug'] = $Nc2ToNc3Page->getConvertSlug($nc2Page['Nc2Page']['permalink']); unset($nc3Page['Page']['theme']); // themeのvalidationに引っかかる if (!$Page->savePage($nc3Page)) { diff --git a/Model/Nc2ToNc3UserRole.php b/Model/Nc2ToNc3UserRole.php index 2dc7e48..1aa4c74 100644 --- a/Model/Nc2ToNc3UserRole.php +++ b/Model/Nc2ToNc3UserRole.php @@ -69,6 +69,44 @@ public function getMap($nc2RoleAuthorityIds = null) { ] ] ]; + + // Nc2Authority.user_authority_id:5(管理者)は全てadministrator + /* @var $Nc2Authority AppModel */ + $Nc2Authority = $this->getNc2Model('authorities'); + $nc2Administrators = $Nc2Authority->findAllBySystemFlagAndUserAuthorityId( + '0', + '5', + 'role_authority_id', + null, + null, + null, + -1 + ); + foreach ($nc2Administrators as $nc2Administrator) { + $nc2AuthorityId = $nc2Administrator['Nc2Authority']['role_authority_id']; + $this->__map[$nc2AuthorityId] = [ + 'UserRoleSetting' => [ + 'role_key' => 'administrator' + ] + ]; + } + + //NetCommons 3.1.4以降、会員権限にゲスト権限(guest_user)を追加したため、ゲストはゲストで移行する + //ただし、NC3の権限管理でゲスト権限を削除した場合は、一般権限(common_user)にする + $UserRole = ClassRegistry::init('UserRoles.UserRole'); + $count = $UserRole->find('count', [ + 'recursive' => -1, + 'conditions' => [ + 'key' => 'guest_user' + ], + ]); + if ($count > 0) { + $this->__map['5'] = [ + 'UserRoleSetting' => [ + 'role_key' => 'guest_user' + ] + ]; + } } if (!isset($nc2RoleAuthorityIds)) { diff --git a/Model/Nc2ToNc3Video.php b/Model/Nc2ToNc3Video.php index 3dfa41a..9c6b6e6 100644 --- a/Model/Nc2ToNc3Video.php +++ b/Model/Nc2ToNc3Video.php @@ -53,7 +53,13 @@ class Nc2ToNc3Video extends Nc2ToNc3AppModel { public function migrate() { $this->writeMigrationLog(__d('nc2_to_nc3', 'Video Migration start.')); - /* @var $Nc2Video AppModel */ + /* @var $Nc2ToNc3Plugin Nc2ToNc3Plugin */ + $Nc2ToNc3Plugin = ClassRegistry::init('Nc2ToNc3.Nc2ToNc3Plugin'); + $pluginMap = $Nc2ToNc3Plugin->getMap(); + if (!Hash::extract($pluginMap, '{n}.Plugin[key=videos]')) { + $this->writeMigrationLog(__d('nc2_to_nc3', 'Multimedia is not installed.')); + return true; + } /* @var $Nc2MultimediaBlock AppModel */ $Nc2Multimedia = $this->getNc2Model('multimedia'); @@ -123,7 +129,7 @@ private function __saveNc3VideoSettingFromNc2($nc2Multimedias) { //$nc3RoomId = $nc3Room['Room']['id']; Current::write('Room.id', $nc3RoomId); - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; $BlocksLanguage->create(); //$VideoFrameSetting->create(); @@ -147,7 +153,7 @@ private function __saveNc3VideoSettingFromNc2($nc2Multimedias) { $VideoSetting->rollback(); continue; } - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2MultimediaId = $nc2Multimedia['Nc2Multimedia']['multimedia_id']; $idMap = [ @@ -276,7 +282,7 @@ private function __saveNc3VideoDataFromNc2($nc2MultimediaItems) { $Block->create(); $Topic->create(); - CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; + Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value'] = true; // Hash::merge で VideoEntry::validate['publish_start']['datetime']['rule']が // ['datetime','datetime'] になってしまうので初期化 @@ -299,7 +305,7 @@ private function __saveNc3VideoDataFromNc2($nc2MultimediaItems) { continue; } - unset(CurrentBase::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); + unset(Current::$permission[$nc3RoomId]['Permission']['content_publishable']['value']); $nc2ItemId = $nc2MultimediaItem['Nc2MultimediaItem']['item_id']; $idMap = [ @@ -323,4 +329,4 @@ private function __saveNc3VideoDataFromNc2($nc2MultimediaItems) { return true; } -} \ No newline at end of file +} diff --git a/README.md b/README.md index 3d6ef09..7017b67 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,84 @@ Nc2ToNc3 ============== -Migration plugin to Nc3 from Nc2 for NetComomns3 +[![Tests Status](https://github.com/NetCommons3/Nc2ToNc3/actions/workflows/tests.yml/badge.svg?branch=master)](https://github.com/NetCommons3/Nc2ToNc3/actions/workflows/tests.yml) +[![Coverage Status](https://coveralls.io/repos/NetCommons3/Nc2ToNc3/badge.svg?branch=master)](https://coveralls.io/r/NetCommons3/Nc2ToNc3?branch=master) +[![Stable Version](https://img.shields.io/packagist/v/netcommons/nc2-to-nc3.svg?label=stable)](https://packagist.org/packages/netcommons/nc2-to-nc3) -## 説明 +Nc2ToNc3(移行ツール)は、同一サーバにNC2のデータとNC3サイトを用意して移行するプラグインです。 +NC2最新版(2.4.2.1)からNC3最新版に移行します。 + +### 手順 + +1. [NC2を最新版にアップデート](#nc2を最新版にアップデート) +1. [NC2の準備](#nc2の準備) +1. [NC3の準備](#nc3の準備) +1. [NC3のバックアップ](#nc3のバックアップ) +1. [移行ツール実行](#移行ツール実行) + +#### NC2を最新版にアップデート + +NC2が最新版でなかったら、最新版2.4.2.1にアップデートします。 + +[NC2を最新版2.4.2.1にアップデート(外部リンク)](https://github.com/netcommons/NetCommons2/releases) + +#### NC2の準備 + +現状NC2のDB及びNC2のアップロードファイルを取得して、NC3と同じ環境にDBインポート及びファイル配置をしてください。 + +#### NC3の準備 + +NC3を新規インストールします。[NC3インストール(外部リンク)](https://www.netcommons.org/NetCommons3/download#!#frame-83) + +NC3を既にインストール済みの場合、最新版にアップデートします。[NC3アップデート(外部リンク)](https://www.netcommons.org/NetCommons3/download#!#frame-156) + +Nc2ToNc3は、app/Plugin配下に配置されています。 ``` -cakeコマンドのパス/cake Nc2ToNc3 --database NC2のDB名 --prefix NC2のテーブルプレフィックス名 --upload_path NC2のアップロードファイルフォルダーパス --base_url NC2のベースURL --nc3base NC3のベースパス +NetCommons3のパス/app/Plugin/Nc2ToNc3 ``` -Ex.) + +#### NC3のバックアップ + +**※ 必ずNC3のDB、および、NC3のアップロードファイルをバックアップして、いつでもリストアできるようにしてから実行してください。** + +## 移行ツール実行 + ``` -./Console/cake Nc2ToNc3 --database nc2421 --prefix nc_ --upload_path /var/www/html/NC2/html/webapp/uploads/ --base_url http://example.com/NC2/html --nc3base /nc3 +cd NetCommons3のパス/app +./Console/cake Nc2ToNc3 --database NC2のDB名 --prefix NC2のテーブル名のprefix --upload_path NC2でアップロードしたファイルがあるディレクトリ --base_url NC2のベースURL --nc3base NC3のベースパス ``` -シェルからの実行は、現状NC2のダンプファイルをNC3のDBと同じ環境にインポートして実行してください。 +**オプション** -~~CakePHPのMigrationを実行すると、管理画面に「NC2からの移行」メニューが追加され、画面から実行可能になります。~~ -~~画面からの実行は別環境のDBへも接続可能です。~~ +| | 意味 |値の例 +|---------------| --------------------------------------------------- | ------ +|--database |NC2のDB名 |nc2421 +|--prefix |NC2の(DB内の)テーブル名のprefix |nc_ +|--upload_path |NC2でアップロードしたファイルがあるディレクトリ |/var/www/html/nc2/html/webapp/uploads/ +|--base_url |NC2のベースURL |http://example.com/nc2/html +|--nc3base |NC3のベースパス(ドキュメントルートからの相対パス) | /nc3 -開発中につき、必ずNc3のDB、および、NC3のアップロードファイルをバックアップして、いつでもリストアできるようにしてから実行してください。 +### 例) +**環境例** + +| | URL |DB名 |prefix |ドキュメントルート +|---------| --------------------------- | ------ | ------- | ------ +|NC2 |http://example.com/nc2/html |nc2421 |nc |/var/www/html/nc2/ +|NC3 |http://example.com/nc3 |nc3 |なし |/var/www/html/nc3/ + +**コマンド例** -nc2_to_nc3_mapsテーブルを修正しました。 -map→nc3_id -nc2_to_nc3_mapsを一度削除して、再度Migrationを実行してください。 ``` -cakeコマンドのパス/cake Migrations.migration run -p Nc2ToNc3 -c master -i master +cd /var/www/html/nc3/app +./Console/cake Nc2ToNc3 --database nc2421 --prefix nc_ --upload_path /var/www/html/nc2/html/webapp/uploads/ --base_url http://example.com/nc2/html --nc3base /nc3 ``` +#### 不具合情報 + +現在確認されている不具合は、[GithubのNetCommons3リポジトリのissue、zz Nc2ToNc3(移行ツール)ラベル](https://github.com/NetCommons3/NetCommons3/issues?q=is%3Aissue+is%3Aopen+label%3A%22zz+Nc2ToNc3%EF%BC%88%E7%A7%BB%E8%A1%8C%E3%83%84%E3%83%BC%E3%83%AB%EF%BC%89%22)で確認できます。 + +#### ドキュメント + +[データ対応表.pdf](https://github.com/NetCommons3/NetCommons3Docs/blob/gh-pages/NC2toNC3/%E3%83%87%E3%83%BC%E3%82%BF%E5%AF%BE%E5%BF%9C%E8%A1%A8.pdf) diff --git a/Test/Case/AllNc2ToNc3Test.php b/Test/Case/AllNc2ToNc3Test.php new file mode 100644 index 0000000..7fc445e --- /dev/null +++ b/Test/Case/AllNc2ToNc3Test.php @@ -0,0 +1,33 @@ + + * @link http://www.netcommons.org NetCommons Project + * @license http://www.netcommons.org/license.txt NetCommons License + * @copyright Copyright 2014, NetCommons Project + */ + +App::uses('NetCommonsTestSuite', 'NetCommons.TestSuite'); + +/** + * Nc2ToNc3 All Test Case + * + * @author Mitsuru Mutaguchi + * @package NetCommons\Nc2ToNc3\Test\Case + * @codeCoverageIgnore + */ +class AllNc2ToNc3Test extends CakeTestSuite { + +/** + * All test suite + * + * @return CakeTestSuite + */ + public static function suite() { + $plugin = preg_replace('/^All([\w]+)Test$/', '$1', __CLASS__); + $suite = new NetCommonsTestSuite(sprintf('All %s Plugin tests', $plugin)); + $suite->addTestDirectoryRecursive(CakePlugin::path($plugin) . 'Test' . DS . 'Case'); + return $suite; + } +} diff --git a/Test/Fixture/empty b/Test/Fixture/empty new file mode 100644 index 0000000..e69de29 diff --git a/VERSION.txt b/VERSION.txt new file mode 100644 index 0000000..86fb650 --- /dev/null +++ b/VERSION.txt @@ -0,0 +1 @@ +3.3.7 diff --git a/View/Nc2ToNc3/migration.ctp b/View/Nc2ToNc3/migration.ctp index 425b0bd..c8361c5 100644 --- a/View/Nc2ToNc3/migration.ctp +++ b/View/Nc2ToNc3/migration.ctp @@ -9,98 +9,6 @@ */ ?> -NetCommonsForm->create('Nc2ToNc3'); ?> -
-
- -
- -
- NetCommonsForm->input( - 'database', - [ - 'label' => __d('nc2_to_nc3', 'Database'), - 'required' => true, - ] - ); - echo $this->NetCommonsForm->input('prefix', ['label' => __d('nc2_to_nc3', 'Prefix')]); - ?> - -
- -
-
- MessageFlash->description( - __d('nc2_to_nc3', 'Change that below, if it is different from NetCommons3.') - ); - /* tinyint(1)をbooleanにしないDboSourceを使用するようにしたため不要 - echo $this->NetCommonsForm->input( - 'datasource', - [ - 'type' => 'select', - 'label' => __d('nc2_to_nc3', 'Datasource'), - 'options' => [ - 'Database/Mysql' => 'Mysql', - //'Database/Postgres' => 'Postgresql' // Installプラグインもコメントになっていたので合わせた - ] - ] - ); - */ - echo $this->NetCommonsForm->input('host', ['label' => __d('nc2_to_nc3', 'Host')]); - echo $this->NetCommonsForm->input('port', ['label' => __d('nc2_to_nc3', 'Port')]); - echo $this->NetCommonsForm->input('login', ['label' => __d('nc2_to_nc3', 'Login')]); - echo $this->NetCommonsForm->input('password', ['label' => __d('nc2_to_nc3', 'Password')]); - - echo $this->Form->hidden('persistent'); - echo $this->Form->hidden('encoding'); - echo $this->Form->hidden('schema'); // PostgreSQL データベース利用時のみらしいがDATABASE_CONFIGにあったので残す - ?> -
-
-
-
- -
-
- -
- -
- NetCommonsForm->input('upload_path', - [ - 'label' => __d('nc2_to_nc3', 'Upload file path'), - 'required' => true, - ] - ); - - echo $this->NetCommonsForm->input( - 'base_url', - [ - 'label' => __d('nc2_to_nc3', 'Base url'), - 'required' => true, - 'help' => __d('nc2_to_nc3', 'Input URL of NetCommons2 for converting link in WYSIWYG content.') - ] - ); - - // item.iniファイル定数取得処理未実装 - echo $this->Form->hidden('items_ini_path'); - /* - echo $this->NetCommonsForm->input( - 'items_ini_path', - [ - 'label' => __d('nc2_to_nc3', 'items.ini file path'), - 'help' => __d('nc2_to_nc3', 'If you do not enter it, use the default value.'), - ] - ); - */ - ?> -
-
- - -NetCommonsForm->end(); + + + \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..277625a --- /dev/null +++ b/composer.json @@ -0,0 +1,72 @@ +{ + "name": "netcommons/nc2-to-nc3", + "description": "Nc2ToNc3 Plugin for NetCommons3", + "type": "cakephp-plugin", + "keywords": [ + "cakephp", + "nc2-to-nc3" + ], + "homepage": "http://www.netcommons.org/", + "license": "LicenseRef-NetCommons", + "license-ref-net-commons": "https://raw.githubusercontent.com/NetCommons3/NetCommons3/master/license.txt", + "extra": { + "installer-paths": { + "app/Plugin/{$name}": [ + "type:cakephp-plugin" + ] + } + }, + "require": { + "cakedc/migrations": "~2.2", + "netcommons/access-counters": "@dev", + "netcommons/announcements": "@dev", + "netcommons/auth-general": "@dev", + "netcommons/bbses": "@dev", + "netcommons/blogs": "@dev", + "netcommons/cabinets": "@dev", + "netcommons/calendars": "@dev", + "netcommons/categories": "@dev", + "netcommons/circular-notices": "@dev", + "netcommons/content-comments": "@dev", + "netcommons/faqs": "@dev", + "netcommons/frames": "@dev", + "netcommons/iframes": "@dev", + "netcommons/links": "@dev", + "netcommons/menus": "@dev", + "netcommons/multidatabases": "@dev", + "netcommons/pages": "@dev", + "netcommons/net-commons": "@dev", + "netcommons/photo-albums": "@dev", + "netcommons/questionnaires": "@dev", + "netcommons/quizzes": "@dev", + "netcommons/registrations": "@dev", + "netcommons/reservations": "@dev", + "netcommons/rooms": "@dev", + "netcommons/rss-readers": "@dev", + "netcommons/searches": "@dev", + "netcommons/tasks": "@dev", + "netcommons/topics": "@dev", + "netcommons/files": "@dev", + "netcommons/users": "@dev", + "netcommons/user-attributes": "@dev", + "netcommons/user-roles": "@dev", + "netcommons/videos": "@dev", + "netcommons/blocks": "@dev", + "netcommons/likes": "@dev" + }, + "authors": [ + { + "name": "kteraguchi", + "email": "kteraguchi@commonsnet.org", + "homepage": "https://github.com/kteraguchi", + "role": "Developer" + }, + { + "name": "NetCommons Community", + "homepage": "http://www.netcommons.org" + } + ], + "config": { + "vendor-dir": "vendors" + } +} \ No newline at end of file diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 0000000..ac0b31d --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,22 @@ + + + + + + + + app/Plugin/Nc2ToNc3 + app/Plugin/Nc2ToNc3 + + app/Plugin/Nc2ToNc3/Config/Migration + app/Plugin/Nc2ToNc3/Config/Schema + app/Plugin/Nc2ToNc3/Test/Case + app/Plugin/Nc2ToNc3/Test/Fixture + + + + + + + +