').css({'text-align': 'center'}).attr('id', key);\n var img = $('
![]()
').attr('src', $.bcUtil.ajaxLoaderPath);\n div.html(img);\n $(selector).html(div);\n break;\n case 'after':\n var img = $('
![]()
').attr('src', $.bcUtil.ajaxLoaderSmallPath).attr('id', key).css({\n 'width':'16px',\n 'vertical-align': 'middle',\n 'margin':'5px'\n });\n $(selector).after(img);\n break;\n case 'target':\n $(selector).show();\n break;\n case 'none':\n break;\n }\n },\n\n /**\n * ローダーを隠す\n */\n hideLoader: function (type, selector, key) {\n if (type == undefined || (type != 'none' && selector == undefined)) {\n type = 'over';\n }\n switch (type) {\n case 'over':\n $(\"#Waiting\").hide();\n break;\n case 'inner':\n $(\"#\" + key).remove();\n break;\n case 'after':\n $(\"#\" + key).remove();\n break;\n case 'target':\n $(selector).show();\n break;\n case 'none':\n break;\n }\n },\n\n /**\n * Ajax\n */\n ajax: function (url, success, config) {\n if (!config) {\n config = {};\n }\n var loaderType, loaderSelector, loaderKey;\n var hideLoader = true;\n if (typeof config.loaderType !== 'undefined') {\n loaderType = config.loaderType;\n delete config.loaderType;\n }\n if (typeof config.loaderSelector !== 'undefined') {\n loaderSelector = config.loaderSelector;\n delete config.loaderSelector;\n loaderKey = loaderSelector.replace(/\\./g, '').replace(/#/g, '').replace(/\\s/g, '') + 'loaderkey';\n }\n if (typeof config.hideLoader !== 'undefined') {\n hideLoader = config.hideLoader;\n delete config.loaderType;\n }\n var ajaxConfig = {\n url: url,\n headers: {\n \"Authorization\": $.bcJwt.accessToken,\n },\n type: 'POST',\n dataType: 'html',\n beforeSend: function () {\n $.bcUtil.showLoader(loaderType, loaderSelector, loaderKey);\n },\n complete: function () {\n if (hideLoader) {\n $.bcUtil.hideLoader(loaderType, loaderSelector, loaderKey);\n }\n },\n error: function (XMLHttpRequest, textStatus, errorThrown) {\n $.bcUtil.showAjaxError(bcI18n.commonExecFailedMessage, XMLHttpRequest, errorThrown);\n },\n success: success\n };\n if (config) {\n $.extend(ajaxConfig, config);\n }\n return $.ajax(ajaxConfig);\n },\n\n /**\n * Ajax のエラーメッセージを表示\n *\n * @param XMLHttpRequest\n * @param errorThrown\n * @param message\n */\n showAjaxError: function (message, XMLHttpRequest, errorThrown) {\n var errorMessage = '';\n if (XMLHttpRequest !== undefined && XMLHttpRequest.status) {\n errorMessage = '
(' + XMLHttpRequest.status + ') ';\n }\n if(XMLHttpRequest !== undefined && XMLHttpRequest.responseJSON){\n errorMessage += XMLHttpRequest.responseJSON.message;\n }\n if (XMLHttpRequest !== undefined && XMLHttpRequest.responseText) {\n errorMessage += '
' + XMLHttpRequest.responseText;\n } else if (errorThrown !== undefined) {\n errorMessage += '
' + errorThrown;\n }\n $.bcUtil.showAlertMessage(message + errorMessage);\n },\n\n /**\n * フラッシュメッセージをセットする\n *\n * 一度しか表示できないメッセージ\n * @param message\n */\n setFlashMessage: function(message) {\n Cookies.set('bcFlashMessage', message);\n },\n\n /**\n * フラッシュメッセージを表示する\n *\n * 一度表示したら削除する\n */\n showFlashMessage: function () {\n let message = Cookies.get('bcFlashMessage');\n if(message !== undefined) {\n this.showNoticeMessage(message);\n Cookies.remove('bcFlashMessage')\n }\n }\n\n };\n})(jQuery);\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t369: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkbc_admin_third\"] = self[\"webpackChunkbc_admin_third\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [339], () => (__webpack_require__(538)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","$","baseUrl","attr","jQuery","changeRow","checkbox","undefined","parent","addClass","removeClass","toolChangeHandler","config","bcBatch","methodSelect","val","executeButton","removeAttr","prop","batchUrl","listTable","checkAll","targetCheckbox","alertBox","loader","flashBox","init","extend","this","initList","unbind","click","length","alert","bcI18n","commonSelectDataFailedMessage","confirm","batchConfirmMessage","form","append","clone","each","value","replace","bcToken","check","key","ajax","url","headers","bcJwt","accessToken","type","data","serialize","dataType","beforeSend","bcUtil","hideMessage","showLoader","success","result","setFlashMessage","message","location","reload","error","XMLHttpRequest","textStatus","errorThrown","errorMessage","status","commonNotFoundProgramMessage","responseText","JSON","parse","remove","showAlertMessage","commonBatchExecFailedMessage","hideLoader","useUpdate","change","find","e","stopPropagation","initRowSelected","bcCkeditor","editor","initStatus","styleInitStatus","show","setUpConfig","CKEDITOR","addStylesSet","initialStyle","editorStyle","map","themeEditorCsses","css","Array","isArray","contentsCss","push","ckeditorField","editorDomId","editorOptions","setUpDraft","setUpToolBar","allowedContent","extraPlugins","stylesCombo_stylesSet","editorStylesSet","protectedSource","dtd","$removeEmpty","editorUrl","templates_files","editorEnterBr","enterMode","ENTER_BR","editorUseDraft","on","draftAreaId","draftDraftAreaId","publishAreaId","draftPublishAreaId","editorReadonlyPublish","draftReadOnlyPublish","editorDisableDraft","execCommand","editorDisablePublish","name","previewModeId","getCommand","uiItems","state","hide","bcConfirm","title","bcConfirmTitle1","bcConfirmAlertMessage1","defaultCancel","ok","html","dialog","modal","width","buttons","bcConfirmAlertMessage2","bcCredit","adminBaseUrl","hideTarget","isLogin","$html","$page","$credit","openedFavorite","prepend","$creditScroller","fadeIn","fadeOut","setViewSize","window","resize","resizeScroll","height","posX","id","setInterval","clearInterval","clearTimeout","event","cancelBubble","$toolBar","outerHeight","$body","refreshToken","localStorage","getItem","getToken","login","email","password","saved","successCallback","errorCallback","apiBaseUrl","done","response","setToken","access_token","refresh_token","bind","fail","async","setItem","logout","removeToken","bcSortable","updateSortUrl","sortHandle","sortTable","sortable","sortableOptions","scroll","items","opacity","zIndex","containment","tolerance","distance","cursor","handle","placeholder","revert","start","sortStartHandler","update","sortUpdateHandler","ui","item","target","offset","index","sortId","sortOffset","getHiddenToken","i","v","complete","bcTimeUtil","getNowDateTime","getNowDate","getNowTime","date","Date","year","getFullYear","month","getMonth","day","getDate","hour","getHours","minute","getMinutes","requested","requesting","defaultUrl","setTokenUrl","callback","timer","execCallback","_config","loaderType","always","getForm","options","fields","unlocked","debug","submitToken","submit","replaceLinkToSubmitToken","selector","match","get","onclick","postLinkForm","bcTree","shiftOnAnchor","ctrlOnAnchor","contextmenuAddOnly","settings","dropTarget","dragTarget","treeDom","jsTree","listDisplayed","beforeParentId","beforePosition","currentSiteId","isAdmin","isUseMoveContents","adminPrefix","editInIndexDisabled","_inited","load","_init","trigger","parseJSON","createTree","jstree","old_parent","old_position","updateShiftAndCtrlOnAnchor","nodeId","closest","get_node","alias","contentType","editDisabled","openUrl","contentId","createLink","baserCorePrefix","contentParentId","contentEntityId","isAliasMenuByLabel","trim","text","after","isAddMenuByLabel","refreshTree","destroy","operation","node","node_parent","node_position","more","contentSiteRoot","mode","get_parent","manageDisabled","editUrl","manageUrl","copyUrl","isEnabled","deleteLabel","menu","contentFullUrl","label","bcTreeCheck","obj","related","bcTreeUnpublish","siteId","contentSiteId","_csrfToken","showAjaxError","commonChangePublishFailedMessage","bcTreePublish","bcTreeManage","bcTreeRename","renameContent","bcTreeEdit","bcTreeCopy","copyContent","bcTreeDelete","bcTreeToTrash","deleteDisabled","bcTreeConfirmToTrash","bcTreeConfirmDeleteAlias","deleteContent","_disabled","bcTreeUndo","contentAliasId","exists","returnContent","bcTreeAlertMessage1","bcTreeEmptyTrash","bcTreeConfirmMessage1","empty","nodes","delete_node","showNoticeMessage","bcTreeInfoMessage1","bcTreeAlertMessage2","Default","ContentAlias","addMenu","counter","maxContents","addDisabled","createMenu","get_selected","multiple","disableCheck","treeData","get_json","flat","sort","decodeURIComponent","deselect_all","select_node","show_contextmenu","pageX","pageY","forceBlank","open","href","setting","current","iconAdd","iconMenu","contentTitle","bcTreeNewTitle","sprintf","contentPlugin","plugin","icon","separatorBefore","separatorAfter","bcTreeAliasTitle","separator_before","separator_after","action","createContent","_data","bcTreeUnNamedTitle","create_node","edit","editNode","content","parent_id","site_id","alias_id","entity_id","fillExtraData","bcTreeAlertMessage6","then","decodeURI","fullUrl","postData","settingData","extra","folder_template","page_template","contents","draft","code","encodeURI","param","bcTreeAlertMessage4","bcTreeCopyTitle","content_id","newNode","commonCopyFailedMessage","defaultTitle","first","oldTitle","newTitle","rename_node","bcTreeAlertMessage5","base","orderContent","changeNormalCursor","cancel","element","oldSort","commonSortSaveConfirmMessage","move_node","open_node","nextNode","get_next_dom","targetId","origin","parentId","entityId","commonSortSaveFailedMessage","showMenuByOuter","shiftKey","ctrlKey","metaKey","changeDnDCursor","addEventListener","componentId","tmpl","document","querySelector","dataStore","getElementById","textContent","console","warn","menuList","contentList","systemList","forEach","hidden","isSystemSettingPage","some","expanded","app","Vue","el","systemExpanded","baseURL","methods","openSystem","disabledHideMessage","ajaxLoaderPath","ajaxLoaderSmallPath","adminScript","frontFullUrl","div","img","loaderSelector","loaderKey","ajaxConfig","commonExecFailedMessage","responseJSON","Cookies","showFlashMessage","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","Object","keys","every","splice","r","d","definition","o","defineProperty","enumerable","g","globalThis","Function","prototype","hasOwnProperty","Symbol","toStringTag","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","self","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"admin/common.bundle.js","mappings":"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","sources":["webpack://bc-admin-third/webpack/runtime/chunk loaded","webpack://bc-admin-third/./src/js/admin/_lib/jquery.baseUrl.js","webpack://bc-admin-third/./src/js/admin/_lib/jquery.bcBatch.js","webpack://bc-admin-third/./src/js/admin/_lib/jquery.bcCkeditor.js","webpack://bc-admin-third/./src/js/admin/_lib/jquery.bcConfirm.js","webpack://bc-admin-third/./src/js/admin/_lib/jquery.bcCredit.js","webpack://bc-admin-third/./src/js/admin/_lib/jquery.bcJwt.js","webpack://bc-admin-third/./src/js/admin/_lib/jquery.bcSortable.js","webpack://bc-admin-third/./src/js/admin/_lib/jquery.bcTimeUtil.js","webpack://bc-admin-third/./src/js/admin/_lib/jquery.bcToken.js","webpack://bc-admin-third/./src/js/admin/_lib/jquery.bcTree.js","webpack://bc-admin-third/./src/js/admin/_module/sidebar.js","webpack://bc-admin-third/./src/js/admin/_lib/jquery.bcUtil.js","webpack://bc-admin-third/webpack/bootstrap","webpack://bc-admin-third/webpack/runtime/define property getters","webpack://bc-admin-third/webpack/runtime/global","webpack://bc-admin-third/webpack/runtime/hasOwnProperty shorthand","webpack://bc-admin-third/webpack/runtime/make namespace object","webpack://bc-admin-third/webpack/runtime/jsonp chunk loading","webpack://bc-admin-third/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","/**\n * baserCMS : Based Website Development Project
\n * Copyright (c) NPO baser foundation \n *\n * @copyright Copyright (c) NPO baser foundation\n * @link https://basercms.net baserCMS Project\n * @since 5.0.0\n * @license https://basercms.net/license/index.html MIT License\n */\n\n/**\n * baseUrl プラグイン\n */\n(function( $ ){\n $.baseUrl = function() {\n return $(\"#AdminScript\").attr('data-baseUrl');\n };\n})( jQuery );\n\n\n","/**\n * baserCMS : Based Website Development Project \n * Copyright (c) baserCMS Users Community \n *\n * @copyright Copyright (c) baserCMS Users Community\n * @link https://basercms.net baserCMS Project\n * @since baserCMS v 2.0.0\n * @license https://basercms.net/license/index.html\n */\n\n/**\n * bcBatch プラグイン\n */\n\n(function ($) {\n $.bcBatch = {\n /**\n * 初期値\n */\n config: {\n batchUrl: '',\n listTable: '#ListTable',\n executeButton: '#BtnApplyBatch',\n methodSelect: '#batch',\n checkAll: '#checkall',\n targetCheckbox: '.batch-targets',\n alertBox: '#AlertMessage',\n loader: '#Waiting',\n flashBox: '#flashMessage'\n },\n /**\n * 初期化\n */\n init: function (config) {\n if (config) {\n $.extend($.bcBatch.config, config);\n }\n this.initList();\n return this;\n },\n /**\n * リストの初期化\n */\n initList: function () {\n\n var config = $.bcBatch.config;\n\n // イベント削除\n $($.bcBatch.config.executeButton).unbind();\n $($.bcBatch.config.methodSelect).unbind();\n $(config.listTable + \" \" + config.targetCheckbox).unbind();\n $(config.checkAll).unbind();\n\n // イベント登録\n $($.bcBatch.config.executeButton).click(function () {\n if (!$(config.targetCheckbox + \":checked\").length) {\n alert(bcI18n.commonSelectDataFailedMessage);\n return false;\n }\n\n if (!confirm(bcI18n.batchConfirmMessage)) {\n return false;\n }\n\n var form = $('').append($(config.methodSelect).clone().val($(config.methodSelect).val()));\n $(config.targetCheckbox + \":checked\").each(function(){\n var value = $(this).attr('name').replace(/batch_targets\\[([0-9]*)\\]/, \"$1\");\n if(value) {\n form.append($('').val(value));\n }\n });\n\n $.bcToken.check(function () {\n form.append($('').val($.bcToken.key));\n return $.ajax({\n url: config.batchUrl,\n headers: {\n \"Authorization\": $.bcJwt.accessToken,\n },\n type: 'POST',\n data: form.serialize(),\n dataType: 'json',\n beforeSend: function () {\n $.bcUtil.hideMessage();\n $.bcUtil.showLoader();\n },\n success: function (result) {\n $.bcUtil.setFlashMessage(result.message);\n location.reload();\n },\n error: function (XMLHttpRequest, textStatus, errorThrown) {\n $.bcToken.key = null;\n var errorMessage = '';\n if (XMLHttpRequest.status === 404) {\n errorMessage = '
' + bcI18n.commonNotFoundProgramMessage;\n } else {\n if (XMLHttpRequest.responseText) {\n errorMessage = '
' + JSON.parse(XMLHttpRequest.responseText).message;\n } else {\n errorMessage = '
' + errorThrown;\n }\n }\n form.remove();\n $.bcUtil.showAlertMessage(bcI18n.commonBatchExecFailedMessage + '(' + XMLHttpRequest.status + ')' + errorMessage);\n $.bcUtil.hideLoader();\n }\n });\n }, {useUpdate: false, hideLoader: false});\n return false;\n });\n\n\n $($.bcBatch.config.methodSelect).change(toolChangeHandler);\n\n $(config.listTable + \" tbody td\").click(function () {\n var checkbox = $(this).parent().find(config.targetCheckbox);\n if (!checkbox.prop('checked')) {\n checkbox.prop('checked', true);\n } else {\n checkbox.prop('checked', false);\n }\n changeRow(checkbox);\n return false;\n });\n\n $(config.listTable + \" tbody td a\").click(function (e) {\n if ($(this).attr('rel') !== 'colorbox') {\n e.stopPropagation();\n }\n });\n\n $(config.listTable + \" \" + config.targetCheckbox).click(function (e) {\n e.stopPropagation();\n });\n\n $(config.listTable + \" \" + config.targetCheckbox).change(function () {\n changeRow($(this));\n });\n\n $(config.checkAll).change(function () {\n if ($(this).prop('checked')) {\n $(config.listTable + \" \" + config.targetCheckbox).prop('checked', true);\n } else {\n $(config.listTable + \" \" + config.targetCheckbox).prop('checked', false);\n }\n $.bcBatch.initRowSelected();\n });\n\n toolChangeHandler();\n $.bcBatch.initRowSelected();\n\n },\n /**\n * 行の選択状態を初期化\n */\n initRowSelected: function () {\n var config = $.bcBatch.config;\n $(config.listTable + \" \" + config.targetCheckbox).each(function () {\n if ($(this).prop('checked')) {\n $(this).parent().parent().addClass('selectedrow');\n } else {\n $(this).parent().parent().removeClass('selectedrow');\n }\n });\n }\n\n };\n\n /**\n * バッチ処理ドロップダウン変更時イベント\n */\n function toolChangeHandler() {\n var config = $.bcBatch.config;\n if ($(config.methodSelect).val()) {\n $(config.executeButton).removeAttr('disabled');\n } else {\n $(config.executeButton).prop('disabled', true);\n }\n }\n})(jQuery);\n\nfunction changeRow(checkbox) {\n if (checkbox.attr('checked') !== undefined) {\n $(checkbox).parent().parent().addClass('selectedrow');\n } else {\n $(checkbox).parent().parent().removeClass('selectedrow');\n }\n}\n","/**\n * baserCMS : Based Website Development Project \n * Copyright (c) NPO baser foundation \n *\n * @copyright Copyright (c) NPO baser foundation\n * @link https://basercms.net baserCMS Project\n * @since 5.0.0\n * @license https://basercms.net/license/index.html MIT License\n */\n\n/**\n * bcCkeditor プラグイン\n */\n(function ($) {\n $.bcCkeditor = {\n\n /**\n * editor\n */\n editor: {},\n\n /**\n * 初期化チェックフラグ\n */\n initStatus: false,\n\n /**\n * スタイル初期化チェックフラグ\n */\n styleInitStatus: false,\n\n /**\n * エディタを表示する\n * @param config\n */\n show: function (config) {\n this.setUpConfig(config);\n if (!this.initStatus) {\n CKEDITOR.addStylesSet('basercms', config.initialStyle);\n this.initStatus = true;\n }\n if (!this.styleInitStatus && config.editorStyle.length) {\n this.editorStyle.map((editor, key) => CKEDITOR.addStylesSet(key, editor));\n this.styleInitStatus = true;\n }\n config.themeEditorCsses.map((css) => {\n if (Array.isArray(CKEDITOR.config.contentsCss)) {\n CKEDITOR.config.contentsCss.push(css);\n }\n });\n this.editor[config.ckeditorField] = CKEDITOR.replace(config.editorDomId, config.editorOptions);\n this.setUpDraft(config);\n this.setUpToolBar(config);\n },\n\n /**\n * 基本設定\n * @param config\n */\n setUpConfig: function (config) {\n CKEDITOR.config.allowedContent = true;\n CKEDITOR.config.extraPlugins = 'draft,showprotected';\n CKEDITOR.config.stylesCombo_stylesSet = config.editorStylesSet;\n CKEDITOR.config.protectedSource.push(/<\\?[\\s\\S]*?\\?>/g);\n // 空「i」タグを消さないようにする\n CKEDITOR.dtd.$removeEmpty[\"i\"] = false;\n // 空「span」タグを消さないようにする\n CKEDITOR.dtd.$removeEmpty[\"span\"] = false;\n if (config.editorUrl) {\n CKEDITOR.config.templates_files = [config.editorUrl];\n }\n if (config.editorEnterBr) {\n CKEDITOR.config.enterMode = CKEDITOR.ENTER_BR;\n }\n // 複数入ることを前提に配列型に変更\n if (typeof CKEDITOR.config.contentsCss === 'string') {\n CKEDITOR.config.contentsCss = [CKEDITOR.config.contentsCss];\n }\n },\n\n /**\n * 下書き設定\n * @param config\n */\n setUpDraft: function(config)\n {\n if (!config.editorUseDraft) return;\n this.editor[config.ckeditorField].on('pluginsLoaded', function () {\n if (config.editorUseDraft) {\n if (config.draftAreaId) {\n this.draftDraftAreaId = config.draftAreaId;\n }\n if (config.publishAreaId) {\n this.draftPublishAreaId = config.publishAreaId;\n }\n if (config.editorReadonlyPublish) {\n this.draftReadOnlyPublish = true;\n }\n }\n });\n this.editor[config.ckeditorField].on('instanceReady', function () {\n if (config.editorDisableDraft) {\n this.execCommand('changePublish');\n this.execCommand('disableDraft');\n }\n if (config.editorDisablePublish) {\n this.execCommand('changeDraft');\n this.execCommand('disablePublish');\n }\n this.on('beforeCommandExec', function (e) {\n if (e.data.name === 'changePublish' || e.data.name === 'copyPublish') {\n $(`#${config.previewModeId}`).val('default');\n } else if (e.data.name === 'changeDraft' || e.data.name === 'copyDraft') {\n $(`#${config.previewModeId}`).val('draft');\n }\n });\n });\n },\n\n /**\n * ツールバー設定\n * @param config\n */\n setUpToolBar: function(config)\n {\n this.editor[config.ckeditorField].on('instanceReady', function () {\n if (this.getCommand('maximize').uiItems.length > 0) {\n // ツールバーの表示を切り替え\n this.getCommand('maximize').on('state', () => {\n if (this.state === 1) {\n $(\"#ToolBar\").hide();\n } else {\n $(\"#ToolBar\").show();\n }\n });\n }\n });\n }\n\n };\n})(jQuery);\n","/**\n * baserCMS : Based Website Development Project \n * Copyright (c) baserCMS Users Community \n *\n * @copyright Copyright (c) baserCMS Users Community\n * @link https://basercms.net baserCMS Project\n * @since baserCMS v 2.0.0\n * @license https://basercms.net/license/index.html\n */\n\n/**\n * bcConfirm\n */\n\n(function ($) {\n $.bcConfirm = {\n config: {\n title: bcI18n.bcConfirmTitle1,\n message: bcI18n.bcConfirmAlertMessage1,\n defaultCancel: true,\n ok: null\n },\n show: function (config) {\n $.extend($.bcConfirm.config, config);\n var message = $(\"\").html($.bcConfirm.config.message);\n message.dialog({\n modal: true,\n title: $.bcConfirm.config.title,\n width: '50%',\n buttons: {\n \"キャンセル\": function () {\n $(this).dialog(\"close\");\n },\n \"OK\": function () {\n $(this).dialog(\"close\");\n if (typeof ($.bcConfirm.config.ok) == 'function') {\n $.bcConfirm.config.ok();\n } else {\n alert(bcI18n.bcConfirmAlertMessage2);\n }\n }\n }\n });\n }\n };\n})(jQuery);\n\n","/**\n * baserCMS : Based Website Development Project \n * Copyright (c) baserCMS Users Community \n *\n * @copyright Copyright (c) baserCMS Users Community\n * @link https://basercms.net baserCMS Project\n * @since baserCMS v 2.0.0\n * @license https://basercms.net/license/index.html\n */\n\n/**\n * bcCredit\n */\n\n(function ($) {\n $.bcCredit = {\n show: function () {\n $.ajax({\n url: $.bcUtil.adminBaseUrl + 'baser-core/utilities/credit',\n type: \"GET\",\n success: function (result) {\n let hideTarget;\n let isLogin = false;\n let $html = $(\"html\");\n let $page = $(\"#Page\");\n let $credit = $(\"#Credit\");\n if ($(\"#SideBar\").css('display') === 'none') {\n openedFavorite = false;\n hideTarget = \"#Contents\";\n } else {\n openedFavorite = true;\n hideTarget = \"#Contents, #SideBar\";\n }\n if ($credit.length) {\n isLogin = true;\n $credit.remove();\n }\n\n if ($html.css('margin-top') !== '0px') {\n $html.prepend(result);\n } else {\n $page.prepend(result);\n }\n // 再度読み込み直す\n $credit = $(\"#Credit\");\n let $creditScroller = $(\"#CreditScroller\");\n\n if (isLogin) {\n $credit.show();\n } else {\n $credit.fadeIn(1000);\n }\n $page.css('overflow', 'hidden');\n if (!isLogin) {\n $(\"#Footer\").fadeOut(500);\n $(hideTarget).fadeOut(500, function () {\n $(\"#Footer\").fadeIn(2000);\n $.bcCredit.setViewSize();\n });\n }\n $creditScroller.fadeIn(1000);\n\n //リサイズイベント\n $(window).resize(function () {\n $.bcCredit.resizeScroll();\n });\n\n var scrollSpeed = 1;\n var height = $creditScroller.height();\n var posX = $(window).height();\n var id = setInterval(function () {\n if (posX < -height + $(window).height() / 2) {\n clearInterval(id);\n }\n posX -= scrollSpeed;\n $creditScroller.css(\"margin-top\", posX + \"px\");\n }, 40);\n\n $credit.click(function () {\n clearTimeout(id);\n $credit.fadeOut(1000, function () {\n $credit.remove();\n });\n if ($('#Login').length > 0) {\n hideTarget = \"\";\n $(\"#Wrap\").css('height', '280px');\n $(\"#LoginInner\").css('color', '#333');\n } else {\n $(\"#Wrap\").css('height', 'auto');\n if (!openedFavorite) {\n hideTarget = \"#Contents\";\n } else {\n hideTarget = \"#Contents, #SideBar\";\n }\n $(hideTarget).fadeIn(1000);\n }\n $page.css('height', 'auto').css('overflow', 'auto');\n });\n\n $(\"#CreditScrollerInner\").click(function (e) {\n if (e && e.stopPropagation) {\n e.stopPropagation();\n } else {\n window.event.cancelBubble = true;\n }\n });\n }\n });\n },\n\n /**\n * 表示領域を設定\n */\n setViewSize: function(){\n let $toolBar = $(\"#ToolBar\");\n let $credit = $(\"#Credit\");\n let $page = $(\"#Page\");\n let $html = $(\"html\");\n $(\"#Wrap\").css('height', '280px');\n $html.height($html.height() - $toolBar.outerHeight() * 1);\n $credit.height($page.height() + $toolBar.outerHeight() * 1);\n $credit.width($page.width());\n },\n\n /**\n * スクロールバーを非表示に\n */\n resizeScroll: function(){\n let $toolBar = $(\"#ToolBar\");\n let $credit = $(\"#Credit\");\n let $page = $(\"#Page\");\n let $html = $(\"html\");\n let $body = $(\"body\");\n $html.height($html.height() - $toolBar.outerHeight() * 1);\n $body.height($body.height() - $toolBar.outerHeight() * 1);\n $credit.width($page.width());\n $credit.height($page.height() + $toolBar.outerHeight() * 1);\n }\n };\n})(jQuery);\n\n","/**\n * baserCMS : Based Website Development Project \n * Copyright (c) NPO baser foundation \n *\n * @copyright Copyright (c) NPO baser foundation\n * @link https://basercms.net baserCMS Project\n * @since 5.0.0\n * @license https://basercms.net/license/index.html MIT License\n */\n\n(function ($) {\n $.bcJwt = {\n\n /**\n * Access Token\n */\n accessToken: null,\n\n /**\n * Init\n */\n init: function() {\n let refreshToken = localStorage.getItem('refreshToken');\n if(refreshToken && refreshToken !== 'null') {\n this.getToken(refreshToken)\n }\n },\n\n /**\n * Login\n */\n login: function (email, password, saved, successCallback, errorCallback) {\n $.ajax({\n url: $.bcUtil.apiBaseUrl + 'baser-core/users/login.json',\n type: 'post',\n data: {\n email: email,\n password: password,\n saved: (saved !== undefined && saved)? 1 : ''\n },\n dataType: 'json'\n }).done(function (response) {\n if (response) {\n this.setToken(response.access_token, response.refresh_token)\n if(successCallback) {\n successCallback(response);\n }\n }\n }.bind(this)).fail(function () {\n if(errorCallback) {\n errorCallback()\n }\n })\n },\n\n /**\n * Get Token\n * @param refreshToken\n */\n getToken: function (refreshToken) {\n if(!refreshToken) {\n return\n }\n $.ajax({\n url: $.bcUtil.apiBaseUrl + 'baser-core/users/refresh_token.json',\n type: 'get',\n async: false,\n headers: {\n \"Authorization\": refreshToken,\n 'Content-Type': 'application/json'\n },\n dataType: 'json',\n }).done(function (response) {\n if (response) {\n this.setToken(response.access_token, response.refresh_token)\n } else {\n alert('APIトークンが取得できませんでした。ブラウザをリロードしてください。')\n }\n }.bind(this)).fail(function(error){\n if (error.status === 401) {\n localStorage.setItem('refreshToken', '')\n }\n })\n },\n\n /**\n * Set Token\n * @param accessToken\n * @param refreshToken\n */\n setToken: function (accessToken, refreshToken) {\n this.accessToken = accessToken\n localStorage.setItem('refreshToken', refreshToken);\n },\n\n /**\n * Logout\n */\n logout: function () {\n this.removeToken()\n },\n\n /**\n * Remove Token\n */\n removeToken: function () {\n localStorage.setItem('refreshToken', null);\n this.accessToken = null\n }\n\n };\n})(jQuery);\n","/**\n * baserCMS : Based Website Development Project \n * Copyright (c) NPO baser foundation \n *\n * @copyright Copyright (c) NPO baser foundation\n * @link https://basercms.net baserCMS Project\n * @since 5.0.0\n * @license https://basercms.net/license/index.html MIT License\n */\n\n(function ($) {\n\n $.bcSortable = {\n updateSortUrl : null,\n init: function (config) {\n this.updateSortUrl = config.updateSortUrl\n var sortHandle = $(\".sort-handle\");\n var sortTable = $(\".sort-table\");\n // イベント削除\n sortHandle.unbind();\n // 初期化されてない場合にメソッドを実行すると処理が止まってしまう為 try を利用\n try {\n $(sortTable).sortable(\"destroy\");\n } catch (e) {\n }\n // イベント登録\n var sortableOptions = {\n scroll: true,\n items: \"tr.sortable\",\n opacity: 1,\n zIndex: 55,\n containment: 'body',\n tolerance: 'pointer',\n distance: 5,\n cursor: 'move',\n handle: \".sort-handle\",\n placeholder: 'ui-sortable-placeholder',\n revert: 100,\n start: this.sortStartHandler,\n update: this.sortUpdateHandler\n };\n sortHandle.css('cursor', 'move');\n sortTable.sortable(sortableOptions);\n sortHandle.click(function (e) {\n e.stopPropagation();\n });\n },\n\n /**\n * 並び替え開始時イベント\n */\n sortStartHandler: function (event, ui) {\n var placeholder = $(\".ui-sortable-placeholder\");\n placeholder.css('height', ui.item.height());\n },\n\n /**\n * 並び順を更新時イベント\n */\n sortUpdateHandler: function (event, ui) {\n var target = ui.item;\n var targetNum = $(\".sort-table\" + \" \" + \"tr.sortable\").index(target) + 1;\n var sourceNum = target.attr('id').replace('Row', '');\n var offset = targetNum - sourceNum;\n var sortTable = $(\".sort-table\");\n var form = $('').hide();\n var sortId = $('').attr('type', 'hidden').attr('name', 'id').val(target.find('.id').val());\n var sortOffset = $('').attr('type', 'hidden').attr('name', 'offset').val(offset);\n form.append(sortId).append(sortOffset);\n\n $.bcToken.check(function () {\n form.append($.bcToken.getHiddenToken());\n var data = form.serialize();\n form.find('input[name=\"_csrfToken\"]').remove();\n return $.ajax({\n url: $.bcSortable.updateSortUrl,\n headers: {\n \"Authorization\": $.bcJwt.accessToken,\n },\n type: 'POST',\n data: data,\n dataType: 'text',\n beforeSend: function () {\n $.bcUtil.hideMessage();\n $.bcUtil.showLoader();\n },\n success: function () {\n sortTable.find(\"tr.sortable\").each(function (i, v) {\n $(this).attr('id', 'Row' + (i + 1));\n });\n },\n error: function (XMLHttpRequest, textStatus, errorThrown) {\n var errorMessage = '';\n if (XMLHttpRequest.status === 404) {\n errorMessage = '
' + bcI18n.commonNotFoundProgramMessage;\n } else {\n if (XMLHttpRequest.responseText) {\n errorMessage = '
' + JSON.parse(XMLHttpRequest.responseText).message;\n } else {\n errorMessage = '
' + errorThrown;\n }\n }\n sortTable.sortable(\"cancel\");\n $.bcUtil.showAlertMessage(bcI18n.commonBatchExecFailedMessage + '(' + XMLHttpRequest.status + ')' + errorMessage)\n },\n complete: function () {\n $.bcUtil.hideLoader();\n }\n });\n }, {hideLoader: false});\n }\n };\n\n})(jQuery);\n","/**\n * baserCMS : Based Website Development Project \n * Copyright (c) NPO baser foundation \n *\n * @copyright Copyright (c) NPO baser foundation\n * @link https://basercms.net baserCMS Project\n * @since 5.0.0\n * @license https://basercms.net/license/index.html MIT License\n */\n\n(function ($) {\n $.bcTimeUtil = {\n\n /**\n * 現在の日時を文字列で取得する\n *\n * @returns {string}\n */\n getNowDateTime : function () {\n return $.bcTimeUtil.getNowDate() + ' ' + $.bcTimeUtil.getNowTime();\n },\n\n /**\n * 現在の日付を文字列で取得する\n *\n * @returns {string}\n */\n getNowDate : function () {\n var date = new Date();\n var year = date.getFullYear();\n var month = date.getMonth() + 1;\n var day = date.getDate();\n if (month < 10) month = '0' + month;\n if (day < 10) day = '0' + day;\n return year + '/' + month + '/' + day;\n },\n\n /**\n * 現在の時間を文字列で取得する\n *\n * @returns {string}\n */\n getNowTime : function () {\n var date = new Date();\n var hour = date.getHours();\n var minute = date.getMinutes();\n if (hour < 10) hour = '0' + hour;\n if (minute < 10) minute = '0' + minute;\n return hour + ':' + minute;\n }\n\n };\n})(jQuery);\n","/**\n * baserCMS : Based Website Development Project \n * Copyright (c) NPO baser foundation \n *\n * @copyright Copyright (c) NPO baser foundation\n * @link https://basercms.net baserCMS Project\n * @since 5.0.0\n * @license https://basercms.net/license/index.html MIT License\n */\n\n/**\n * bcTokenプラグイン\n *\n * フロントエンドでCakePHPのセキュリティコンポーネントのトークンの管理等を行う\n */\n\n(function ($) {\n\n $.bcToken = {\n\n /**\n * トークン\n */\n key: null,\n\n /**\n * トークンを取得済かどうか\n */\n requested: false,\n\n /**\n * トークンを取得中かどうか\n */\n requesting: false,\n\n /**\n * トークンURL\n */\n url: null,\n\n /**\n * デフォルトトークンURL\n */\n defaultUrl: '/baser-core/bc_form/get_token?requestview=false',\n\n /**\n * 初期化\n */\n init: function () {\n this.setTokenUrl();\n },\n\n /**\n * トークンを取得しているかどうかチェックし、取得していない場合取得する\n * コールバック処理を登録する前提となっており、コールバック処理完了後、再度、新しいトークンを取得する\n *\n * @param callback\n * @param config\n */\n check: function (callback, config) {\n if (this.requesting) {\n var timer = setInterval(function () {\n if (!$.bcToken.requesting) {\n clearInterval(timer);\n if (callback) {\n $.bcToken.execCallback(callback, config);\n }\n }\n }, 100);\n } else {\n if (!this.key) {\n this.update(config).done(function () {\n if (callback) {\n $.bcToken.execCallback(callback, config);\n }\n });\n } else {\n if (callback) {\n this.execCallback(callback, config);\n }\n }\n }\n },\n\n /**\n * コールバック処理を実行\n * @param callback\n * @param config\n */\n execCallback: function (callback, config) {\n var _config = {\n useUpdate: true\n };\n if (config !== undefined) {\n config = $.extend(_config, config);\n } else {\n config = _config;\n }\n var result = callback();\n if (config.useUpdate) {\n config.hideLoader = true;\n config.loaderType = 'none';\n if (result) {\n result.always(function () {\n $.bcToken.update(config);\n });\n } else {\n this.update(config);\n }\n }\n },\n\n /**\n * 新しいトークンをサーバーより取得する\n *\n * @param config\n */\n update: function (config) {\n var _config = {\n type: 'GET'\n };\n if (config !== undefined) {\n config = $.extend(_config, config);\n } else {\n config = _config;\n }\n this.requesting = true;\n return $.bcUtil.ajax($.baseUrl() + this.url, function (result) {\n $.bcToken.key = result;\n $.bcToken.requesting = false;\n $('input[name=\"_csrfToken\"]').val($.bcToken.key);\n }, $.extend(true, {}, config));\n },\n\n /**\n * トークンを取得した空のフォームを取得する\n * コールバック処理の引数として利用可能\n * @param url\n * @param options\n * @param callback\n * @param config\n */\n getForm: function (url, options, callback, config) {\n var form = $('');\n form.attr('action', url).attr('method', 'post');\n this.check(function () {\n form.append($.bcToken.getHiddenToken());\n if(options.fields) form.append(options.fields);\n if(options.unlocked) form.append(options.unlocked);\n if(options.debug) form.append(options.debug);\n callback(form);\n }, config);\n },\n\n /**\n * トークン用の hidden タグを取得する\n *\n * @returns {*}\n */\n getHiddenToken: function () {\n return $('').val(this.key);\n },\n\n /**\n * 指定したURLに対しトークンを付加した上でPOST送信を行う\n * @param url\n * @param options\n */\n submitToken: function (url, options) {\n this.getForm(url, options, function (form) {\n $('body').append(form);\n form.submit();\n }, {useUpdate: false, hideLoader: false});\n },\n\n /**\n * 指定したセレクターのリンクのクリックイベントについて、\n * トークン付加前提のフォーム送信処理に置き換える\n *\n * CakePHP の postLink に対応\n * postLink を利用した場合、ローダーを表示するなどの処理を割り込ませる事ができないが、\n * CakePHP が生成するフォームでなく、こちらで生成するフォームを利用することで、ローダーを表示できるようにした。\n * @param selector\n */\n replaceLinkToSubmitToken: function (selector) {\n $(selector).each(function () {\n if ($(this).attr('onclick')) {\n var regex = /document\\.(post_.+?).submit\\(\\)/;\n var result = $(this).attr('onclick').match(regex);\n if (result) {\n $(this).attr('data-post-link-form-id', result[1]);\n }\n $(this).get(0).onclick = '';\n $(this).removeAttr('onclick');\n }\n });\n $(selector).click(function () {\n if ($(this).attr('data-confirm-message')) {\n var message = $(this).attr('data-confirm-message');\n if (!confirm(message)) {\n return false;\n }\n }\n let url = $(this).attr('href');\n let options = {};\n if($(this).attr('data-post-link-form-id')) {\n let postLinkForm = $(\"form[name='\" + $(this).attr('data-post-link-form-id') + \"']\");\n let fields = postLinkForm.find(\"input[name='_Token[fields]']\");\n let unlocked = postLinkForm.find(\"input[name='_Token[unlocked]']\");\n let debug = postLinkForm.find(\"input[name='_Token[debug]']\");\n url = postLinkForm.attr('action');\n options = {\n fields: (fields.length)? fields : null,\n unlocked: (unlocked.length)? unlocked : null,\n debug: (debug.length)? debug : null\n }\n }\n $.bcToken.submitToken(url, options);\n return false;\n });\n },\n\n /**\n * トークン発行URLのセット\n * @param url トークン発行URL。nullの場合はデフォルトURL\n */\n setTokenUrl: function (url) {\n this.url = url != null ? url : $.bcUtil.baseUrl + this.defaultUrl;\n return this;\n }\n\n };\n\n})(jQuery);\n","/**\n * baserCMS : Based Website Development Project \n * Copyright (c) NPO baser foundation \n *\n * @copyright Copyright (c) NPO baser foundation\n * @link https://basercms.net baserCMS Project\n * @since 5.0.0\n * @license https://basercms.net/license/index.html MIT License\n */\n\n/**\n * jsTree 設定\n */\n\n(function ($) {\n $.bcTree = {\n\n /**\n * リンクをクリックする際にShiftキーを押しているかどうか\n */\n shiftOnAnchor: false,\n\n /**\n * リンクをクリックする際にCtrlキーを押しているかどうか\n */\n ctrlOnAnchor: false,\n\n /**\n * コンテキストメニューを追加項目のみとする\n */\n contextmenuAddOnly: false,\n\n /**\n * 設定 BcManageContent より値を取得\n */\n settings: [],\n\n /**\n * ドラッグターゲット\n */\n dropTarget: null,\n\n /**\n * ドロップターゲット\n */\n dragTarget: null,\n\n /**\n * ツリー構造のDOM(jQueryオブジェクト)\n */\n treeDom: null,\n\n /**\n * jsTree実体\n */\n jsTree: null,\n\n /**\n * 一覧を表示した時間\n */\n listDisplayed: null,\n\n /**\n * ノードを移動する場合の直前の親ID\n */\n beforeParentId: null,\n\n /**\n * ノードを移動する場合の直前のポジション\n */\n beforePosition: null,\n\n /**\n * 現在のサイトid\n */\n currentSiteId: 1,\n\n /**\n * 設定\n */\n config: {\n isAdmin: false,\n isUseMoveContents: false,\n adminPrefix: 'admin',\n editInIndexDisabled: false\n },\n\n /**\n * 初期化済かどうか\n */\n _inited: false,\n\n /**\n * 初期化\n * @param config\n */\n init: function (config) {\n if (config) {\n $.extend($.bcTree.config, config);\n }\n $.bcTree._inited = true;\n },\n /**\n * ツリーを読み込む\n */\n load: function () {\n $.bcUtil.showLoader();\n if (!$.bcTree._inited) {\n return;\n }\n const mode = $(\"#viewsetting-mode\").val();\n let url;\n $.bcTree.listDisplayed = $.bcTimeUtil.getNowDateTime();\n $.bcTree._init();\n $($.bcTree).trigger('loaded');\n $.bcUtil.hideLoader();\n },\n\n /**\n * ツリーを初期化する\n */\n _init: function () {\n if (!$('#ContentsTreeList').length) {\n return false;\n }\n $.bcTree.settings = $.parseJSON($(\"#bcmanagecontent\").val());\n $.bcTree.treeDom = $('#ContentsTreeList');\n $.bcTree.createTree();\n $.bcTree.jsTree = $.bcTree.treeDom.jstree(true);\n $.bcTree.treeDom.bind(\"move_node.jstree\", function (e, data) {\n $.bcTree.beforeParentId = data.old_parent;\n $.bcTree.beforePosition = data.old_position;\n });\n\n // ダブルクリックイベント\n $.bcTree.treeDom.bind(\"dblclick\", $.bcTree.updateShiftAndCtrlOnAnchor);\n\n // ダブルクリックイベント\n $.bcTree.treeDom.bind(\"dblclick.jstree\", function (event) {\n var mode = $(\"#viewsetting-mode\").val();\n if (mode == 'trash') {\n return false;\n }\n var nodeId = $(event.target).closest(\"li\").attr('id');\n var data = $.bcTree.jsTree.get_node(nodeId).data.jstree;\n if (data.type == 'default' || data.alias) {\n if ($.bcTree.settings[data.contentType] == undefined || !$.bcTree.settings[data.contentType].editDisabled) {\n if (!data.alias) {\n if ($.bcTree.settings[data.contentType] == undefined) {\n $.bcTree.openUrl($.bcTree.createLink($.baseUrl() + '/' + $.bcTree.config.baserCorePrefix + '/' + $.bcTree.config.adminPrefix + '/contents/edit', data.contentId, data.contentParentId, data.contentEntityId));\n } else {\n if ($.bcTree.settings[data.contentType]['url']['dblclick'] !== undefined) {\n $.bcTree.openUrl($.bcTree.createLink($.bcTree.settings[data.contentType]['url']['dblclick'], data.contentId, data.contentParentId, data.contentEntityId));\n } else {\n $.bcTree.openUrl($.bcTree.createLink($.bcTree.settings[data.contentType]['url']['edit'], data.contentId, data.contentParentId, data.contentEntityId));\n }\n }\n } else {\n $.bcTree.openUrl($.bcUtil.adminBaseUrl + 'baser-core' + '/contents/edit_alias/' + data.contentId);\n }\n }\n }\n });\n\n // コンテキストメニュー表示イベント\n $.bcTree.treeDom.on(\"show_contextmenu.jstree\", function () {\n $(\"ul.jstree-contextmenu li\").each(function () {\n if ($.bcTree.isAliasMenuByLabel($.trim($(this).text()))) {\n $(this).find('a i').after('');\n }\n if ($.bcTree.isAddMenuByLabel($.trim($(this).text()))) {\n $(this).find('a i').after('');\n }\n });\n });\n\n // フォルダ展開イベント\n $.bcTree.treeDom.on(\"after_open.jstree\", function (e) {\n $.bcTree.refreshTree();\n });\n\n // テキスト変更イベント\n // コンテンツ追加のリネーム時\n $.bcTree.treeDom.on(\"set_text.jstree\", function (e) {\n $.bcTree.refreshTree();\n });\n\n // ロード完了イベント\n $.bcTree.treeDom.on(\"ready.jstree\", function (e) {\n $.bcTree.treeDom.show();\n $.bcTree.refreshTree();\n });\n\n },\n\n /**\n * ツリーを破棄する\n */\n destroy: function () {\n if ($.bcTree.treeDom) {\n $.bcTree.treeDom.unbind(\"dblclick\");\n $.bcTree.treeDom.unbind(\"dblclick.jstree\");\n $.bcTree.treeDom.unbind(\"show_contextmenu.jstree\");\n $.bcTree.treeDom.unbind(\"after_open.jstree\");\n $.bcTree.treeDom.unbind(\"set_text.jstree\");\n $.bcTree.treeDom.unbind(\"ready.jstree\");\n $.bcTree.treeDom.remove();\n }\n $.bcTree.shiftOnAnchor = false;\n $.bcTree.ctrlOnAnchor = false;\n $.bcTree.contextmenuAddOnly = false;\n $.bcTree.settings = [];\n $.bcTree.dropTarget = null;\n $.bcTree.dragTarget = null;\n $.bcTree.treeDom = null;\n $.bcTree.jsTree = null;\n },\n\n /**\n * ツリー構造を生成する\n */\n createTree: function () {\n\n // ツリービュー生成\n $.bcTree.treeDom.jstree({\n 'core': {\n 'themes': {\n 'name': 'proton',\n \"stripes\": true,\n \"variant\": \"large\"\n },\n \"multiple\": false,\n \"force_text\": true,\n \"check_callback\": function (operation, node, node_parent, node_position, more) {\n if (operation == 'move_node') {\n if (!$.bcTree.config.isUseMoveContents) {\n return false;\n }\n if (node_parent.type == 'folder' && !node_parent.data.jstree.alias && !node.data.jstree.contentSiteRoot) {\n $.bcTree.dropTarget = node_parent;\n $.bcTree.dragTarget = node;\n return true;\n } else {\n $.bcTree.dropTarget = null;\n $.bcTree.dragTarget = null\n return false;\n }\n }\n }\n },\n \"plugins\": [\n \"dnd\",\n \"changed\",\n \"state\",\n \"wholerow\",\n \"contextmenu\",\n \"types\"\n ],\n \"dnd\": {\n \"large_drop_target\": true\n },\n \"types\": {\n \"default\": {},\n \"folder\": {}\n },\n \"state\": {\n \"key\": 'jstree-' + $.bcTree.currentSiteId,\n \"events\": \"open_all.jstree close_all.jstree changed.jstree open_node.jstree close_node.jstree check_node.jstree uncheck_node.jstree\"\n },\n \"contextmenu\": {\n \"show_at_node\": false,\n \"items\": function (node) {\n var maxContents = 6;\n var data = node.data.jstree;\n var mode = $(\"#viewsetting-mode\").val();\n var parent;\n if (data.type === 'folder' && !node.data.jstree.alias) {\n parent = node;\n } else {\n parent = $.bcTree.jsTree.get_node($.bcTree.jsTree.get_parent(node));\n }\n\n var editDisabled = false;\n var manageDisabled = false;\n var editUrl = null;\n var manageUrl = null;\n var copyUrl = null;\n var isEnabled = false;\n\n if ($.bcTree.settings[data.contentType] !== undefined) {\n editDisabled = data.editDisabled;\n manageDisabled = data.manageDisabled;\n manageUrl = $.bcTree.settings[data.contentType]['url']['manage'];\n editUrl = $.bcTree.settings[data.contentType]['url']['edit'];\n copyUrl = $.bcTree.settings[data.contentType]['url']['copy'];\n isEnabled = true;\n }\n\n var menu = {};\n\n // 確認\n // - 公開されている\n // - URLがある\n if (isEnabled && data.status && data.contentFullUrl && !$.bcTree.contextmenuAddOnly && mode === 'index') {\n $.extend(true, menu, {\n \"view\": {\n label: bcI18n.bcTreeCheck,\n \"icon\": \"bca-icon--preview\",\n \"action\": function (obj) {\n $.bcTree.openUrl(data.contentFullUrl, true);\n }\n }\n });\n }\n\n // 公開・非公開\n // - サイトルートではない\n // - 関連データではない\n if (isEnabled && !$.bcTree.config.editInIndexDisabled && !editDisabled && !data.contentSiteRoot && mode === 'index' && !$.bcTree.contextmenuAddOnly && !data.related) {\n if (!data.status) {\n $.extend(true, menu, {\n \"publish\": {\n label: bcI18n.bcTreePublish,\n \"icon\": \"bca-icon--publish\",\n \"action\": function (obj) {\n $.bcToken.check(function () {\n return $.ajax({\n url: $.bcUtil.apiBaseUrl + 'baser-core/contents/change_status',\n headers: {\n \"Authorization\": $.bcJwt.accessToken,\n },\n type: 'PATCH',\n data: {\n id: data.contentId,\n status: 'publish',\n type: data.contentType,\n siteId: data.contentSiteId,\n _csrfToken: $.bcToken.key,\n },\n dataType: 'json',\n beforeSend: function () {\n $.bcUtil.hideMessage();\n $.bcUtil.showLoader();\n },\n success: function (result) {\n node.data.jstree.status = true;\n $.bcTree.refreshTree();\n },\n error: function (XMLHttpRequest) {\n XMLHttpRequest.responseText = null;\n $.bcUtil.showAjaxError(bcI18n.commonChangePublishFailedMessage, XMLHttpRequest);\n },\n complete: function () {\n $.bcUtil.hideLoader();\n }\n });\n }, {hideLoader: false});\n }\n }\n });\n } else if (data.status) {\n $.extend(true, menu, {\n \"unpublish\": {\n label: bcI18n.bcTreeUnpublish,\n \"icon\": \"bca-icon--unpublish\",\n \"action\": function (obj) {\n $.bcToken.check(function () {\n return $.ajax({\n url: $.bcUtil.apiBaseUrl + 'baser-core' + '/contents/change_status',\n headers: {\n \"Authorization\": $.bcJwt.accessToken,\n },\n type: 'PATCH',\n data: {\n id: data.contentId,\n status: 'unpublish',\n type: data.contentType,\n siteId: data.contentSiteId,\n _csrfToken: $.bcToken.key,\n },\n dataType: 'json',\n beforeSend: function () {\n $.bcUtil.hideMessage();\n $.bcUtil.showLoader();\n },\n success: function (result) {\n node.data.jstree.status = false;\n $.bcTree.refreshTree();\n },\n error: function (XMLHttpRequest) {\n XMLHttpRequest.responseText = null;\n $.bcUtil.showAjaxError(bcI18n.commonChangePublishFailedMessage, XMLHttpRequest);\n },\n complete: function () {\n $.bcUtil.hideLoader();\n }\n });\n }, {hideLoader: false});\n }\n }\n });\n }\n }\n\n // 管理\n // - 管理権限あり\n // - 管理機能サポート\n // - エイリアスではない\n if (!manageDisabled && !$.bcTree.contextmenuAddOnly && manageUrl && mode === 'index' && !data.alias) {\n $.extend(true, menu, {\n \"manage\": {\n label: bcI18n.bcTreeManage,\n \"icon\": \"bca-icon--th-list\",\n \"action\": function (obj) {\n $.bcTree.openUrl($.bcTree.createLink(manageUrl, data.contentId, data.contentParentId, data.contentEntityId));\n }\n }\n });\n }\n\n // 名称変更\n // - 編集権限あり\n // - サイトルートでない\n // − サイト関連データでない\n if (isEnabled && !$.bcTree.config.editInIndexDisabled && !editDisabled && !$.bcTree.contextmenuAddOnly && !data.contentSiteRoot && mode === 'index' && !data.related) {\n $.extend(true, menu, {\n \"rename\": {\n label: bcI18n.bcTreeRename,\n \"icon\": \"bca-icon--rename\",\n \"action\": function (obj) {\n $.bcTree.renameContent(node, node.text);\n }\n }\n });\n }\n\n // 編集\n // - 編集権限あり\n if (isEnabled && !editDisabled && !$.bcTree.contextmenuAddOnly && mode === 'index') {\n $.extend(true, menu, {\n \"edit\": {\n label: bcI18n.bcTreeEdit,\n \"icon\": \"bca-icon--edit\",\n \"action\": function (obj) {\n if (!node.data.jstree.alias) {\n $.bcTree.openUrl($.bcTree.createLink(editUrl, data.contentId, data.contentParentId, data.contentEntityId));\n } else {\n $.bcTree.openUrl($.bcUtil.adminBaseUrl + 'baser-core' + '/contents/edit_alias/' + data.contentId);\n }\n }\n }\n });\n }\n\n // コピー\n // - 編集権限あり\n // - フォルダーでない\n // - コピー機能サポート\n if (!editDisabled && !$.bcTree.contextmenuAddOnly && data.contentType !== 'ContentFolder' && !data.alias && copyUrl && mode === 'index') {\n $.extend(true, menu, {\n \"copy\": {\n label: bcI18n.bcTreeCopy,\n \"icon\": \"bca-icon--copy\",\n \"action\": function (obj) {\n $.bcTree.copyContent(parent, node);\n }\n }\n });\n }\n var deleteLabel;\n if (data.alias) {\n deleteLabel = bcI18n.bcTreeDelete;\n } else {\n deleteLabel = bcI18n.bcTreeToTrash;\n }\n\n // 削除\n // - 編集権限あり\n // - サイトルートでない\n if (!$.bcTree.config.editInIndexDisabled && !editDisabled && !data.deleteDisabled && !$.bcTree.contextmenuAddOnly && !data.contentSiteRoot && mode === 'index') {\n $.extend(true, menu, {\n \"delete\": {\n label: deleteLabel,\n \"icon\": \"bca-icon--delete\",\n \"action\": function (obj) {\n var message = bcI18n.bcTreeConfirmToTrash;\n if (data.alias) {\n message = bcI18n.bcTreeConfirmDeleteAlias;\n }\n if (confirm(message)) {\n $.bcTree.deleteContent(node);\n }\n }\n }\n });\n }\n if (mode === 'trash') {\n $.extend(true, menu, {\n \"return\": {\n _disabled: editDisabled,\n label: bcI18n.bcTreeUndo,\n \"icon\": \"bca-icon--undo\",\n \"action\": function (obj) {\n if (data.alias) {\n $.ajax({\n url: $.bcUtil.apiBaseUrl + 'baser-core/contents/exists/' + data.contentAliasId,\n headers: {\n \"Authorization\": $.bcJwt.accessToken,\n },\n type: 'GET',\n dataType: 'json',\n beforeSend: function () {\n $.bcUtil.hideMessage();\n $.bcUtil.showLoader();\n },\n complete: function () {\n $.bcUtil.hideLoader();\n }\n }).done(function (result) {\n if (result.exists) {\n $.bcTree.returnContent(node);\n } else {\n $.bcUtil.showAjaxError(bcI18n.bcTreeAlertMessage1);\n }\n });\n } else {\n $.bcTree.returnContent(node);\n }\n }\n },\n \"empty\": {\n _disabled: !$.bcTree.config.isAdmin,\n label: bcI18n.bcTreeEmptyTrash,\n \"icon\": \"bca-icon--ban\",\n \"action\": function (obj) {\n if (confirm(bcI18n.bcTreeConfirmMessage1)) {\n $.bcToken.check(function () {\n return $.ajax({\n url: $.bcUtil.apiBaseUrl + 'baser-core/contents/trash_empty',\n headers: {\n \"Authorization\": $.bcJwt.accessToken,\n },\n type: 'DELETE',\n dataType: 'json',\n data: {\n empty: true,\n _csrfToken: $.bcToken.key,\n },\n beforeSend: function () {\n $.bcUtil.hideMessage();\n $.bcUtil.showLoader();\n },\n success: function (result) {\n if (result) {\n var nodes = [];\n $(\"li.jstree-node\").each(function (i) {\n nodes.push($.bcTree.jsTree.get_node(this));\n });\n $.bcTree.jsTree.delete_node(nodes);\n $.bcUtil.showNoticeMessage(result.message);\n $(\"#DataList\").html('' + bcI18n.bcTreeInfoMessage1 + '
');\n }\n },\n error: function (XMLHttpRequest) {\n XMLHttpRequest.responseText = null;\n $.bcUtil.showAjaxError(bcI18n.bcTreeAlertMessage2, XMLHttpRequest);\n },\n complete: function () {\n $.bcUtil.hideLoader();\n }\n });\n }, {hideLoader: false});\n }\n }\n }\n });\n }\n\n var settings = $.extend(true, {}, $.bcTree.settings);\n\n delete settings.Default;\n if (node.data.jstree.alias) {\n delete settings.ContentAlias;\n }\n\n if (mode === 'index') {\n var addMenu = {};\n var counter = 1;\n\n $.each(settings, function (i, val) {\n if (counter === maxContents + 1) {\n addMenu['Etc'] = {\n \"separator_before\": false,\n \"separator_after\": false,\n \"label\": \"その他...\",\n \"submenu\": {}\n }\n }\n if (counter <= maxContents) {\n if (!val.addDisabled) {\n addMenu[i] = $.bcTree.createMenu(val, parent, data, counter);\n }\n } else {\n if (!val.addDisabled) {\n addMenu['Etc']['submenu'][i] = $.bcTree.createMenu(val, parent, data, counter);\n }\n }\n counter++;\n });\n $.extend(true, menu, addMenu);\n }\n return menu;\n }\n }\n });\n },\n\n /**\n * メニューのラベルから登録メニューかどうかをチェックする\n *\n * @param name\n * @returns {boolean}\n */\n isAddMenuByLabel: function (name) {\n var node = $.bcTree.jsTree.get_node($.bcTree.jsTree.get_selected());\n var settings = $.extend(true, {}, $.bcTree.settings);\n delete settings.Default;\n if (node.data.jstree.alias) {\n delete settings.ContentAlias;\n }\n var counter = 1;\n var result = false;\n $.each(settings, function (i) {\n if (name == counter + '.' + this.title) {\n result = true;\n }\n counter++;\n });\n return result;\n },\n\n /**\n * メニューのラベルからエイリアスかどうかをチェックする\n *\n * @param name\n * @returns {boolean}\n */\n isAliasMenuByLabel: function (name) {\n var node = $.bcTree.jsTree.get_node($.bcTree.jsTree.get_selected());\n var settings = $.extend(true, {}, $.bcTree.settings);\n delete settings.Default;\n if (node.data.jstree.alias) {\n delete settings.ContentAlias;\n }\n var counter = 1;\n var result = false;\n $.each(settings, function (i) {\n if (i == 'Default') {\n return true;\n }\n if (node.data.jstree.alias && i == 'ContentLink') {\n return true;\n }\n if (name == counter + '.' + this.title && !this.multiple && this.exists) {\n result = true;\n }\n counter++;\n });\n return result;\n },\n\n /**\n * ツリーを更新する\n */\n refreshTree: function (disableCheck) {\n if (disableCheck === undefined) {\n disableCheck = false;\n }\n var treeData = $.bcTree.jsTree.get_json('#', {flat: true});\n sort = 1;\n // 並び順を特定する番号を更新する\n $(treeData).each(function () {\n var node = $.bcTree.jsTree.get_node(this.id);\n node.data.jstree.sort = sort;\n sort++;\n });\n // 公開状態によってカラーリングを更新する\n $(\"li.jstree-node\").each(function (i) {\n var node = $.bcTree.jsTree.get_node(this);\n // =====================================================================================================\n // コンテンツをドラッグ&ドロップした際に、階層が変更となると、フロントエンドの確認を行う為のURLの更新も行う必要がある。\n // 現在、対象コンテンツは更新されるが、フォルダの場合、子のコンテンツのURLが更新できていない為、\n // 確認ボタンをクリックするとNot Found となる。そのため一時的な対策として、確認ボタンを無効にする\n // TODO D&Dの際、子コンテンツのURLを返却し全てのコンテンツの確認ができるようにする\n // =====================================================================================================\n if (disableCheck) {\n node.data.jstree.contentFullUrl = false;\n }\n\n $(this).find('div.jstree-wholerow').each(function () {\n $(this).removeClass('jstree-unpublish-odd jstree-unpublish-even jstree-publish-odd jstree-publish-even');\n return false;\n });\n if (node.data.jstree.status == false) {\n if (i % 2 == 0) {\n $(this).find('div.jstree-wholerow').each(function () {\n $(this).addClass('jstree-unpublish-odd');\n return false;\n });\n } else {\n $(this).find('div.jstree-wholerow').each(function () {\n $(this).addClass('jstree-unpublish-even');\n return false;\n });\n }\n } else {\n if (i % 2 == 0) {\n $(this).find('div.jstree-wholerow').each(function () {\n $(this).addClass('jstree-publish-odd');\n return false;\n });\n } else {\n $(this).find('div.jstree-wholerow').each(function () {\n $(this).addClass('jstree-publish-even');\n return false;\n });\n }\n }\n if (node.data.jstree.alias) {\n $(this).find('a i.jstree-icon:first').after('');\n }\n $(this).find('a.jstree-anchor:first').after('');\n $(this).find('.content-name').remove();\n if (node.data.jstree.name) {\n $(this).find('a.jstree-anchor:first').after('( ' + decodeURIComponent(node.data.jstree.name) + ' )')\n }\n });\n $(\"span.function\").on('click', function (e) {\n $.bcTree.jsTree.deselect_all();\n $.bcTree.jsTree.select_node($.bcTree.jsTree.get_node($(this).parent().attr('id')));\n $.bcTree.jsTree.show_contextmenu($.bcTree.jsTree.get_selected(), e.pageX, e.pageY);\n return false;\n });\n $(\"span.function\").on('contextmenu', function (e) {\n $.bcTree.jsTree.deselect_all();\n $.bcTree.jsTree.select_node($.bcTree.jsTree.get_node($(this).parent().attr('id')));\n $.bcTree.jsTree.show_contextmenu($.bcTree.jsTree.get_selected(), e.pageX, e.pageY);\n return false;\n });\n if ($.bcTree.config.isUseMoveContents) {\n $(\".jstree-icon\").css('cursor', 'move');\n }\n },\n\n /**\n * ゴミ箱から元にもどす\n *\n * @param node\n */\n returnContent: function (node) {\n $.bcToken.check(function () {\n return $(location).prop('href', $.bcUtil.adminBaseUrl + 'baser-core' + '/contents/trash_return/' + node.data.jstree.contentId);\n }, {hideLoader: false});\n },\n\n /**\n * Open Url\n *\n * @param url\n * @param forceBlank\n */\n openUrl: function (url, forceBlank) {\n forceBlank = forceBlank === undefined ? false : forceBlank;\n if ($.bcTree.ctrlOnAnchor || forceBlank) {\n window.open(url);\n } else if ($.bcTree.shiftOnAnchor) {\n window.open(url, '_blank');\n } else {\n window.location.href = url;\n }\n },\n\n /**\n * Create Menu\n *\n * @param setting\n * @param parent\n * @returns {{label: string, icon: string, action: function}}\n */\n createMenu: function (setting, parent, current, i) {\n var type = 'default';\n var contentAliasId = null;\n var contentTitle = bcI18n.bcTreeNewTitle.sprintf(setting.title);\n var contentPlugin = setting.plugin;\n var contentType = setting.type;\n var contentEntityId = null;\n var iconAdd;\n var iconMenu;\n if (setting.url.icon) {\n iconAdd = iconMenu = setting.url.icon;\n } else {\n iconAdd = iconMenu = setting.icon;\n }\n if (setting.type == 'ContentFolder') {\n var separatorBefore = true;\n type = 'folder';\n } else if (setting.type == 'ContentLink') {\n var separatorAfter = true;\n } else if (setting.type == 'ContentAlias') {\n iconAdd = current.icon;\n contentAliasId = current.contentId;\n contentPlugin = current.contentPlugin;\n contentType = current.contentType;\n contentTitle = bcI18n.bcTreeAliasTitle.sprintf(current.contentTitle);\n contentEntityId = current.contentEntityId;\n } else {\n if ((!setting['multiple'] && setting['exists'])) {\n contentTitle = bcI18n.bcTreeAliasTitle.sprintf(setting['existsTitle']);\n }\n }\n\n return {\n label: \"\" + i + \".\" + setting.title,\n icon: iconMenu,\n separator_before: separatorBefore,\n separator_after: separatorAfter,\n action: function () {\n $.bcTree.createContent(parent, {\n type: type,\n icon: iconAdd,\n contentParentId: parent.data.jstree.contentId,\n contentTitle: contentTitle,\n contentPlugin: contentPlugin,\n contentType: contentType,\n contentSiteId: parent.data.jstree.contentSiteId,\n contentAliasId: contentAliasId,\n contentEntityId: contentEntityId\n });\n }\n };\n },\n\n /**\n * Create Content\n *\n * @param parent\n * @param data\n */\n createContent: function (parent, data) {\n var _data = {\n icon: null,\n type: 'default',\n status: false,\n contentId: null,\n contentParentId: null,\n contentTitle: bcI18n.bcTreeUnNamedTitle,\n contentPlugin: null,\n contentType: null,\n contentEntityId: null,\n contentFullUrl: null,\n contentSiteId: null,\n contentAliasId: null\n };\n $.extend(true, _data, data);\n data = _data;\n var url = '';\n // シングルコンテンツでデータが既に存在する場合 エイリアス作成の場合\n if ((!$.bcTree.settings[data.contentType]['multiple'] && $.bcTree.settings[data.contentType]['exists']) || data.contentAliasId) {\n url = $.bcUtil.apiBaseUrl + 'baser-core' + '/contents/add_alias';\n data.alias = true;\n } else {\n url = $.bcTree.settings[data.contentType]['url']['add'];\n }\n var nodeId = $.bcTree.jsTree.create_node(parent, {\n text: data.contentTitle,\n data: {jstree: data}\n });\n var node = $.bcTree.jsTree.get_node(nodeId);\n $.bcTree.jsTree.edit(node, data.contentTitle, function (editNode) {\n $.bcToken.check(function () {\n const content = {\n parent_id: data.contentParentId,\n title: editNode.text,\n plugin: data.contentPlugin,\n type: data.contentType,\n site_id: data.contentSiteId,\n alias_id: data.contentAliasId,\n entity_id: data.contentEntityId\n };\n return $.ajax({\n url: url,\n headers: {\n \"Authorization\": $.bcJwt.accessToken,\n },\n type: 'POST',\n data: {\n _csrfToken: $.bcToken.key,\n content: content,\n },\n dataType: 'json',\n beforeSend: function () {\n this.data = $.bcTree.fillExtraData(this.data, data);\n $.bcUtil.hideMessage();\n $.bcUtil.showLoader();\n },\n success: function (result) {\n $.bcUtil.showNoticeMessage(result.message);\n $.bcTree.settings[data.contentType]['exists'] = true;\n $.bcTree.settings[data.contentType]['existsTitle'] = editNode.text;\n data.contentId = result.content.id;\n data.contentEntityId = result.content.entity_id;\n data.name = decodeURIComponent(result.content.name);\n node.data.jstree = data;\n $.bcTree.refreshTree();\n },\n error: function (XMLHttpRequest) {\n XMLHttpRequest.responseText = null;\n $.bcUtil.showAjaxError(bcI18n.bcTreeAlertMessage6, XMLHttpRequest);\n $.bcTree.jsTree.delete_node(node);\n $.bcUtil.hideLoader();\n }\n }).then(function () {\n return $.bcUtil.ajax($.bcUtil.apiBaseUrl + 'baser-core' + '/contents/get_full_url/' + data.contentId, {}, {\n type: 'GET',\n dataType: 'json'\n }).done(function (result) {\n data.contentFullUrl = decodeURI(result.fullUrl);\n node.data.jstree = data;\n if (data.contentType == 'ContentFolder') {\n node.type = 'folder'\n }\n });\n });\n }\n , {hideLoader: false});\n });\n },\n /**\n * ポスト用のデータにコンテンツの種類に基づいた不足データを追加する\n *\n * @param postData 送信用データ\n * @param settingData 保持してるデータ\n */\n fillExtraData: function (postData, settingData) {\n const extra = (() => {\n switch (settingData.contentType) {\n case \"ContentFolder\":\n return {\n folder_template: \"\",\n page_template: \"\"\n };\n case \"Page\":\n return {\n contents: \"\",\n draft: \"\",\n page_template: \"\",\n code: \"\"\n };\n default:\n break;\n }\n })();\n if (extra) {\n postData += '&' + encodeURI($.param(extra));\n }\n return postData;\n },\n\n /**\n * Delete Content\n *\n * @param node\n */\n deleteContent: function (node) {\n var data = node.data.jstree;\n $.bcToken.check(function () {\n return $.ajax({\n url: $.bcUtil.apiBaseUrl + 'baser-core/contents/delete',\n headers: {\n \"Authorization\": $.bcJwt.accessToken,\n },\n type: 'POST',\n data: {\n id: data.contentId,\n entity_id: data.contentEntityId,\n alias: data.alias,\n _csrfToken: $.bcToken.key,\n },\n dataType: 'json',\n beforeSend: function () {\n $.bcUtil.hideMessage();\n $.bcUtil.showLoader();\n },\n success: function (result) {\n $.bcUtil.showNoticeMessage(result.message);\n $.bcToken.key = null;\n $.bcTree.jsTree.delete_node(node);\n // エイリアス削除\n var nodes = $.bcTree.jsTree.get_json(null, {flat: true});\n for (var i = 0; i < nodes.length; i++) {\n if (data.contentId == nodes[i].state.contentAliasId) {\n $.bcTree.jsTree.delete_node(nodes[i]);\n }\n }\n $.bcTree.refreshTree();\n $.bcUtil.hideLoader();\n },\n error: function (XMLHttpRequest) {\n $.bcToken.key = null;\n $.bcUtil.showAjaxError(bcI18n.bcTreeAlertMessage4, XMLHttpRequest);\n $.bcUtil.hideLoader();\n }\n });\n }, {useUpdate: false, hideLoader: false});\n },\n\n /**\n * Copy Content\n *\n * @param parent\n * @param node\n */\n copyContent: function (parent, node) {\n var data = $.extend(true, {}, node.data.jstree);\n data.contentTitle = bcI18n.bcTreeCopyTitle.sprintf(data.contentTitle);\n data.status = false;\n $.bcToken.check(function () {\n return $.ajax({\n url: $.bcTree.settings[data.contentType]['url']['copy'],\n headers: {\n \"Authorization\": $.bcJwt.accessToken,\n },\n type: 'POST',\n data: {\n content_id: data.contentId,\n entity_id: data.contentEntityId,\n title: data.contentTitle,\n parent_id: data.contentParentId,\n site_id: data.contentSiteId,\n _csrfToken: $.bcToken.key,\n },\n dataType: 'json',\n beforeSend: function () {\n $.bcUtil.hideMessage();\n $.bcUtil.showLoader();\n },\n success: function (result) {\n $.bcToken.key = null;\n $.bcTree.settings[data.contentType]['exists'] = true;\n $.bcTree.settings[data.contentType]['existsTitle'] = data.contentTitle;\n data.contentId = result.content.id;\n data.contentEntityId = result.content.entity_id;\n data.contentTitle = data.contentTitle.replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>');\n $.ajax($.bcUtil.apiBaseUrl + 'baser-core/contents/get_full_url/' + data.contentId, {\n headers: {\n \"Authorization\": $.bcJwt.accessToken,\n },\n type: 'GET',\n dataType: 'json'\n }).done(function (result) {\n data.contentFullUrl = result.fullUrl;\n var nodeId = $.bcTree.jsTree.create_node(parent, {\n text: data.contentTitle,\n data: {jstree: data}\n });\n var newNode = $.bcTree.jsTree.get_node(nodeId);\n newNode.data.jstree = data;\n if (data.contentType === 'ContentFolder') {\n newNode.type = 'folder'\n }\n $.bcUtil.hideLoader();\n $.bcTree.renameContent(newNode, data.contentTitle, true);\n });\n },\n error: function (XMLHttpRequest) {\n $.bcToken.key = null;\n $.bcUtil.showAjaxError(bcI18n.commonCopyFailedMessage, XMLHttpRequest);\n $.bcUtil.hideLoader();\n }\n });\n }, {useUpdate: false, hideLoader: false});\n },\n\n /**\n * Rename Content\n *\n * @param node\n * @param defaultTitle 初期タイトル\n * @param first 新規登録時の初回リネームかどうか\n */\n renameContent: function (node, defaultTitle, first) {\n if (first === undefined) {\n first = false;\n }\n var oldTitle = defaultTitle;\n $.bcTree.jsTree.edit(node, oldTitle, function (editNode) {\n var newTitle = editNode.text;\n $.bcTree.jsTree.rename_node(editNode, newTitle);\n if (oldTitle === newTitle) {\n return false;\n }\n $.bcToken.check(function () {\n return $.ajax({\n url: $.bcUtil.apiBaseUrl + 'baser-core/contents/rename',\n headers: {\n \"Authorization\": $.bcJwt.accessToken,\n },\n type: 'PATCH',\n dataType: 'json',\n data: {\n id: node.data.jstree.contentId,\n title: newTitle,\n first: +first, // 0 Or 1 に変換\n _csrfToken: $.bcToken.key,\n },\n beforeSend: function () {\n $.bcUtil.hideMessage();\n $.bcUtil.showLoader();\n },\n success: function (result) {\n if (!result) {\n $.bcUtil.showNoticeMessage(result.message);\n }\n $.bcTree.settings[node.data.jstree.contentType]['existsTitle'] = editNode.text;\n editNode.data.jstree.contentFullUrl = result.url;\n editNode.data.jstree.name = result.name;\n $.bcTree.refreshTree();\n },\n error: function (XMLHttpRequest) {\n $.bcTree.jsTree.rename_node(editNode, defaultTitle);\n XMLHttpRequest.responseText = null;\n $.bcUtil.showAjaxError(bcI18n.bcTreeAlertMessage5, XMLHttpRequest);\n },\n complete: function () {\n $.bcUtil.hideLoader();\n }\n })\n }, {hideLoader: false});\n });\n },\n\n /**\n * Create Link\n *\n * @param base\n * @param contentParentId\n * @param contentEntityId\n * @returns string\n */\n createLink: function (base, contentId, contentParentId, contentEntityId) {\n var url = base;\n if (contentEntityId) {\n url += '/' + contentEntityId;\n }\n if (contentId) {\n url += '/content_id:' + contentId;\n }\n if (contentParentId) {\n url += '/parent_id:' + contentParentId;\n }\n return url;\n },\n\n /**\n * コンテンツを並び替える\n *\n * @param e\n * @param data\n */\n orderContent: function (e, data) {\n $.bcTree.changeNormalCursor();\n var cancel = false;\n var node = $.bcTree.jsTree.get_node(data.element);\n if (!node) {\n node = $.bcTree.dragTarget;\n }\n if (!node) {\n cancel = true;\n }\n var oldSort = node.data.jstree.sort;\n $.bcTree.refreshTree();\n var newSort = node.data.jstree.sort;\n var offset = newSort - oldSort;\n if (offset == 0) {\n if (!$.bcTree.dropTarget) {\n cancel = true;\n }\n if (node.data.jstree.contentParentId == $.bcTree.dropTarget.data.jstree.contentId) {\n cancel = true;\n }\n }\n\n if (cancel || !confirm(bcI18n.commonSortSaveConfirmMessage)) {\n // コンテンツを別のフォルダに移動するか、コンテンツを上から下に移動\n if (node.parent != $.bcTree.beforeParentId || offset >= 0) {\n $.bcTree.jsTree.move_node(node, $.bcTree.beforeParentId, $.bcTree.beforePosition);\n // コンテンツを下から上に移動\n } else {\n $.bcTree.jsTree.move_node(node, $.bcTree.beforeParentId, $.bcTree.beforePosition + 1);\n }\n $.bcTree.refreshTree();\n return false;\n }\n\n if ($.bcTree.dropTarget) {\n $.bcTree.jsTree.open_node($.bcTree.dropTarget);\n }\n\n var nextNode = $.bcTree.jsTree.get_node($.bcTree.jsTree.get_next_dom(node, true));\n var targetId = null;\n if (nextNode) {\n targetId = nextNode.data.jstree.contentId;\n }\n $.bcToken.check(function () {\n return $.ajax({\n url: $.bcUtil.apiBaseUrl + 'baser-core/contents/move',\n headers: {\n \"Authorization\": $.bcJwt.accessToken,\n },\n type: 'PATCH',\n data: {\n origin: {\n id: node.data.jstree.contentId,\n parentId: node.data.jstree.contentParentId,\n type: node.data.jstree.contentType,\n entityId: node.data.jstree.contentEntityId,\n },\n target: {\n id: targetId,\n parentId: $.bcTree.dropTarget.data.jstree.contentId,\n siteId: $.bcTree.dropTarget.data.jstree.contentSiteId,\n },\n listDisplayed: $.bcTree.listDisplayed,\n _csrfToken: $.bcToken.key,\n },\n dataType: 'json',\n beforeSend: function () {\n $.bcUtil.hideMessage();\n $.bcUtil.showLoader();\n },\n success: function (result) {\n node.data.jstree.contentFullUrl = result.url;\n $.bcTree.refreshTree(true);\n node.data.jstree.contentParentId = $.bcTree.dropTarget.data.jstree.contentId;\n $.bcUtil.showNoticeMessage(result.message);\n $.bcUtil.hideLoader();\n },\n error: function (XMLHttpRequest) {\n XMLHttpRequest.responseText = null;\n $.bcUtil.showAjaxError(bcI18n.commonSortSaveFailedMessage, XMLHttpRequest);\n $.bcTree.load();\n },\n complete: function () {\n }\n });\n }, {hideLoader: false});\n },\n\n /**\n * 外部よりメニューを表示する\n *\n * @param e\n * @returns {boolean}\n */\n showMenuByOuter: function (e) {\n $.bcTree.contextmenuAddOnly = true;\n var selected = $.bcTree.jsTree.get_selected();\n if (!selected.length) {\n $.bcTree.jsTree.select_node($.bcTree.jsTree.get_json());\n }\n $.bcTree.jsTree.show_contextmenu($.bcTree.jsTree.get_selected(), e.pageX, e.pageY);\n $.bcTree.contextmenuAddOnly = false;\n return false;\n },\n\n /**\n * Shift / Ctrl キーの押印状態を更新する\n *\n * @param e\n */\n updateShiftAndCtrlOnAnchor: function (e) {\n $.bcTree.shiftOnAnchor = e.shiftKey;\n $.bcTree.ctrlOnAnchor = (e.ctrlKey || e.metaKey);\n },\n\n changeDnDCursor: function () {\n $(\"#ContentsTreeList .jstree-wholerow\").css('cursor', 'move');\n $(\"#ContentsTreeList .jstree-anchor\").css('cursor', 'move');\n $(\"#ContentsTreeList .function\").css('cursor', 'move');\n $(\"#ContentsTreeList .jstree-ocl\").css('cursor', 'move');\n },\n\n changeNormalCursor: function () {\n $(\"#ContentsTreeList .jstree-wholerow\").css('cursor', 'pointer');\n $(\"#ContentsTreeList .jstree-anchor\").css('cursor', 'pointer');\n $(\"#ContentsTreeList .function\").css('cursor', 'pointer');\n $(\"#ContentsTreeList .jstree-ocl\").css('cursor', 'pointer');\n }\n\n };\n})(jQuery);\n","/**\n * baserCMS : Based Website Development Project \n * Copyright (c) NPO baser foundation \n *\n * @copyright Copyright (c) NPO baser foundation\n * @link https://basercms.net baserCMS Project\n * @since 5.0.0\n * @license https://basercms.net/license/index.html MIT License\n */\n\n\n/**\n * サイドバーのコンテンツメニューを設定する\n */\nwindow.addEventListener('DOMContentLoaded', function () {\n\tvar componentId = 'AdminMenu';\n\tvar tmpl = document.querySelector('[data-js-tmpl=\"' + componentId + '\"]');\n\tvar dataStore = document.getElementById(componentId);\n\tvar data = null;\n\ttry {\n\t\tdata = JSON.parse(dataStore ? dataStore.textContent : '{}');\n\t} catch (error) {\n\t\tif (window.console) {\n\t\t\tconsole.warn('管理メニューのデータが破損しています(JSONデータが不正です)')\n\t\t}\n\t}\n\n\tif (tmpl && data && data.menuList && data.menuList.length) {\n\n\t\tvar contentList = [];\n\t\tvar systemList = [];\n\n\t\tdata.menuList.forEach(function (item, i) {\n\t\t\tif (item.type === 'system') {\n\t\t\t\t//item.menus = item.menus.filter(function (menu) { return menu.url !== item.url });\n\t\t\t\tsystemList.push(item);\n\t\t\t} else {\n\t\t\t\tcontentList.push(item);\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * for deubg\n\t\t */\n\t\t// console.log($.extend(true, {}, contentList));\n\t\t// console.log($.extend(true, {}, systemList));\n\n\t\ttmpl.hidden = false;\n\t\tvar isSystemSettingPage = systemList.some(function (item) { return (item.current || item.expanded); });\n\t\tvar app = new Vue({\n\t\t\tel: tmpl,\n\t\t\tdata: {\n\t\t\t\tsystemExpanded: isSystemSettingPage,\n\t\t\t\tbaseURL: $.baseUrl(),\n\t\t\t\tcurrentSiteId: data.currentSiteId,\n\t\t\t\tcontentList: contentList,\n\t\t\t\tisSystemSettingPage: isSystemSettingPage,\n\t\t\t\tsystemList: systemList\n\t\t\t},\n\t\t\tmethods: {\n\t\t\t\topenSystem: function () {\n\t\t\t\t\tapp.systemExpanded = !app.systemExpanded;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t} else {\n\n\t\tif (window.console) {\n\t\t\tconsole.warn('データが空のため、管理メニューは表示されませんでした');\n\t\t}\n\n\t}\n\n});\n\n","/**\n * baserCMS : Based Website Development Project \n * Copyright (c) NPO baser foundation \n *\n * @copyright Copyright (c) NPO baser foundation\n * @link https://basercms.net baserCMS Project\n * @since 5.0.0\n * @license https://basercms.net/license/index.html MIT License\n */\nimport Cookies from 'js-cookie'\n\n(function ($) {\n $.bcUtil = {\n /**\n * hideMessage() を無効にする\n */\n disabledHideMessage: false,\n\n\n /**\n * ベースとなるURL\n */\n baseUrl: null,\n\n /**\n * BaserCoreプレフィックス\n */\n baserCorePrefix: null,\n\n /**\n * 管理画面用URLプレフィックス\n */\n adminPrefix: null,\n\n /**\n * 管理画面用のベースURL\n */\n adminBaseUrl: null,\n\n /**\n * API用のベースURL\n */\n apiBaseUrl: null,\n\n /**\n * Ajaxローダーのパス\n */\n ajaxLoaderPath: null,\n\n /**\n * Ajaxローダー(小)のパス\n */\n ajaxLoaderSmallPath: null,\n\n /**\n * 初期化\n *\n * @param config\n */\n init: function (config) {\n var adminScript = $(\"#AdminScript\");\n $.bcUtil.baseUrl = adminScript.attr('data-baseUrl');\n $.bcUtil.baserCorePrefix = adminScript.attr('data-baserCorePrefix');\n $.bcUtil.adminPrefix = adminScript.attr('data-adminPrefix');\n $.bcUtil.ajaxLoaderPath = adminScript.attr('data-ajaxLoaderPath');\n $.bcUtil.ajaxLoaderSmallPath = adminScript.attr('data-ajaxLoaderSmallPath');\n $.bcUtil.frontFullUrl = adminScript.attr('data-frontFullUrl');\n if (config.baseUrl !== undefined) {\n $.bcUtil.baseUrl = config.baseUrl;\n }\n if (config.baserCorePrefix !== undefined) {\n $.bcUtil.baserCorePrefix = config.baserCorePrefix;\n }\n if (config.adminPrefix !== undefined) {\n $.bcUtil.adminPrefix = config.adminPrefix;\n }\n if (config.ajaxLoaderPath !== undefined) {\n $.bcUtil.ajaxLoaderPath = config.ajaxLoaderPath;\n }\n if (config.ajaxLoaderSmallPath !== undefined) {\n $.bcUtil.ajaxLoaderSmallPath = config.ajaxLoaderSmallPath;\n }\n $.bcUtil.adminBaseUrl = $.bcUtil.baseUrl + '/' + $.bcUtil.baserCorePrefix + '/' + $.bcUtil.adminPrefix + '/';\n $.bcUtil.apiBaseUrl = $.bcUtil.baseUrl + '/' + $.bcUtil.baserCorePrefix + '/api/';\n },\n /**\n * アラートメッセージを表示\n *\n * @param message\n */\n showAlertMessage: function (message) {\n $.bcUtil.hideMessage();\n $(\"#BcSystemMessage\")\n .removeClass('notice-messge alert-message')\n .addClass('alert-message')\n .html(message);\n $(\"#BcMessageBox\").fadeIn(500);\n },\n\n /**\n * ノーティスメッセージを表示\n *\n * @param message\n */\n showNoticeMessage: function (message) {\n $.bcUtil.hideMessage();\n $(\"#BcSystemMessage\")\n .removeClass('notice-messge alert-message')\n .addClass('notice-message')\n .html(message);\n $(\"#BcMessageBox\").fadeIn(500);\n },\n\n /**\n * メッセージを隠す\n */\n hideMessage: function () {\n if (!$.bcUtil.disabledHideMessage) {\n $(\"#BcMessageBox\").fadeOut(200);\n $(\"#AlertMessage\").fadeOut(200);\n $(\"#MessageBox\").fadeOut(200);\n }\n },\n\n /**\n * ローダーを表示\n */\n showLoader: function (type, selector, key) {\n if (type == undefined || (type != 'none' && selector == undefined)) {\n type = 'over';\n }\n switch (type) {\n case 'over':\n $(\"#Waiting\").show();\n break;\n case 'inner':\n var div = $('').css({'text-align': 'center'}).attr('id', key);\n var img = $('
![]()
').attr('src', $.bcUtil.ajaxLoaderPath);\n div.html(img);\n $(selector).html(div);\n break;\n case 'after':\n var img = $('
![]()
').attr('src', $.bcUtil.ajaxLoaderSmallPath).attr('id', key).css({\n 'width':'16px',\n 'vertical-align': 'middle',\n 'margin':'5px'\n });\n $(selector).after(img);\n break;\n case 'target':\n $(selector).show();\n break;\n case 'none':\n break;\n }\n },\n\n /**\n * ローダーを隠す\n */\n hideLoader: function (type, selector, key) {\n if (type == undefined || (type != 'none' && selector == undefined)) {\n type = 'over';\n }\n switch (type) {\n case 'over':\n $(\"#Waiting\").hide();\n break;\n case 'inner':\n $(\"#\" + key).remove();\n break;\n case 'after':\n $(\"#\" + key).remove();\n break;\n case 'target':\n $(selector).show();\n break;\n case 'none':\n break;\n }\n },\n\n /**\n * Ajax\n */\n ajax: function (url, success, config) {\n if (!config) {\n config = {};\n }\n var loaderType, loaderSelector, loaderKey;\n var hideLoader = true;\n if (typeof config.loaderType !== 'undefined') {\n loaderType = config.loaderType;\n delete config.loaderType;\n }\n if (typeof config.loaderSelector !== 'undefined') {\n loaderSelector = config.loaderSelector;\n delete config.loaderSelector;\n loaderKey = loaderSelector.replace(/\\./g, '').replace(/#/g, '').replace(/\\s/g, '') + 'loaderkey';\n }\n if (typeof config.hideLoader !== 'undefined') {\n hideLoader = config.hideLoader;\n delete config.loaderType;\n }\n var ajaxConfig = {\n url: url,\n headers: {\n \"Authorization\": $.bcJwt.accessToken,\n },\n type: 'POST',\n dataType: 'html',\n beforeSend: function () {\n $.bcUtil.showLoader(loaderType, loaderSelector, loaderKey);\n },\n complete: function () {\n if (hideLoader) {\n $.bcUtil.hideLoader(loaderType, loaderSelector, loaderKey);\n }\n },\n error: function (XMLHttpRequest, textStatus, errorThrown) {\n $.bcUtil.showAjaxError(bcI18n.commonExecFailedMessage, XMLHttpRequest, errorThrown);\n },\n success: success\n };\n if (config) {\n $.extend(ajaxConfig, config);\n }\n return $.ajax(ajaxConfig);\n },\n\n /**\n * Ajax のエラーメッセージを表示\n *\n * @param XMLHttpRequest\n * @param errorThrown\n * @param message\n */\n showAjaxError: function (message, XMLHttpRequest, errorThrown) {\n var errorMessage = '';\n if (XMLHttpRequest !== undefined && XMLHttpRequest.status) {\n errorMessage = '
(' + XMLHttpRequest.status + ') ';\n }\n if(XMLHttpRequest !== undefined && XMLHttpRequest.responseJSON){\n errorMessage += XMLHttpRequest.responseJSON.message;\n }\n if (XMLHttpRequest !== undefined && XMLHttpRequest.responseText) {\n errorMessage += '
' + XMLHttpRequest.responseText;\n } else if (errorThrown !== undefined) {\n errorMessage += '
' + errorThrown;\n }\n $.bcUtil.showAlertMessage(message + errorMessage);\n },\n\n /**\n * フラッシュメッセージをセットする\n *\n * 一度しか表示できないメッセージ\n * @param message\n */\n setFlashMessage: function(message) {\n Cookies.set('bcFlashMessage', message);\n },\n\n /**\n * フラッシュメッセージを表示する\n *\n * 一度表示したら削除する\n */\n showFlashMessage: function () {\n let message = Cookies.get('bcFlashMessage');\n if(message !== undefined) {\n this.showNoticeMessage(message);\n Cookies.remove('bcFlashMessage')\n }\n }\n\n };\n})(jQuery);\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t369: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkbc_admin_third\"] = self[\"webpackChunkbc_admin_third\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [339], () => (__webpack_require__(538)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","$","baseUrl","attr","jQuery","changeRow","checkbox","undefined","parent","addClass","removeClass","toolChangeHandler","config","bcBatch","methodSelect","val","executeButton","removeAttr","prop","batchUrl","listTable","checkAll","targetCheckbox","alertBox","loader","flashBox","init","extend","this","initList","unbind","click","length","alert","bcI18n","commonSelectDataFailedMessage","confirm","batchConfirmMessage","form","append","clone","each","value","replace","bcToken","check","key","ajax","url","headers","bcJwt","accessToken","type","data","serialize","dataType","beforeSend","bcUtil","hideMessage","showLoader","success","result","setFlashMessage","message","location","reload","error","XMLHttpRequest","textStatus","errorThrown","errorMessage","status","commonNotFoundProgramMessage","responseText","JSON","parse","remove","showAlertMessage","commonBatchExecFailedMessage","hideLoader","useUpdate","change","find","e","stopPropagation","initRowSelected","bcCkeditor","editor","initStatus","styleInitStatus","show","setUpConfig","CKEDITOR","addStylesSet","initialStyle","editorStyle","map","themeEditorCsses","css","Array","isArray","contentsCss","push","ckeditorField","editorDomId","editorOptions","setUpDraft","setUpToolBar","allowedContent","extraPlugins","stylesCombo_stylesSet","editorStylesSet","protectedSource","dtd","$removeEmpty","editorUrl","templates_files","editorEnterBr","enterMode","ENTER_BR","editorUseDraft","on","draftAreaId","draftDraftAreaId","publishAreaId","draftPublishAreaId","editorReadonlyPublish","draftReadOnlyPublish","editorDisableDraft","execCommand","editorDisablePublish","name","previewModeId","getCommand","uiItems","state","hide","bcConfirm","title","bcConfirmTitle1","bcConfirmAlertMessage1","defaultCancel","ok","html","dialog","modal","width","buttons","bcConfirmAlertMessage2","bcCredit","adminBaseUrl","hideTarget","isLogin","$html","$page","$credit","openedFavorite","prepend","$creditScroller","fadeIn","fadeOut","setViewSize","window","resize","resizeScroll","height","posX","id","setInterval","clearInterval","clearTimeout","event","cancelBubble","$toolBar","outerHeight","$body","refreshToken","localStorage","getItem","getToken","login","email","password","saved","successCallback","errorCallback","apiBaseUrl","done","response","setToken","access_token","refresh_token","bind","fail","async","setItem","logout","removeToken","bcSortable","updateSortUrl","sortHandle","sortTable","sortable","sortableOptions","scroll","items","opacity","zIndex","containment","tolerance","distance","cursor","handle","placeholder","revert","start","sortStartHandler","update","sortUpdateHandler","ui","item","target","offset","index","sortId","sortOffset","getHiddenToken","i","v","complete","bcTimeUtil","getNowDateTime","getNowDate","getNowTime","date","Date","year","getFullYear","month","getMonth","day","getDate","hour","getHours","minute","getMinutes","requested","requesting","defaultUrl","setTokenUrl","callback","timer","execCallback","_config","loaderType","always","getForm","options","fields","unlocked","debug","submitToken","submit","replaceLinkToSubmitToken","selector","match","get","onclick","postLinkForm","bcTree","shiftOnAnchor","ctrlOnAnchor","contextmenuAddOnly","settings","dropTarget","dragTarget","treeDom","jsTree","listDisplayed","beforeParentId","beforePosition","currentSiteId","isAdmin","isUseMoveContents","adminPrefix","editInIndexDisabled","_inited","load","_init","trigger","parseJSON","createTree","jstree","old_parent","old_position","updateShiftAndCtrlOnAnchor","nodeId","closest","get_node","alias","contentType","editDisabled","openUrl","contentId","createLink","baserCorePrefix","contentParentId","contentEntityId","isAliasMenuByLabel","trim","text","after","isAddMenuByLabel","refreshTree","destroy","operation","node","node_parent","node_position","more","contentSiteRoot","mode","get_parent","manageDisabled","editUrl","manageUrl","copyUrl","isEnabled","deleteLabel","menu","contentFullUrl","label","bcTreeCheck","obj","related","bcTreeUnpublish","siteId","contentSiteId","_csrfToken","showAjaxError","commonChangePublishFailedMessage","bcTreePublish","bcTreeManage","bcTreeRename","renameContent","bcTreeEdit","bcTreeCopy","copyContent","bcTreeDelete","bcTreeToTrash","deleteDisabled","bcTreeConfirmToTrash","bcTreeConfirmDeleteAlias","deleteContent","_disabled","bcTreeUndo","contentAliasId","exists","returnContent","bcTreeAlertMessage1","bcTreeEmptyTrash","bcTreeConfirmMessage1","empty","nodes","delete_node","showNoticeMessage","bcTreeInfoMessage1","bcTreeAlertMessage2","Default","ContentAlias","addMenu","counter","maxContents","addDisabled","createMenu","get_selected","multiple","disableCheck","treeData","get_json","flat","sort","decodeURIComponent","deselect_all","select_node","show_contextmenu","pageX","pageY","forceBlank","open","href","setting","current","iconAdd","iconMenu","contentTitle","bcTreeNewTitle","sprintf","contentPlugin","plugin","icon","separatorBefore","separatorAfter","bcTreeAliasTitle","separator_before","separator_after","action","createContent","_data","bcTreeUnNamedTitle","create_node","edit","editNode","content","parent_id","site_id","alias_id","entity_id","fillExtraData","bcTreeAlertMessage6","then","decodeURI","fullUrl","postData","settingData","extra","folder_template","page_template","contents","draft","code","encodeURI","param","bcTreeAlertMessage4","bcTreeCopyTitle","content_id","newNode","commonCopyFailedMessage","defaultTitle","first","oldTitle","newTitle","rename_node","bcTreeAlertMessage5","base","orderContent","changeNormalCursor","cancel","element","oldSort","commonSortSaveConfirmMessage","move_node","open_node","nextNode","get_next_dom","targetId","origin","parentId","entityId","commonSortSaveFailedMessage","showMenuByOuter","shiftKey","ctrlKey","metaKey","changeDnDCursor","addEventListener","componentId","tmpl","document","querySelector","dataStore","getElementById","textContent","console","warn","menuList","contentList","systemList","forEach","hidden","isSystemSettingPage","some","expanded","app","Vue","el","systemExpanded","baseURL","methods","openSystem","disabledHideMessage","ajaxLoaderPath","ajaxLoaderSmallPath","adminScript","frontFullUrl","div","img","loaderSelector","loaderKey","ajaxConfig","commonExecFailedMessage","responseJSON","Cookies","showFlashMessage","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","Object","keys","every","splice","r","d","definition","o","defineProperty","enumerable","g","globalThis","Function","prototype","hasOwnProperty","Symbol","toStringTag","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","self","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file
diff --git a/plugins/bc-installer/config/setting.php b/plugins/bc-installer/config/setting.php
new file mode 100644
index 0000000000..12405d5902
--- /dev/null
+++ b/plugins/bc-installer/config/setting.php
@@ -0,0 +1,13 @@
+ [
+ 'phpVersion' => "8.1.0",
+ 'phpMemory' => "128",
+ 'MySQLVersion' => "5.0.0",
+ 'winSQLiteVersion' => "3.7.16",
+ 'PostgreSQLVersion' => "8.4.0"
+ ]
+];
diff --git a/plugins/bc-installer/gulpfile.js b/plugins/bc-installer/gulpfile.js
new file mode 100755
index 0000000000..728537c538
--- /dev/null
+++ b/plugins/bc-installer/gulpfile.js
@@ -0,0 +1,27 @@
+/**
+ * baserCMS : Based Website Development Project
+ * Copyright (c) NPO baser foundation
+ *
+ * @copyright Copyright (c) NPO baser foundation
+ * @link https://basercms.net baserCMS Project
+ * @since 5.0.0
+ * @license https://basercms.net/license/index.html MIT License
+ */
+
+const gulp = require("gulp");
+const webpack = require('webpack');
+const webpackStream = require('webpack-stream');
+const webpackConfig = require("./webpack.config");
+const JS_DEV_DIR = ['./src/js/'];
+const JS_DIST_DIR = './webroot/js/';
+
+gulp.task('bundle', () => {
+ return webpackStream(webpackConfig, webpack)
+ .pipe(gulp.dest(JS_DIST_DIR));
+});
+
+gulp.task('watch', function(){
+ gulp.watch(JS_DEV_DIR + "**/*.js", gulp.task('bundle'));
+});
+
+gulp.task('default', gulp.task('watch'));
diff --git a/plugins/bc-installer/package.json b/plugins/bc-installer/package.json
new file mode 100755
index 0000000000..3cce93768b
--- /dev/null
+++ b/plugins/bc-installer/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "bc-installer",
+ "version": "1.0.0",
+ "description": "baserCMS Installer",
+ "author": "NPO baser foundation",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/baserproject/ucmitz.git"
+ },
+ "bugs": {
+ "url": "https://github.com/baserproject/ucmitz/issues"
+ },
+ "homepage": "https://github.com/baserproject/ucmitz#readme",
+ "scripts": {
+ "dev": "gulp"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.13.10",
+ "@babel/preset-env": "^7.13.12",
+ "babel-loader": "^8.2.2",
+ "glob-parent": ">=5.1.2",
+ "gulp": "^4.0.2",
+ "postcss": ">=8.2.13",
+ "webpack": "^5.73.0",
+ "webpack-cli": "^4.10.0",
+ "webpack-stream": "^7.0.0"
+ }
+}
diff --git a/plugins/bc-installer/src/Controller/Admin/InstallationsController.php b/plugins/bc-installer/src/Controller/Admin/InstallationsController.php
index b839efdafb..2d90f483f3 100644
--- a/plugins/bc-installer/src/Controller/Admin/InstallationsController.php
+++ b/plugins/bc-installer/src/Controller/Admin/InstallationsController.php
@@ -12,291 +12,193 @@
namespace BcInstaller\Controller\Admin;
use BaserCore\Controller\Admin\BcAdminAppController;
+use BaserCore\Error\BcException;
use BaserCore\Utility\BcUtil;
+use BcInstaller\Service\Admin\InstallationsAdminService;
+use BcInstaller\Service\Admin\InstallationsAdminServiceInterface;
+use Cake\Core\Configure;
use Cake\Event\EventInterface;
+use Cake\ORM\Exception\PersistenceFailedException;
+use Cake\Utility\Hash;
/**
* Class InstallationsController
*
* インストーラーコントローラー
- *
- * @package Baser.Controller
- * @property BcManagerComponent $BcManager
*/
class InstallationsController extends BcAdminAppController
{
- /**
- * コンポーネント
- *
- * @var array
- */
- public $components = ['Session', 'BcEmail', 'BcManager'];
-
- /**
- * レイアウトパス
- *
- * @var string
- * @access public
- */
- public $layoutPath = 'admin';
-
- /**
- * サブフォルダ
- *
- * @var string
- * @access public
- */
- public $subDir = 'admin';
-
- /**
- * テーマ
- *
- * @var string
- */
- public $theme = 'Baseradmin';
-
- public $isInstalled = false;
-
/**
* beforeFilter
*
* @return void
+ * @checked
*/
public function beforeFilter(EventInterface $event)
{
parent::beforeFilter($event);
set_time_limit(300);
- /* インストール状態判別 */
- if (file_exists(APP . 'Config' . DS . 'database.php')) {
- ConnectionManager::sourceList();
- $db = ConnectionManager::$config;
- if ($db->default['datasource'] != '') {
- $installed = 'complete';
- } else {
- $installed = 'half';
- }
- } else {
- $installed = 'yet';
- }
-
- switch($this->request->action) {
- case 'alert':
- break;
- case 'reset':
- if (Configure::read('debug') != -1) {
- $this->notFound();
- }
- break;
- default:
- if ($installed === 'complete') {
- if ($this->request->action !== 'step5') {
- $this->notFound();
- }
- } else {
- $installationData = Cache::read('Installation', 'default');
- if (empty($installationData['lastStep'])) {
- if (Configure::read('debug') == 0) {
- $this->redirect(['action' => 'alert']);
- return;
- }
- }
- }
- break;
- }
+ // TODO ucmitz 以下、未実装
+// /* インストール状態判別 */
+// if (file_exists(APP . 'Config' . DS . 'database.php')) {
+// ConnectionManager::sourceList();
+// $db = ConnectionManager::$config;
+// if ($db->default['datasource'] != '') {
+// $installed = 'complete';
+// } else {
+// $installed = 'half';
+// }
+// } else {
+// $installed = 'yet';
+// }
+//
+// switch($this->request->action) {
+// case 'alert':
+// break;
+// case 'reset':
+// if (Configure::read('debug') != -1) {
+// $this->notFound();
+// }
+// break;
+// default:
+// if ($installed === 'complete') {
+// if ($this->request->action !== 'step5') {
+// $this->notFound();
+// }
+// } else {
+// $installationData = Cache::read('Installation', 'default');
+// if (empty($installationData['lastStep'])) {
+// if (Configure::read('debug') == 0) {
+// $this->redirect(['action' => 'alert']);
+// return;
+// }
+// }
+// }
+// break;
+// }
/*if (strpos($this->request->webroot, 'webroot') === false) {
$this->request->webroot = DS;
}*/
- $this->Security->csrfCheck = false;
- $this->Security->validatePost = false;
+// $this->Security->csrfCheck = false;
+// $this->Security->validatePost = false;
}
/**
* Step 1: ウェルカムページ
*
* @return void
+ * @noTodo
+ * @checked
*/
public function index()
{
- $this->setTitle(__d('baser', 'baserCMSのインストール'));
BcUtil::clearAllCache();
}
/**
* Step 2: 必須条件チェック
*
+ * @param InstallationsAdminService $service
* @return void
+ * @noTodo
+ * @checked
*/
- public function step2()
+ public function step2(InstallationsAdminServiceInterface $service)
{
- if ($this->request->getData() && $this->request->getData('clicked') === 'next') {
- $this->redirect('step3');
- return;
+ if ($this->request->getData('mode') === 'next') {
+ return $this->redirect(['action' => 'step3']);
}
-
- $checkResult = $this->BcManager->checkEnv();
-
- /* ダミーのデータベース設定ファイルを保存 */
- $this->BcManager->createDatabaseConfig();
-
- $this->set($checkResult);
-
- $this->set('blRequirementsMet', (
- $checkResult['phpXml'] &&
- $checkResult['phpGd'] &&
- $checkResult['tmpDirWritable'] &&
- $checkResult['pagesDirWritable'] &&
- $checkResult['configDirWritable'] &&
- $checkResult['phpVersionOk'] &&
- $checkResult['themeDirWritable'] &&
- $checkResult['imgDirWritable'] &&
- $checkResult['jsDirWritable'] &&
- $checkResult['cssDirWritable']
- ));
- $this->setTitle(__d('baser', 'baserCMSのインストール|ステップ2'));
+ $this->set($service->getViewVarsForStep2());
}
/**
* Step 3: データベースの接続設定
*
* @return void
+ * @noTodo
+ * @checked
*/
- public function step3()
+ public function step3(InstallationsAdminServiceInterface $service)
{
- $dbsource = $this->_getDbSource();
-
- if (!$this->request->getData()) {
+ $blDBSettingsOK = false;
+ if (!$this->request->is('post')) {
BcUtil::clearAllCache();
- $this->request = $this->request->withParsedBody($this->_getDefaultValuesStep3());
- $this->set('dbDataPatterns', $this->BcManager->getAllDefaultDataPatterns());
- $this->setTitle(__d('baser', 'baserCMSのインストール|ステップ3'));
- $this->set('dbsource', $dbsource);
- return;
- }
-
- $this->_writeDbSettingToSession($this->request->getData('Installation'));
-
- /* 戻るボタンクリック時 */
- if ($this->request->getData('buttonclicked') === 'back') {
- $this->redirect('step2');
- return;
-
- /* 接続テスト */
- }
-
- if ($this->request->getData('buttonclicked') === 'checkdb') {
-
- $this->set('blDBSettingsOK', $this->_testConnectDb($this->_readDbSetting()));
-
- /* 「次のステップへ」クリック時 */
- } elseif ($this->request->getData('buttonclicked') === 'createdb') {
-
- ini_set("max_execution_time", 180);
-
- $dbDataPattern = Configure::read('BcApp.defaultTheme') . '.default';
- if ($this->request->getData('Installation.dbDataPattern')) {
- $dbDataPattern = $this->request->getData('Installation.dbDataPattern');
- }
- $result = false;
- $errorMessage = __d('baser', 'データベースの構築中にエラーが発生しました。');
- try {
- $this->_deleteAllTables();
- $result = $this->_constructionDb($dbDataPattern, Configure::read('BcApp.defaultAdminTheme'));
- } catch (Exception $e) {
- $errorMessage .= "\n" . $e->getMessage();
- }
- if ($result) {
- $this->BcMessage->setInfo(__d('baser', 'データベースの構築に成功しました。'));
- $this->redirect('step4');
- return;
+ $this->setRequest($this->request->withParsedBody($service->getDefaultValuesStep3($this->getRequest())));
+ } else {
+ $service->writeDbSettingToSession($this->getRequest(), $this->getRequest()->getData());
+ switch($this->request->getData('mode')) {
+ case 'back':
+ return $this->redirect(['action' => 'step2']);
+ case 'checkDb':
+ try {
+ $service->testConnectDb($service->readDbSetting($this->getRequest()));
+ $this->BcMessage->setInfo(__d('baser', 'データベースへの接続に成功しました。'));
+ $blDBSettingsOK = true;
+ } catch (\PDOException $e) {
+ $this->BcMessage->setError($e->getMessage());
+ } catch (BcException $e) {
+ $this->BcMessage->setError($e->getMessage());
+ }
+ break;
+ case 'createDb':
+ ini_set("max_execution_time", 180);
+ try {
+ $service->deleteAllTables($this->getRequest());
+ $service->constructionDb(
+ $service->readDbSetting($this->getRequest()),
+ $this->request->getData('dbDataPattern'),
+ Configure::read('BcApp.defaultAdminTheme')
+ );
+ $this->BcMessage->setInfo(__d('baser', 'データベースの構築に成功しました。'));
+ return $this->redirect(['action' => 'step4']);
+ } catch (BcException $e) {
+ $errorMessage = __d('baser', 'データベースの構築中にエラーが発生しました。') . "\n" . $e->getMessage();
+ $this->BcMessage->setError($errorMessage);
+ }
+ break;
}
-
- $this->BcMessage->setError($errorMessage);
}
-
- $this->set('dbDataPatterns', $this->BcManager->getAllDefaultDataPatterns());
- $this->setTitle(__d('baser', 'baserCMSのインストール|ステップ3'));
- $this->set('dbsource', $dbsource);
+ $this->set($service->getViewVarsForStep3($blDBSettingsOK));
}
/**
* Step 4: データベース生成/管理者ユーザー作成
*
* @return void
+ * @checked
*/
- public function step4()
+ public function step4(InstallationsAdminServiceInterface $service)
{
- if (!$this->request->getData()) {
- $this->request = $this->request->withParsedBody($this->_getDefaultValuesStep4());
- $this->setTitle(__d('baser', 'baserCMSのインストール|ステップ4'));
- return;
- }
-
-// ユーザー情報をセッションに保存
- $this->Session->write('Installation.admin_email', $this->request->getData('Installation.admin_email'));
- $this->Session->write('Installation.admin_username', $this->request->getData('Installation.admin_username'));
- $this->Session->write('Installation.admin_password', $this->request->getData('Installation.admin_password'));
-
- if ($this->request->getData('Installation.clicked') === 'back') {
-
- $this->redirect('step3');
- return;
- }
-
- if ($this->request->getData('Installation.clicked') === 'finish') {
-
- // DB接続
- $db = $this->BcManager->connectDb($this->_readDbSetting());
-
- // サイト基本設定登録
- $this->BcManager->setAdminEmail($this->request->getData('Installation.admin_email'));
-
- // SecuritySalt設定
- $salt = $this->BcManager->setSecuritySalt();
- $this->Session->write('Installation.salt', $salt);
- // SecurityCipherSeed設定
- $cipherSeed = $this->BcManager->setSecurityCipherSeed();
- $this->Session->write('Installation.cipherSeed', $cipherSeed);
-
- // 管理ユーザー登録
- $user = [
- 'name' => $this->request->getData('Installation.admin_username'),
- 'password_1' => $this->request->getData('Installation.admin_password'),
- 'password_2' => $this->request->getData('Installation.admin_confirmpassword'),
- 'email' => $this->request->getData('Installation.admin_email')
- ];
-
- if ($this->BcManager->addDefaultUser($user)) {
- $this->_sendCompleteMail($user['email'], $user['name'], $user['password_1']);
- $this->redirect('step5');
- return;
- }
-
- $User = ClassRegistry::init('User', 'Model');
- if (!empty($User->validationErrors)) {
- $errMsg = implode("\n", Hash::extract($User->validationErrors, '{s}.{n}'));
+ if (!$this->request->is('post')) {
+ $this->setRequest($this->request->withParsedBody($service->getDefaultValuesStep4($this->getRequest())));
+ } else {
+ // ユーザー情報をセッションに保存
+ $this->getRequest()->getSession()->write('Installation', array_merge(
+ $this->getRequest()->getSession()->read('Installation'),
+ $this->getRequest()->getData()
+ ));
+
+ if ($this->request->getData('mode') === 'back') {
+ return $this->redirect(['action' => 'step3']);
+ } elseif ($this->request->getData('mode') === 'finish') {
+ try {
+ $service->connectDb($this->getRequest());
+ $service->initAdmin($this->getRequest());
+ // TODO ucmitz メール送信未実装
+// $this->_sendCompleteMail(
+// $this->getRequest()->getData('admin_email'),
+// $this->getRequest()->getData('admin_username'),
+// $this->getRequest()->getData('admin_password')
+// );
+ $this->redirect(['action' => 'step5']);
+ } catch (PersistenceFailedException $e) {
+ $errMsg = implode("\n・", Hash::extract($e->getEntity()->getErrors(), '{s}.{s}'));
+ $this->BcMessage->setError(__d('baser', '管理ユーザーを作成できませんでした。') . "\n\n・" . $errMsg);
+ }
}
- $this->BcMessage->setError(__d('baser', '管理ユーザーを作成できませんでした。'));
- $this->BcMessage->setError($errMsg);
- }
- $this->setTitle(__d('baser', 'baserCMSのインストール|ステップ4'));
- }
-
- /**
- * インストール完了メールを送信する
- *
- * @param string $email
- * @param string $name
- * @param string $password
- * @return void
- */
- protected function _sendCompleteMail($email, $name, $password)
- {
- if (DS !== '\\') {
- $body = ['name' => $name, 'password' => $password, 'siteUrl' => BcUtil::siteUrl()];
- $this->sendMail($email, __d('baser', 'baserCMSインストール完了'), $body, ['template' => 'installed', 'from' => $email]);
}
}
@@ -306,397 +208,36 @@ protected function _sendCompleteMail($email, $name, $password)
* インストールファイル[install.php]
*
* @return void
+ * @noTodo
+ * @checked
*/
- public function step5()
+ public function step5(InstallationsAdminServiceInterface $service)
{
- $this->setTitle(__d('baser', 'baserCMSのインストール完了!'));
- Cache::config('default', ['engine' => 'File']);
-
if (!BcUtil::isInstalled()) {
- $installationData = $this->Session->read('Installation');
- $installationData['lastStep'] = true;
- BcUtil::checkTmpFolders();
- Configure::write('Cache.disable', false);
- // インストールファイルでセッションの保存方法を切り替える為、インストール情報をキャッシュに保存
- Cache::write('Installation', $installationData, 'default');
- // データベース設定を書き込む
- $this->BcManager->createDatabaseConfig($this->_readDbSetting());
- // インストールファイルを生成する
- $secritySalt = $this->Session->read('Installation.salt');
- $secrityCipherSeed = $this->Session->read('Installation.cipherSeed');
- $this->BcManager->createInstallFile($secritySalt, $secrityCipherSeed);
-
- //==================================================================
- // BcManagerComponent::createPageTemplates() を実行する際、
- // 固定ページでプラグインを利用している場合あり、プラグインがロードされていないとエラーになる為、
- // リダイレクト前にコアプラグインの有効化とテーマ保有のプラグインのインストールを完了させておく
- // =================================================================
- $dbConfig = $this->_readDbSetting(Cache::read('Installation', 'default'));
-
- // データベースのデータを初期設定に更新
- $this->BcManager->executeDefaultUpdates($dbConfig);
-
- // テーマを配置する
- $this->BcManager->deployTheme();
-
- $dbDataPattern = $this->Session->read('Installation.dbDataPattern');
- [$theme, $pattern] = explode('.', $dbDataPattern);
- loadSiteConfig();
-
- $this->BcManager->installCorePlugin($dbConfig, $dbDataPattern);
-
- App::build(['Plugin' => array_merge([BASER_THEMES . Configure::read('BcSite.theme') . DS . 'Plugin' . DS], App::path('Plugin'))]);
- $themesPlugins = BcUtil::getCurrentThemesPlugins();
- if ($themesPlugins) {
- foreach($themesPlugins as $plugin) {
- $this->BcManager->installPlugin($plugin);
- CakePlugin::load($plugin);
- $this->BcManager->resetTables('plugin', $dbConfig = null, $plugin);
- $this->BcManager->loadDefaultDataPattern('plugin', null, $pattern, $theme, $plugin);
- }
- }
-
- $Db = ConnectionManager::getDataSource('default');
- if ($Db->config['datasource'] === 'Database/BcPostgres') {
- $Db->updateSequence();
- }
+ $service->connectDb($this->getRequest());
+ $service->initFiles($this->getRequest());
+ $service->initDb($this->getRequest());
+ $service->login($this->getRequest(), $this->getResponse());
BcUtil::clearAllCache();
- if (function_exists('opcache_reset')) {
- opcache_reset();
- }
- $this->redirect('step5');
- return;
- }
-
- $installationData = Cache::read('Installation', 'default');
- if (empty($installationData['lastStep'])) {
- return;
- }
-
- // ログイン
- $this->_login();
-
- // テーマに管理画面のアセットへのシンボリックリンクを作成する
- $this->BcManager->deployAdminAssets();
-
- // アップロード用初期フォルダを作成する
- $this->BcManager->createDefaultFiles();
-
- // エディタテンプレート用の画像を配置
- $this->BcManager->deployEditorTemplateImage();
-
- // Pagesファイルを生成する
- $this->BcManager->createPageTemplates();
-
- $this->Session->delete('InstallLastStep');
- }
-
- /**
- * 管理画面にログインする
- *
- * @return void
- * @access protected
- */
- protected function _login()
- {
- $extra = [];
- // ログインするとセッションが初期化されてしまうので一旦取得しておく
- $installationSetting = Cache::read('Installation', 'default');
- Cache::delete('Installation', 'default');
- Configure::write('Security.salt', $installationSetting['salt']);
- $extra['data']['User']['name'] = $installationSetting['admin_username'];
- $extra['data']['User']['password'] = $installationSetting['admin_password'];
- $this->requestAction(['admin' => true, 'plugin' => null, 'controller' => 'users', 'action' => 'login_exec'], $extra);
- $this->Session->write('Installation', $installationSetting);
- }
-
- /**
- * データベースを構築する
- *
- * @param string $dbDataPattern データパターン
- * @return boolean
- */
- protected function _constructionDb($dbDataPattern = null, $adminTheme = '')
- {
- $dbConfig = $this->_readDbSetting();
- if (!$this->BcManager->constructionDb($dbConfig, $dbDataPattern, $adminTheme)) {
- return false;
- }
- return true;
- }
-
- /**
- * ステップ3用のフォーム初期値を取得する
- *
- * @return array
- * @access protected
- */
- protected function _getDefaultValuesStep3()
- {
- $defaultTheme = Configure::read('BcApp.defaultTheme');
- $data = [];
- if (!$this->Session->read('Installation.dbType')) {
- $data['Installation']['dbType'] = 'mysql';
- $data['Installation']['dbHost'] = 'localhost';
- $data['Installation']['dbPort'] = '3306';
- $data['Installation']['dbPrefix'] = 'mysite_';
- $data['Installation']['dbName'] = 'basercms';
- $data['Installation']['dbDataPattern'] = $defaultTheme . '.default';
- return $data;
- }
-
- $_data = $this->_readDbSetting();
- $data['Installation']['dbType'] = $_data['datasource'];
- $data['Installation']['dbHost'] = $_data['host'];
- $data['Installation']['dbPort'] = $_data['port'];
- $data['Installation']['dbPrefix'] = $_data['prefix'];
- $_data['database'] = basename($_data['database']);
- $_data['database'] = str_replace(['.csv', '.db'], '', $_data['database']);
- $_data['database'] = basename($_data['database']);
- $data['Installation']['dbName'] = $_data['database'];
- $data['Installation']['dbUsername'] = $_data['login'];
- $data['Installation']['dbPassword'] = $_data['password'];
- $data['Installation']['dbDataPattern'] = $_data['dataPattern'];
-
- return $data;
- }
-
- /**
- * ステップ4用のフォーム初期値を取得する
- *
- * @return array
- * @access protected
- */
- protected function _getDefaultValuesStep4()
- {
- $data = [];
- if ($this->Session->read('Installation.admin_username')) {
- $data['Installation']['admin_username'] = $this->Session->read('Installation.admin_username');
- } else {
- $data['Installation']['admin_username'] = '';
- }
- if ($this->Session->read('Installation.admin_password')) {
- $data['Installation']['admin_password'] = $this->Session->read('Installation.admin_password');
- $data['Installation']['admin_confirmpassword'] = $data['Installation']['admin_password'];
- } else {
- $data['Installation']['admin_password'] = '';
- }
- if ($this->Session->read('Installation.admin_email')) {
- $data['Installation']['admin_email'] = $this->Session->read('Installation.admin_email');
- } else {
- $data['Installation']['admin_email'] = '';
- }
- return $data;
- }
-
- /**
- * DB設定をセッションから取得
- *
- * @return array
- * @access protected
- */
- protected function _readDbSetting($installationData = [])
- {
- if (!$installationData) {
- if ($this->Session->check('Installation')) {
- $installationData = $this->Session->read('Installation');
- } else {
- $installationData = [
- 'dbType' => '',
- 'dbHost' => '',
- 'dbPort' => '',
- 'dbUsername' => '',
- 'dbPassword' => '',
- 'dbPrefix' => '',
- 'dbName' => '',
- 'dbSchema' => '',
- 'dbEncoding' => '',
- 'dbDataPattern' => ''
- ];
- }
+ if (function_exists('opcache_reset')) opcache_reset();
}
- $data = [
- 'datasource' => $installationData['dbType'],
- 'host' => $installationData['dbHost'],
- 'port' => $installationData['dbPort'],
- 'login' => $installationData['dbUsername'],
- 'password' => $installationData['dbPassword'],
- 'prefix' => $installationData['dbPrefix'],
- 'database' => $this->BcManager->getRealDbName($installationData['dbType'], $installationData['dbName']),
- 'schema' => $installationData['dbSchema'],
- 'encoding' => $installationData['dbEncoding'],
- 'dataPattern' => $installationData['dbDataPattern'],
- 'persistent' => false,
- ];
- return $data;
}
/**
- * DB設定をセッションに保存
+ * インストール完了メールを送信する
*
- * @param array $data
+ * @param string $email
+ * @param string $name
+ * @param string $password
* @return void
- * @access protected
*/
- protected function _writeDbSettingToSession($data)
- {
- /* dbEncoding */
- $data['dbEncoding'] = 'utf8';
-
- /* dbSchema */
- if ($data['dbType'] === 'postgres') {
- $data['dbSchema'] = 'public'; // TODO とりあえずpublic固定
- } else {
- $data['dbSchema'] = '';
- }
- if ($data['dbType'] === 'csv') {
- $data['dbEncoding'] = 'sjis';
- }
-
- $this->Session->write('Installation.dbType', $data['dbType']);
- $this->Session->write('Installation.dbHost', $data['dbHost']);
- $this->Session->write('Installation.dbPort', $data['dbPort']);
- $this->Session->write('Installation.dbUsername', $data['dbUsername']);
- $this->Session->write('Installation.dbPassword', $data['dbPassword']);
- $this->Session->write('Installation.dbPrefix', $data['dbPrefix']);
- $this->Session->write('Installation.dbName', $data['dbName']);
- $this->Session->write('Installation.dbSchema', $data['dbSchema']);
- $this->Session->write('Installation.dbEncoding', $data['dbEncoding']);
- $this->Session->write('Installation.dbDataPattern', $data['dbDataPattern']);
- }
-
- /**
- * データベース接続テスト
- *
- * @param array $config
- * @return boolean
- */
- protected function _testConnectDb($config)
- {
- /* データベース接続確認 */
- try {
- $this->BcManager->checkDbConnection($config);
- } catch (Exception $e) {
- $message = __d('baser', 'データベースへの接続でエラーが発生しました。データベース設定を見直してください。');
- if (preg_match('/with message \'(.+?)\' in/s', $e->getMessage(), $matches)) {
- $message .= "\n" . $matches[1];
- }
- $this->BcMessage->setError(__d('baser', "データベースへの接続でエラーが発生しました。データベース設定を見直してください。\nサーバー上に指定されたデータベースが存在しない可能性が高いです。"));
- return false;
- }
-
- /* データベース接続生成 */
- $db = $this->BcManager->connectDb($config);
-
- if (!$db->connected) {
-
- if (!$this->Session->read('Message.flash.message')) {
- if (!$db->connection) {
- $this->BcMessage->setError(
- __d('baser', 'データベースへの接続でエラーが発生しました。データベース設定を見直してください。')
- );
- return false;
- }
-
- $this->BcMessage->setError(
- __d('baser', "データベースへの接続でエラーが発生しました。データベース設定を見直してください。\nサーバー上に指定されたデータベースが存在しない可能性が高いです。")
- );
- }
- return false;
- }
-
- //version check
- switch(get_class($db)) {
- case 'BcMysql' :
- $result = $db->query("SELECT version() as version");
- if (version_compare($result[0][0]['version'], Configure::read('BcRequire.MySQLVersion')) == -1) {
- $this->BcMessage->setError(sprintf(__d('baser', 'データベースのバージョンが %s 以上か確認してください。'), Configure::read('BcRequire.MySQLVersion')));
- return false;
- }
- break;
- case 'BcPostgres' :
- $result = $db->query("SELECT version() as version");
- [, $version] = explode(" ", $result[0][0]['version']);
- if (version_compare(trim($version), Configure::read('BcRequire.PostgreSQLVersion')) == -1) {
- $this->BcMessage->setError(sprintf(__d('baser', 'データベースのバージョンが %s 以上か確認してください。'), Configure::read('BcRequire.PostgreSQLVersion')));
- return false;
- }
- break;
- }
-
- /* 一時的にテーブルを作成できるかテスト */
- $randomtablename = 'deleteme' . rand(100, 100000);
- $result = $db->execute("CREATE TABLE $randomtablename (a varchar(10))");
-
-
- if (!$result) {
- $this->BcMessage->setError(__d('baser', "データベースへの接続でエラーが発生しました。\n") . $db->error);
- return false;
- }
-
- $db->execute('drop TABLE ' . $randomtablename);
- $this->BcMessage->setInfo(__d('baser', 'データベースへの接続に成功しました。'));
-
- // データベースのテーブルをチェック
- $tableNames = $db->listSources();
- $prefix = Hash::get($config, 'prefix');
- $duplicateTableNames = array_filter($tableNames, function($tableName) use ($prefix) {
- return strpos($tableName, $prefix) === 0;
- });
-
- if (count($duplicateTableNames) > 0) {
- $this->BcMessage->setInfo(
- __d(
- 'baser',
- 'データベースへの接続に成功しましたが、プレフィックスが重複するテーブルが存在します。') . implode(', ', $duplicateTableNames)
- );
- }
-
- return true;
- }
-
- /**
- * 利用可能なデータソースを取得する
- *
- * @return array
- * @access protected
- */
- protected function _getDbSource()
+ protected function _sendCompleteMail($email, $name, $password)
{
- /* DBソース取得 */
- $dbsource = [];
- $folder = new Folder();
- $pdoDrivers = PDO::getAvailableDrivers();
-
- /* MySQL利用可否 */
- if (in_array('mysql', $pdoDrivers)) {
- $dbsource['mysql'] = 'MySQL';
- }
-
- /* PostgreSQL利用可否 */
- if (in_array('pgsql', $pdoDrivers)) {
- $dbsource['postgres'] = 'PostgreSQL';
- }
-
- /* SQLite利用可否チェック */
- if (in_array('sqlite', $pdoDrivers) && extension_loaded('sqlite3') && class_exists('SQLite3')) {
- $dbFolderPath = APP . 'db' . DS . 'sqlite';
- if (is_writable(dirname($dbFolderPath)) && $folder->create($dbFolderPath, 0777)) {
- $info = SQLite3::version();
- if (version_compare($info['versionString'], Configure::read('BcRequire.winSQLiteVersion'), '>')) {
- $dbsource['sqlite'] = 'SQLite';
- }
- }
+ if (DS !== '\\') {
+ $body = ['name' => $name, 'password' => $password, 'siteUrl' => BcUtil::siteUrl()];
+ $this->sendMail($email, __d('baser', 'baserCMSインストール完了'), $body, ['template' => 'installed', 'from' => $email]);
}
-
- /* CSV利用可否 */
- /* $dbFolderPath = APP.'db'.DS.'csv';
- if(is_writable(dirname($dbFolderPath)) && $folder->create($dbFolderPath, 0777)){
- $dbsource['csv'] = 'CSV';
- } */
-
- return $dbsource;
}
/**
@@ -746,19 +287,4 @@ public function reset()
$this->redirect('reset');
}
- /**
- * 全てのテーブルを削除する
- *
- * @return void
- * @access public
- */
- public function _deleteAllTables()
- {
- $dbConfig = $this->_readDbSetting();
- if (!$dbConfig) {
- $dbConfig = getDbConfig();
- }
- $this->BcManager->deleteTables('default', $dbConfig);
- }
-
}
diff --git a/plugins/bc-installer/src/Plugin.php b/plugins/bc-installer/src/Plugin.php
index 53f490631b..0e3a640a09 100644
--- a/plugins/bc-installer/src/Plugin.php
+++ b/plugins/bc-installer/src/Plugin.php
@@ -12,11 +12,13 @@
namespace BcInstaller;
use BaserCore\BcPlugin;
+use BaserCore\Utility\BcUtil;
use BcInstaller\ServiceProvider\BcInstallerServiceProvider;
use Cake\Core\ContainerInterface;
use BaserCore\Annotation\UnitTest;
use BaserCore\Annotation\NoTodo;
use BaserCore\Annotation\Checked;
+use Cake\Routing\Route\InflectedRoute;
/**
* Class Plugin
@@ -36,4 +38,22 @@ public function services(ContainerInterface $container): void
$container->addServiceProvider(new BcInstallerServiceProvider());
}
+ /**
+ * ルーター設定
+ *
+ * @param \Cake\Routing\RouteBuilder $routes
+ */
+ public function routes($routes): void
+ {
+ /**
+ * インストーラー
+ */
+ if (!BcUtil::isInstalled()) {
+ $routes->connect('/', ['prefix' => 'Admin', 'plugin' => 'BcInstaller', 'controller' => 'Installations', 'action' => 'index']);
+ $routes->connect('/install', ['prefix' => 'Admin', 'plugin' => 'BcInstaller', 'controller' => 'Installations', 'action' => 'index']);
+ $routes->fallbacks(InflectedRoute::class);
+ parent::routes($routes);
+ }
+ }
+
}
diff --git a/plugins/bc-installer/src/Service/Admin/InstallationsAdminService.php b/plugins/bc-installer/src/Service/Admin/InstallationsAdminService.php
new file mode 100644
index 0000000000..b404fbaf98
--- /dev/null
+++ b/plugins/bc-installer/src/Service/Admin/InstallationsAdminService.php
@@ -0,0 +1,351 @@
+
+ * Copyright (c) NPO baser foundation
+ *
+ * @copyright Copyright (c) NPO baser foundation
+ * @link https://basercms.net baserCMS Project
+ * @since 5.0.0
+ * @license https://basercms.net/license/index.html MIT License
+ */
+
+namespace BcInstaller\Service\Admin;
+
+use BaserCore\Annotation\NoTodo;
+use BaserCore\Annotation\Checked;
+use BaserCore\Annotation\UnitTest;
+use BaserCore\Service\SiteConfigsServiceInterface;
+use BaserCore\Service\UsersService;
+use BaserCore\Service\UsersServiceInterface;
+use BaserCore\Utility\BcContainerTrait;
+use BaserCore\Utility\BcUtil;
+use BcInstaller\Service\InstallationsService;
+use Cake\Core\Configure;
+use Cake\Database\Connection;
+use Cake\Datasource\ConnectionManager;
+use Cake\Http\Response;
+use Cake\Http\ServerRequest;
+use Cake\ORM\Exception\PersistenceFailedException;
+use Cake\Utility\Inflector;
+
+/**
+ * InstallationsAdminService
+ */
+class InstallationsAdminService extends InstallationsService implements InstallationsAdminServiceInterface
+{
+
+ /**
+ * Trait
+ */
+ use BcContainerTrait;
+
+ /**
+ * ステップ2用の view 変数を取得する
+ * @return array
+ * @checked
+ * @noTodo
+ */
+ public function getViewVarsForStep2(): array
+ {
+ return $this->checkEnv();
+ }
+
+ /**
+ * ステップ3用の view 変数を取得する
+ *
+ * @param bool $blDBSettingsOK
+ * @return array
+ * @checked
+ * @noTodo
+ */
+ public function getViewVarsForStep3(bool $blDBSettingsOK): array
+ {
+ return [
+ 'dbsource' => $this->_getDbSource(),
+ 'blDBSettingsOK' => $blDBSettingsOK,
+ 'dbDataPatterns' => $this->getAllDefaultDataPatterns()
+ ];
+ }
+
+ /**
+ * ステップ3用のフォーム初期値を取得する
+ *
+ * @param ServerRequest $request
+ * @return array
+ * @checked
+ * @noTodo
+ */
+ public function getDefaultValuesStep3(ServerRequest $request): array
+ {
+ if (!$request->getSession()->read('Installation.dbType')) {
+ return [
+ 'dbType' => 'mysql',
+ 'dbHost' => 'localhost',
+ 'dbPrefix' => 'mysite_',
+ 'dbPort' => '3306',
+ 'dbName' => 'basercms',
+ 'dbDataPattern' => Inflector::camelize(Configure::read('BcApp.defaultFrontTheme'), '-') . '.default'
+ ];
+ }
+ $setting = $this->readDbSetting($request);
+ return [
+ 'dbType' => $setting['datasource'],
+ 'dbHost' => $setting['host'],
+ 'dbPrefix' => $setting['prefix'],
+ 'dbPort' => $setting['port'],
+ 'dbName' => basename(str_replace(['.csv', '.db'], '', $setting['database'])),
+ 'dbDataPattern' => $setting['dataPattern'],
+ 'dbUsername' => $setting['username'],
+ 'dbPassword' => $setting['password'],
+ ];
+ }
+
+ /**
+ * ステップ4用のフォーム初期値を取得する
+ *
+ * @return array
+ * @checked
+ * @noTodo
+ */
+ public function getDefaultValuesStep4(ServerRequest $request): array
+ {
+ $data = [];
+ if ($request->getSession()->check('Installation')) {
+ $data = $request->getSession()->read('Installation');
+ }
+ if (!empty($data['admin_password'])) {
+ $data['admin_confirm_password'] = $data['admin_password'];
+ }
+ return array_merge([
+ 'site_name' => 'My Site',
+ 'admin_username' => '',
+ 'admin_password' => '',
+ 'admin_confirm_password' => '',
+ 'admin_email' => ''
+ ], $data);
+ }
+
+ /**
+ * DB設定をセッションに保存
+ *
+ * @param ServerRequest $request
+ * @param array $data
+ * @return void
+ * @checked
+ */
+ public function writeDbSettingToSession(ServerRequest $request, array $data): void
+ {
+ $data['dbEncoding'] = 'utf8';
+ $data['dbSchema'] = '';
+ if (!empty($data['dbType']) && $data['dbType'] === 'postgres') {
+ $data['dbSchema'] = 'public'; // TODO とりあえずpublic固定
+ }
+ $request->getSession()->write($request->getSession()->read() + ['Installation' => [
+ 'dbType' => $data['dbType'],
+ 'dbHost' => $data['dbHost'],
+ 'dbPort' => $data['dbPort'],
+ 'dbUsername' => $data['dbUsername'],
+ 'dbPassword' => $data['dbPassword'],
+ 'dbPrefix' => $data['dbPrefix'],
+ 'dbName' => $data['dbName'],
+ 'dbSchema' => $data['dbSchema'],
+ 'dbEncoding' => $data['dbEncoding'],
+ 'dbDataPattern' => $data['dbDataPattern']
+ ]]);
+ }
+
+ /**
+ * DB設定をセッションから取得
+ *
+ * @param ServerRequest $request
+ * @param array $installationData
+ * @return array
+ * @checked
+ * @noTodo
+ */
+ public function readDbSetting(ServerRequest $request, array $installationData = []): array
+ {
+ if (!$installationData) {
+ $session = $request->getSession();
+ if ($session->check('Installation')) {
+ $installationData = $session->read('Installation');
+ } else {
+ $installationData = [
+ 'dbType' => '',
+ 'dbHost' => '',
+ 'dbPort' => '',
+ 'dbUsername' => '',
+ 'dbPassword' => '',
+ 'dbPrefix' => '',
+ 'dbName' => '',
+ 'dbSchema' => '',
+ 'dbEncoding' => '',
+ 'dbDataPattern' => ''
+ ];
+ }
+ }
+ $data = [
+ 'className' => Connection::class,
+ 'datasource' => $installationData['dbType'],
+ 'driver' => $this->BcDatabase->getDatasourceName($installationData['dbType']),
+ 'host' => $installationData['dbHost'],
+ 'port' => $installationData['dbPort'],
+ 'username' => $installationData['dbUsername'],
+ 'password' => $installationData['dbPassword'],
+ 'prefix' => $installationData['dbPrefix'],
+ 'database' => $this->getRealDbName($installationData['dbType'], $installationData['dbName']),
+ 'schema' => $installationData['dbSchema'],
+ 'encoding' => $installationData['dbEncoding'],
+ 'dataPattern' => $installationData['dbDataPattern'],
+ 'persistent' => false,
+ ];
+ return $data;
+ }
+
+ /**
+ * 全てのテーブルを削除する
+ *
+ * @return bool
+ * @checked
+ * @noTodo
+ */
+ public function deleteAllTables(ServerRequest $request): bool
+ {
+ $dbConfig = $this->readDbSetting($request);
+ if (!$dbConfig) {
+ $dbConfig = ConnectionManager::getConfig('default');
+ }
+ return $this->BcDatabase->deleteTables('default', $dbConfig);
+ }
+
+ /**
+ * 管理情報を初期化する
+ *
+ * - 初期ユーザー情報
+ * - サイト名
+ *
+ * @param ServerRequest $request
+ * @throws PersistenceFailedException
+ * @checked
+ * @noTodo
+ */
+ public function initAdmin(ServerRequest $request): void
+ {
+ // サイト基本設定登録
+ $this->setAdminEmail($request->getData('admin_email'));
+ $this->setSiteName($request->getData('site_name'));
+
+ // SecuritySalt設定
+ $salt = $this->setSecuritySalt();
+ $request->getSession()->write('Installation.salt', $salt);
+
+ // 管理ユーザー登録
+ $user = [
+ 'name' => $request->getData('admin_username'),
+ 'password_1' => $request->getData('admin_password'),
+ 'password_2' => $request->getData('admin_confirm_password'),
+ 'email' => $request->getData('admin_email')
+ ];
+
+ try {
+ $user = $this->addDefaultUser($user);
+ $request->getSession()->write('Installation.id', $user->id);
+ } catch (PersistenceFailedException $e) {
+ throw $e;
+ }
+ }
+
+ /**
+ * インストールに関するファイルやフォルダを初期化する
+ *
+ * @param ServerRequest $request
+ * @checked
+ * @noTodo
+ */
+ public function initFiles(ServerRequest $request): void
+ {
+ // インストールファイルを生成する
+ $securitySalt = $request->getSession()->read('Installation.salt');
+ $this->createInstallFile($this->readDbSetting($request), $securitySalt);
+ // アップロード用初期フォルダを作成する
+ $this->createDefaultFiles();
+ // エディタテンプレート用の画像を配置
+ $this->deployEditorTemplateImage();
+ }
+
+ /**
+ * データベースに接続する
+ *
+ * @param ServerRequest $request
+ * @return \Cake\Datasource\ConnectionInterface
+ * @checked
+ * @noTodo
+ */
+ public function connectDb(ServerRequest $request): \Cake\Datasource\ConnectionInterface
+ {
+ $dbConfig = $this->readDbSetting($request);
+ return $this->BcDatabase->connectDb($dbConfig);
+ }
+
+ /**
+ * 管理画面にログインする
+ *
+ * @param ServerRequest $request
+ * @param Response $response
+ * @return void
+ * @checked
+ * @noTodo
+ */
+ public function login(ServerRequest $request, Response $response): void
+ {
+ // ログインするとセッションが初期化されてしまうので一旦取得しておく
+ $installationSetting = $request->getSession()->read('Installation');
+ Configure::write('Security.salt', $installationSetting['salt']);
+ /* @var UsersService $usersService */
+ $usersService = $this->getService(UsersServiceInterface::class);
+ $usersService->login($request, $response, $installationSetting['id']);
+ }
+
+ /**
+ * データベースを初期化する
+ *
+ * @param ServerRequest $request
+ * @checked
+ */
+ public function initDb(ServerRequest $request): void
+ {
+ // データベースのデータを初期設定に更新
+ $this->executeDefaultUpdates();
+
+ // コアプラグインインストール
+ $dbDataPattern = $request->getSession()->read('Installation.dbDataPattern');
+ $this->installCorePlugin($dbDataPattern);
+
+ // テーマの初期データを読み込む
+ // TODO ucmitz テーマの初期データ未実装
+// [$theme, $pattern] = explode('.', $dbDataPattern);
+// App::build(['Plugin' => array_merge([BASER_THEMES . Configure::read('BcSite.theme') . DS . 'Plugin' . DS], App::path('Plugin'))]);
+// $themesPlugins = BcUtil::getCurrentThemesPlugins();
+// if ($themesPlugins) {
+// foreach($themesPlugins as $plugin) {
+// $this->BcManager->installPlugin($plugin);
+// CakePlugin::load($plugin);
+// $this->BcManager->resetTables('plugin', $dbConfig = null, $plugin);
+// $this->BcManager->loadDefaultDataPattern('plugin', null, $pattern, $theme, $plugin);
+// }
+// }
+
+ // SITE_URL更新
+ $siteConfigsService = $this->getService(SiteConfigsServiceInterface::class);
+ $siteConfigsService->putEnv('SITE_URL', BcUtil::siteUrl());
+ $siteConfigsService->putEnv('SSL_URL', BcUtil::siteUrl());
+
+ // シーケンスを更新する
+ $dbConfig = ConnectionManager::getConfig('default');
+ $datasource = strtolower(str_replace('Cake\\Database\\Driver\\', '', $dbConfig['driver']));
+ if ($datasource === 'postgres') {
+ $this->BcDatabase->updateSequence();
+ }
+ }
+
+}
diff --git a/plugins/bc-installer/src/Service/Admin/InstallationsAdminServiceInterface.php b/plugins/bc-installer/src/Service/Admin/InstallationsAdminServiceInterface.php
new file mode 100644
index 0000000000..502b95a6f6
--- /dev/null
+++ b/plugins/bc-installer/src/Service/Admin/InstallationsAdminServiceInterface.php
@@ -0,0 +1,159 @@
+
+ * Copyright (c) NPO baser foundation
+ *
+ * @copyright Copyright (c) NPO baser foundation
+ * @link https://basercms.net baserCMS Project
+ * @since 5.0.0
+ * @license https://basercms.net/license/index.html MIT License
+ */
+
+namespace BcInstaller\Service\Admin;
+
+use BaserCore\Annotation\NoTodo;
+use BaserCore\Annotation\Checked;
+use BaserCore\Annotation\UnitTest;
+use Cake\Http\Response;
+use Cake\Http\ServerRequest;
+use Cake\ORM\Exception\PersistenceFailedException;
+
+/**
+ * InstallationsAdminServiceInterface
+ */
+interface InstallationsAdminServiceInterface
+{
+
+ /**
+ * ステップ2用の view 変数を取得する
+ * @return array
+ * @checked
+ * @noTodo
+ * @unitTest
+ */
+ public function getViewVarsForStep2(): array;
+
+ /**
+ * ステップ3用の view 変数を取得する
+ *
+ * @param bool $blDBSettingsOK
+ * @return array
+ * @checked
+ * @noTodo
+ * @unitTest
+ */
+ public function getViewVarsForStep3(bool $blDBSettingsOK): array;
+
+ /**
+ * ステップ3用のフォーム初期値を取得する
+ *
+ * @param ServerRequest $request
+ * @return array
+ * @checked
+ * @noTodo
+ * @unitTest
+ */
+ public function getDefaultValuesStep3(ServerRequest $request): array;
+
+ /**
+ * ステップ4用のフォーム初期値を取得する
+ *
+ * @return array
+ * @checked
+ * @noTodo
+ * @unitTest
+ */
+ public function getDefaultValuesStep4(ServerRequest $request): array;
+
+ /**
+ * DB設定をセッションに保存
+ *
+ * @param ServerRequest $request
+ * @param array $data
+ * @return void
+ * @checked
+ * @noTodo
+ * @unitTest
+ */
+ public function writeDbSettingToSession(ServerRequest $request, array $data): void;
+
+ /**
+ * DB設定をセッションから取得
+ *
+ * @param ServerRequest $request
+ * @param array $installationData
+ * @return array
+ * @checked
+ * @noTodo
+ * @unitTest
+ */
+ public function readDbSetting(ServerRequest $request, array $installationData = []): array;
+
+ /**
+ * 全てのテーブルを削除する
+ *
+ * @return bool
+ * @checked
+ * @noTodo
+ * @unitTest
+ */
+ public function deleteAllTables(ServerRequest $request): bool;
+
+ /**
+ * 管理情報を初期化する
+ *
+ * - 初期ユーザー情報
+ * - サイト名
+ *
+ * @param ServerRequest $request
+ * @throws PersistenceFailedException
+ * @checked
+ * @noTodo
+ * @unitTest
+ */
+ public function initAdmin(ServerRequest $request): void;
+
+ /**
+ * インストールに関するファイルやフォルダを初期化する
+ *
+ * @param ServerRequest $request
+ * @checked
+ * @noTodo
+ * @unitTest
+ */
+ public function initFiles(ServerRequest $request): void;
+
+ /**
+ * データベースに接続する
+ *
+ * @param ServerRequest $request
+ * @return \Cake\Datasource\ConnectionInterface
+ * @checked
+ * @noTodo
+ * @unitTest
+ */
+ public function connectDb(ServerRequest $request): \Cake\Datasource\ConnectionInterface;
+
+ /**
+ * 管理画面にログインする
+ *
+ * @param ServerRequest $request
+ * @param Response $response
+ * @return void
+ * @checked
+ * @noTodo
+ * @unitTest
+ */
+ public function login(ServerRequest $request, Response $response): void;
+
+ /**
+ * データベースを初期化する
+ *
+ * @param ServerRequest $request
+ * @checked
+ * @noTodo
+ * @unitTest
+ */
+ public function initDb(ServerRequest $request): void;
+
+}
diff --git a/plugins/bc-installer/src/Service/InstallationsService.php b/plugins/bc-installer/src/Service/InstallationsService.php
index 0ceef69954..111ac646f2 100644
--- a/plugins/bc-installer/src/Service/InstallationsService.php
+++ b/plugins/bc-installer/src/Service/InstallationsService.php
@@ -14,11 +14,672 @@
use BaserCore\Annotation\NoTodo;
use BaserCore\Annotation\Checked;
use BaserCore\Annotation\UnitTest;
+use BaserCore\BcPlugin;
+use BaserCore\Error\BcException;
+use BaserCore\Service\BcDatabaseService;
+use BaserCore\Service\BcDatabaseServiceInterface;
+use BaserCore\Service\SiteConfigsServiceInterface;
+use BaserCore\Service\SitesServiceInterface;
+use BaserCore\Service\ThemesServiceInterface;
+use BaserCore\Service\UsersServiceInterface;
+use BaserCore\Utility\BcContainerTrait;
+use BaserCore\Utility\BcUtil;
+use Cake\Core\Configure;
+use Cake\Core\Plugin;
+use Cake\Database\Connection;
+use Cake\Filesystem\Folder;
+use Cake\I18n\FrozenTime;
+use Cake\Log\LogTrait;
+use Cake\ORM\Exception\PersistenceFailedException;
+use Cake\ORM\TableRegistry;
+use PDOException;
/**
* InstallationsService
+ * @property BcDatabaseService $BcDatabase
*/
class InstallationsService implements InstallationsServiceInterface
{
+ /**
+ * Trait
+ */
+ use BcContainerTrait;
+ use LogTrait;
+
+ /**
+ * Constructor
+ *
+ * @checked
+ * @noTodo
+ */
+ public function __construct()
+ {
+ $this->BcDatabase = $this->getService(BcDatabaseServiceInterface::class);
+ }
+
+ /**
+ * 環境情報をチェックする
+ *
+ * @return array
+ * @checked
+ * @noTodo
+ */
+ public function checkEnv(): array
+ {
+ if (function_exists('apache_get_modules')) {
+ $rewriteInstalled = in_array('mod_rewrite', apache_get_modules());
+ } else {
+ $rewriteInstalled = -1;
+ }
+
+ $info = [
+ 'configDir' => ROOT . DS . 'config',
+ 'pluginDir' => ROOT . DS . 'plugins',
+ 'filesDir' => WWW_ROOT . 'files',
+ 'tmpDir' => TMP,
+ 'dbDir' => ROOT . DS . 'db',
+ 'requirePhpVersion' => Configure::read('BcRequire.phpVersion'),
+ 'requirePhpMemory' => Configure::read('BcRequire.phpMemory')
+ ];
+
+ $status = [
+ 'encoding' => mb_internal_encoding(),
+ 'phpVersion' => phpversion(),
+ 'phpMemory' => intval(ini_get('memory_limit')),
+ 'safeModeOff' => !ini_get('safe_mode'),
+ 'configDirWritable' => is_writable($info['configDir']),
+ 'pluginDirWritable' => is_writable($info['pluginDir']),
+ 'filesDirWritable' => is_writable($info['filesDir']),
+ 'tmpDirWritable' => is_writable($info['tmpDir']),
+ 'dbDirWritable' => is_writable($info['dbDir']),
+ 'phpActualVersion' => preg_replace('/[a-z-]/', '', phpversion()),
+ 'phpGd' => extension_loaded('gd'),
+ 'phpPdo' => extension_loaded('pdo'),
+ 'phpXml' => extension_loaded('xml'),
+ 'apacheRewrite' => $rewriteInstalled
+ ];
+ $check = [
+ 'encodingOk' => (preg_match('/UTF-8/i', $status['encoding'])? true : false),
+ 'gdOk' => $status['phpGd'],
+ 'pdoOk' => $status['phpPdo'],
+ 'xmlOk' => $status['phpXml'],
+ 'phpVersionOk' => version_compare(preg_replace('/[a-z-]/', '', $status['phpVersion']), $info['requirePhpVersion'], '>='),
+ 'phpMemoryOk' => ((($status['phpMemory'] >= $info['requirePhpMemory']) || $status['phpMemory'] == -1) === true)
+ ];
+
+ $check['blRequirementsMet'] = (
+ $status['phpXml'] &&
+ $status['phpGd'] &&
+ $status['tmpDirWritable'] &&
+ $status['configDirWritable'] &&
+ $check['phpVersionOk']
+ );
+
+ if (!$status['configDirWritable']) {
+ @chmod($info['configDir'], 0777);
+ $status['configDirWritable'] = is_writable($info['configDir']);
+ }
+ if (!$status['pluginDirWritable']) {
+ @chmod($info['pluginDir'], 0777);
+ $status['pluginDirWritable'] = is_writable($info['pluginDir']);
+ }
+ if (!$status['filesDirWritable']) {
+ @chmod($info['filesDir'], 0777);
+ $status['filesDirWritable'] = is_writable($info['filesDir']);
+ }
+ if (!$status['tmpDirWritable']) {
+ @chmod($info['tmpDir'], 0777);
+ $status['tmpDirWritable'] = is_writable($info['tmpDir']);
+ }
+ if (!$status['dbDirWritable']) {
+ @chmod($info['dbDir'], 0777);
+ $status['dbDirWritable'] = is_writable($info['dbDir']);
+ }
+
+ return $info + $status + $check;
+ }
+
+ /**
+ * baserCMSコアのデータベースを構築する
+ *
+ * @param array $dbConfig データベース設定名
+ * @param string $dbDataPattern データパターン
+ * @param string $adminTheme
+ * @return boolean
+ * @checked
+ * @noTodo
+ */
+ public function constructionDb(array $dbConfig, string $dbDataPattern = '', string $adminTheme = ''): bool
+ {
+ if (!$dbDataPattern) {
+ $dbDataPattern = Configure::read('BcApp.defaultTheme') . '.default';
+ }
+ if (strpos($dbDataPattern, '.') === false) {
+ throw new BcException(__d('baser', 'データパターンの形式が不正です。'));
+ }
+ if (!$this->BcDatabase->constructionTable('BaserCore', 'default', $dbConfig)) {
+ throw new BcException(__d('baser', 'コアテーブルの構築に失敗しました。'));
+ }
+ [$theme, $pattern] = explode('.', $dbDataPattern);
+ try {
+ if (!$this->BcDatabase->loadDefaultDataPattern($theme, $pattern)) {
+ throw new BcException(__d('baser', 'コアの初期データのロードに失敗しました。'));
+ }
+ } catch (BcException $e) {
+ throw new BcException(__d('baser', 'コアの初期データのロードに失敗しました。' . $e->getMessage()));
+ }
+ if (!$this->BcDatabase->initSystemData(['adminTheme' => $adminTheme])) {
+ throw new BcException(__d('baser', 'システムデータの初期化に失敗しました。'));
+ }
+ $datasource = strtolower(str_replace('Cake\\Database\\Driver\\', '', $dbConfig['driver']));
+ if ($datasource === 'postgres') {
+ $this->BcDatabase->updateSequence();
+ }
+ return true;
+ }
+
+ /**
+ * 実際の設定用のDB名を取得する
+ *
+ * @param string $type
+ * @param string $name
+ * @return string
+ * @checked
+ * @noTodo
+ */
+ public function getRealDbName(string $type, string $name)
+ {
+ if (preg_match('/^\//', $name)) {
+ return $name;
+ }
+ if (!empty($type) && !empty($name)) {
+ if ($type == 'sqlite') {
+ return APP . 'db' . DS . 'sqlite' . DS . $name . '.db';
+ }
+ }
+ return $name;
+ }
+
+ /**
+ * DBへの接続テストを行う
+ *
+ * @param array $config
+ * @throws PDOException
+ * @throws BcException
+ * @checked
+ * @noTodo
+ */
+ public function testConnectDb(array $config)
+ {
+ try {
+ $this->BcDatabase->testConnectDb($config);
+ } catch (PDOException $e) {
+ throw $e;
+ } catch (BcException $e) {
+ throw $e;
+ }
+ }
+
+ /**
+ * サイト基本設定に管理用メールアドレスを登録する
+ *
+ * @param string $email
+ * @return bool
+ * @checked
+ * @noTodo
+ * @unitTest ラッパーメソッドのためユニットテスト不要
+ */
+ public function setAdminEmail(string $email): bool
+ {
+ /* @var \BaserCore\Service\SiteConfigsService $siteConfigsService */
+ $siteConfigsService = $this->getService(SiteConfigsServiceInterface::class);
+ return $siteConfigsService->setValue('email', $email);
+ }
+
+ /**
+ * セキュリティ用のキーを生成する
+ *
+ * @param int $length
+ * @return string キー
+ * @checked
+ * @noTodo
+ */
+ public function setSecuritySalt($length = 40): string
+ {
+ $keyset = "abcdefghijklmABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+ $randkey = "";
+ for($i = 0; $i < $length; $i++) {
+ $randkey .= substr($keyset, rand(0, strlen($keyset) - 1), 1);
+ }
+ Configure::write('Security.salt', $randkey);
+ return $randkey;
+ }
+
+ /**
+ * 初期ユーザーを登録する
+ *
+ * @param array $user
+ * @return \Cake\Datasource\EntityInterface
+ * @throws PersistenceFailedException
+ * @checked
+ * @noTodo
+ */
+ public function addDefaultUser(array $user, $securitySalt = '')
+ {
+ if ($securitySalt) {
+ Configure::write('Security.salt', $securitySalt);
+ }
+ $user = array_merge([
+ 'name' => '',
+ 'real_name_1' => $user['name'],
+ 'email' => '',
+ 'password_1' => '',
+ 'password_2' => '',
+ 'user_groups' => ['_ids' => [1]]
+ ], $user);
+ /* @var \BaserCore\Service\UsersService $usersService */
+ $usersService = $this->getService(UsersServiceInterface::class);
+ try {
+ return $usersService->create($user);
+ } catch (PersistenceFailedException $e) {
+ throw $e;
+ }
+ }
+
+ /**
+ * サイト名を登録する
+ *
+ * @param string $name
+ * @return \Cake\Datasource\EntityInterface|null
+ * @checked
+ * @noTodo
+ */
+ public function setSiteName(string $name)
+ {
+ /* @var \BaserCore\Service\SitesService $sitesService */
+ $sitesService = $this->getService(SitesServiceInterface::class);
+ return $sitesService->update($sitesService->get(1), [
+ 'display_name' => $name,
+ 'title' => $name
+ ]);
+ }
+
+ /**
+ * データベースのデータに初期更新を行う
+ *
+ * @return bool
+ * @checked
+ * @noTodo
+ */
+ public function executeDefaultUpdates(): bool
+ {
+ $result = true;
+ if (!$this->_updatePluginStatus()) {
+ $this->log(__d('baser', 'プラグインの有効化に失敗しました。'));
+ $result = false;
+ }
+ if (!$this->_updateContents()) {
+ $this->log(__d('baser', 'コンテンツの更新に失敗しました。'));
+ $result = false;
+ }
+ return $result;
+ }
+
+ /**
+ * コンテンツの作成日を更新する
+ *
+ * @return bool
+ * @checked
+ * @noTodo
+ */
+ protected function _updateContents(): bool
+ {
+ $contentsTable = TableRegistry::getTableLocator()->get('BaserCore.Contents');
+ $contents = $contentsTable->find()->all();
+ $result = true;
+ foreach($contents as $content) {
+ $content->created_date = new FrozenTime();
+ if (!$contentsTable->save($content)) {
+ $result = false;
+ }
+ }
+ return $result;
+ }
+
+ /**
+ * プラグインのステータスを更新する
+ *
+ * @return boolean
+ * @checked
+ * @noTodo
+ */
+ protected function _updatePluginStatus(): bool
+ {
+ $this->BcDatabase->truncate('plugins');
+ $version = BcUtil::getVersion();
+ $pluginsTable = TableRegistry::getTableLocator()->get('BaserCore.Plugins');
+ $priority = intval($pluginsTable->getMax('priority')) + 1;
+ $corePlugins = Configure::read('BcApp.corePlugins');
+ $result = true;
+ foreach($corePlugins as $corePlugin) {
+ $plugin = $pluginsTable->getPluginConfig($corePlugin);
+ $plugin = $pluginsTable->patchEntity($plugin, [
+ 'name' => $corePlugin,
+ 'version' => $version,
+ 'status' => true,
+ 'db_inited' => false,
+ 'priority' => $priority
+ ]);
+ if (!$pluginsTable->save($plugin)) {
+ $result = false;
+ }
+ $priority++;
+ }
+ return $result;
+ }
+
+ /**
+ * コアプラグインをインストールする
+ *
+ * @return bool
+ * @checked
+ * @noTodo
+ */
+ public function installCorePlugin(string $dbDataPattern): bool
+ {
+ $result = true;
+ $corePlugins = Configure::read('BcApp.corePlugins');
+ foreach($corePlugins as $corePlugin) {
+ if (!$this->installPlugin($corePlugin, $dbDataPattern)) {
+ $this->log(sprintf(__d('baser', 'コアプラグイン %s のインストールに失敗しました。'), $corePlugin));
+ $result = false;
+ }
+ }
+ return $result;
+ }
+
+ /**
+ * プラグインをインストールする
+ *
+ * @param string $name
+ * @param string $dbDataPattern
+ * @return boolean
+ * @checked
+ */
+ public function installPlugin($name, $dbDataPattern = '')
+ {
+ BcUtil::clearAllCache();
+ // TODO ucmitz 引数となる $dbDataPattern が利用できる仕様となっていない
+ /* @var BcPlugin $plugin */
+ $plugin = Plugin::isLoaded($name);
+ if(!$plugin) $plugin = Plugin::getCollection()->create($name);
+ return $plugin->install();
+
+ $paths = App::path('Plugin');
+ $exists = false;
+ foreach($paths as $path) {
+ if (file_exists($path . $name)) {
+ $exists = true;
+ break;
+ }
+ }
+
+ if (!$exists) {
+ return false;
+ }
+
+ $this->Plugin = ClassRegistry::init('Plugin');
+ $data = $this->Plugin->find('first', ['conditions' => ['name' => $name]]);
+ $title = '';
+
+ if (empty($data['Plugin']['db_inited'])) {
+ $initPath = $path . $name . DS . 'Config' . DS . 'init.php';
+ if (file_exists($initPath)) {
+ $this->initPlugin($initPath, $dbDataPattern);
+ }
+ }
+ $configPath = $path . $name . DS . 'config.php';
+ if (file_exists($configPath)) {
+ include $configPath;
+ }
+
+ if (empty($title)) {
+ if (!empty($data['Plugin']['title'])) {
+ $title = $data['Plugin']['title'];
+ } else {
+ $title = $name;
+ }
+ }
+
+ if ($data) {
+ // 既にインストールデータが存在する場合は、DBのバージョンは変更しない
+ $data = array_merge($data['Plugin'], [
+ 'name' => $name,
+ 'title' => $title,
+ 'status' => true,
+ 'db_inited' => true
+ ]);
+ $this->Plugin->set($data);
+ } else {
+ $corePlugins = Configure::read('BcApp.corePlugins');
+ if (in_array($name, $corePlugins)) {
+ $version = BcUtil::getVersion();
+ } else {
+ $version = BcUtil::getVersion($name);
+ }
+
+ $priority = intval($this->Plugin->getMax('priority')) + 1;
+ $data = ['Plugin' => [
+ 'name' => $name,
+ 'title' => $title,
+ 'status' => true,
+ 'db_inited' => true,
+ 'version' => $version,
+ 'priority' => $priority
+ ]];
+ $this->Plugin->create($data);
+ }
+
+ // データを保存
+ if ($this->Plugin->save()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * プラグインを初期化
+ *
+ * @param $_path
+ */
+ public function initPlugin($_path, $dbDataPattern = '')
+ {
+ if ($dbDataPattern) {
+ $_SESSION['dbDataPattern'] = $dbDataPattern;
+ }
+ ClassRegistry::flush();
+ if (file_exists($_path)) {
+ try {
+ set_time_limit(0);
+ include $_path;
+ } catch (Exception $e) {
+ $this->log($e->getMessage());
+ }
+ }
+ }
+
+ /**
+ * インストール設定ファイルを生成する
+ *
+ * @param array $dbConfig
+ * @param string $securitySalt
+ * @return boolean
+ * @checked
+ * @noTodo
+ */
+ public function createInstallFile(array $dbConfig, string $securitySalt): bool
+ {
+ if (!is_writable(ROOT . DS . 'config' . DS)) {
+ return false;
+ }
+ $installFileName = ROOT . DS . 'config' . DS . 'install.php';
+
+ $dbConfig = array_merge([
+ 'className' => Connection::class,
+ 'driver' => '',
+ 'host' => 'localhost',
+ 'port' => '',
+ 'username' => 'dummy',
+ 'password' => 'dummy',
+ 'database' => 'dummy',
+ 'prefix' => '',
+ 'schema' => ''
+ ], $dbConfig);
+ // 入力された文字列よりPHPプログラムファイルを生成するため'(シングルクオート)をサニタイズ
+ foreach($dbConfig as $key => $value) {
+ $dbConfig[$key] = addcslashes($value, '\'\\');
+ }
+
+ $basicSettings = [
+ 'Security.salt' => $securitySalt
+ ];
+
+ $installCoreData = [
+ ' $value) {
+ $installCoreData[] = ' \'' . $key . '\' => \'' . $value . '\',';
+ }
+ $installCoreData[] = ' \'Datasources.default\' => [';
+ foreach($dbConfig as $key => $value) {
+ $installCoreData[] = ' \'' . $key . '\' => \'' . $value . '\',';
+ }
+ $installCoreData[] = ' ]';
+ $installCoreData[] = '];';
+
+ if (file_put_contents($installFileName, implode("\n", $installCoreData))) {
+ return chmod($installFileName, 0666);
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * アップロード用初期フォルダを作成する
+ *
+ * @checked
+ * @noTodo
+ */
+ public function createDefaultFiles(): bool
+ {
+ $dirs = ['blog', 'editor', 'theme_configs'];
+ $path = WWW_ROOT . 'files' . DS;
+ $Folder = new Folder();
+ $result = true;
+ foreach($dirs as $dir) {
+ if (!is_dir($path . $dir)) {
+ if (!$Folder->create($path . $dir, 0777)) {
+ $result = false;
+ }
+ }
+ }
+ return $result;
+ }
+
+ /**
+ * エディタテンプレート用のアイコン画像をデプロイ
+ *
+ * @return boolean
+ * @checked
+ * @noTodo
+ */
+ public function deployEditorTemplateImage(): bool
+ {
+ $path = WWW_ROOT . 'files' . DS . 'editor' . DS;
+ if (!is_dir($path)) {
+ $Folder = new Folder();
+ $Folder->create($path, 0777);
+ }
+ $pluginPath = BcUtil::getPluginPath(Configure::read('BcApp.defaultAdminTheme')) . DS;
+ $src = $pluginPath . DS . 'webroot' . DS . 'img' . DS . 'admin' . DS . 'ckeditor' . DS;
+ $Folder = new Folder($src);
+ $files = $Folder->read(true, true);
+ $result = true;
+ if (!empty($files[1])) {
+ foreach($files[1] as $file) {
+ if (copy($src . $file, $path . $file)) {
+ @chmod($path . $file, 0666);
+ } else {
+ $result = false;
+ }
+ }
+ }
+ return $result;
+ }
+
+ /**
+ * 利用可能なデータソースを取得する
+ *
+ * @return array
+ * @checked
+ */
+ protected function _getDbSource(): array
+ {
+ // TODO uctmiz 未実装
+ return ['mysql' => 'MySQL'];
+
+ /* DBソース取得 */
+ $dbsource = [];
+ $folder = new Folder();
+ $pdoDrivers = PDO::getAvailableDrivers();
+ /* MySQL利用可否 */
+ if (in_array('mysql', $pdoDrivers)) {
+ $dbsource['mysql'] = 'MySQL';
+ }
+ /* PostgreSQL利用可否 */
+ if (in_array('pgsql', $pdoDrivers)) {
+ $dbsource['postgres'] = 'PostgreSQL';
+ }
+ /* SQLite利用可否チェック */
+ if (in_array('sqlite', $pdoDrivers) && extension_loaded('sqlite3') && class_exists('SQLite3')) {
+ $dbFolderPath = APP . 'db' . DS . 'sqlite';
+ if (is_writable(dirname($dbFolderPath)) && $folder->create($dbFolderPath, 0777)) {
+ $info = SQLite3::version();
+ if (version_compare($info['versionString'], Configure::read('BcRequire.winSQLiteVersion'), '>')) {
+ $dbsource['sqlite'] = 'SQLite';
+ }
+ }
+ }
+ return $dbsource;
+ }
+
+ /**
+ * 全てのテーマの初期データのリストを取得する
+ *
+ * @return array
+ * @checked
+ * @noTodo
+ */
+ public function getAllDefaultDataPatterns(): array
+ {
+ $themesService = $this->getService(ThemesServiceInterface::class);
+ // コア
+ $patterns = $themesService->getDefaultDataPatterns();
+ // 外部テーマ
+ $Folder = new Folder(BASER_THEMES);
+ $files = $Folder->read(true, true, false);
+ foreach($files[0] as $theme) {
+ $configPath = BASER_PLUGINS . $theme . DS . 'config.php';
+ if (!file_exists($configPath)) continue;
+ $config = include $configPath;
+ if (!isset($config['type']) || $config['type'] !== 'theme') continue;
+ $patterns = array_merge($patterns, $themesService->getDefaultDataPatterns($theme));
+ }
+ return $patterns;
+ }
+
}
diff --git a/plugins/bc-installer/src/ServiceProvider/BcInstallerServiceProvider.php b/plugins/bc-installer/src/ServiceProvider/BcInstallerServiceProvider.php
index 27ff8e978e..9aca35794b 100755
--- a/plugins/bc-installer/src/ServiceProvider/BcInstallerServiceProvider.php
+++ b/plugins/bc-installer/src/ServiceProvider/BcInstallerServiceProvider.php
@@ -14,6 +14,8 @@
use BaserCore\Annotation\UnitTest;
use BaserCore\Annotation\NoTodo;
use BaserCore\Annotation\Checked;
+use BcInstaller\Service\Admin\InstallationsAdminService;
+use BcInstaller\Service\Admin\InstallationsAdminServiceInterface;
use BcInstaller\Service\InstallationsService;
use BcInstaller\Service\InstallationsServiceInterface;
use Cake\Core\ServiceProvider;
@@ -29,7 +31,8 @@ class BcInstallerServiceProvider extends ServiceProvider
* @var string[]
*/
protected $provides = [
- InstallationsServiceInterface::class
+ InstallationsServiceInterface::class,
+ InstallationsAdminServiceInterface::class
];
/**
@@ -43,6 +46,7 @@ public function services($container): void
$container->defaultToShared(true);
// Installations サービス
$container->add(InstallationsServiceInterface::class, InstallationsService::class);
+ $container->add(InstallationsAdminServiceInterface::class, InstallationsAdminService::class);
}
}
diff --git a/plugins/bc-installer/src/js/admin/step2.js b/plugins/bc-installer/src/js/admin/step2.js
new file mode 100644
index 0000000000..7b0dee6954
--- /dev/null
+++ b/plugins/bc-installer/src/js/admin/step2.js
@@ -0,0 +1,25 @@
+/**
+ * baserCMS : Based Website Development Project
+ * Copyright (c) NPO baser foundation
+ *
+ * @copyright Copyright (c) NPO baser foundation
+ * @link https://basercms.net baserCMS Project
+ * @since 5.0.0
+ * @license https://basercms.net/license/index.html MIT License
+ */
+
+$(function () {
+ $("#BtnNext, #BtnCheckAgain").click(function () {
+ $.bcUtil.showLoader();
+ let mode = $("#mode");
+ switch (this.id) {
+ case 'BtnNext':
+ mode.val('next');
+ break;
+ case 'BtnCheckAgain':
+ mode.val('check');
+ break;
+ }
+ $("#CheckEnvForm").submit();
+ });
+});
diff --git a/plugins/bc-installer/src/js/admin/step3.js b/plugins/bc-installer/src/js/admin/step3.js
new file mode 100644
index 0000000000..1d476e687b
--- /dev/null
+++ b/plugins/bc-installer/src/js/admin/step3.js
@@ -0,0 +1,121 @@
+$(function () {
+ let $dbHost = $('#dbHost');
+ let $dbName = $('#dbName');
+ let $dbPort = $('#dbPort');
+ let $dbPrefix = $('#dbPrefix');
+ let $dbUserName = $('#dbUsername');
+ let $dbPassword = $('#dbPassword');
+
+ initForm();
+
+ /* イベント登録 */
+ $('#BtnCheckDb, #BtnNext, #BtnBack').click(function array() {
+ $.bcUtil.showLoader();
+ if (this.id === 'BtnNext') {
+ $("#mode").val('createDb');
+ } else if (this.id === 'BtnBack') {
+ $("#mode").val('back');
+ } else if (this.id === 'BtnCheckDb') {
+ $("#mode").val('checkDb');
+ }
+ var result = true;
+ if (this.id !== 'BtnBack' && $('#dbType').val() !== 'sqlite') {
+ if ($dbHost.val() === "") {
+ alert(bcI18n.message1);
+ result = false;
+ } else if ($dbUserName.val() === "") {
+ alert(bcI18n.message2);
+ result = false;
+ } else if ($dbName.val() === "") {
+ alert(bcI18n.message3);
+ result = false;
+ } else if ($dbPrefix.val() === "") {
+ alert(bcI18n.message4);
+ result = false;
+ } else if (!$dbPrefix.val().match(/[_]$/)) {
+ alert(bcI18n.message5);
+ result = false;
+ } else if (!$dbPrefix.val().match(/^[a-zA-z0-9_]+_$/)) {
+ alert(bcI18n.message6);
+ result = false;
+ } else if ($dbName.val().match(/^.*\..*$/)) {
+ alert(bcI18n.message7);
+ result = false;
+ } else if ($dbPort.val() === "") {
+ alert(bcI18n.message8);
+ result = false;
+ }
+ }
+ if (result) {
+ $('#DbSettingForm').submit();
+ } else {
+ $.bcUtil.hideLoader();
+ return false;
+ }
+ });
+
+ $('#dbType').change(function () {
+ $dbHost.val('');
+ $dbUserName.val('');
+ $dbPassword.val('');
+ $dbName.val('');
+ $dbPort.val('');
+ $dbPrefix.val('');
+ initForm();
+ });
+
+});
+
+/**
+ * フォームを初期化する
+ * @return void
+ */
+function initForm() {
+
+ let $dbType = $('#dbType');
+ let $btnNext = $('#BtnNext');
+ let $dbHost = $('#dbHost');
+ let $dbName = $('#dbName');
+ let $dbPort = $('#dbPort');
+ let $dbPrefix = $('#dbPrefix');
+ let port, host, dbName, prefix;
+
+ if ($dbType.val() === 'mysql') {
+ $('#liDbHost').show(500);
+ $('#liDbUser').show(500);
+ $('#liDbInfo').show(500);
+ $('#BtnCheckDb').show();
+ host = 'localhost';
+ dbName = 'baser';
+ port = '3306';
+ prefix = 'mysite_';
+ } else if ($dbType.val() === 'postgres') {
+ $('#liDbHost').show(500);
+ $('#liDbUser').show(500);
+ $('#liDbInfo').show(500);
+ $('#BtnCheckDb').show();
+ host = 'localhost';
+ dbName = 'baser';
+ port = '5432';
+ prefix = 'mysite_';
+ } else if ($dbType.val() === 'sqlite') {
+ $('#liDbHost').hide(500);
+ $('#liDbUser').hide(500);
+ $('#liDbInfo').hide(500);
+ $('#BtnCheckDb').hide();
+ $btnNext.removeAttr("disabled").attr('data-bca-btn-size', 'lg').attr('data-bca-btn-width', 'lg');
+ dbName = 'baser';
+ port = '';
+ $dbPrefix.val('');
+ } else {
+ $('#liDbHost').show(500);
+ $('#dbUser').show(500);
+ $('#dbInfo').show(500);
+ $('#BtnCheckDb').show();
+ }
+ if (!$dbHost.val()) $dbHost.val(host);
+ if (!$dbName.val()) $dbName.val(dbName);
+ if (!$dbPort.val()) $dbPort.val(port);
+ if (!$dbPrefix.val()) $dbPrefix.val(prefix);
+ $dbHost.focus();
+}
diff --git a/plugins/bc-installer/src/js/admin/step4.js b/plugins/bc-installer/src/js/admin/step4.js
new file mode 100644
index 0000000000..84da355334
--- /dev/null
+++ b/plugins/bc-installer/src/js/admin/step4.js
@@ -0,0 +1,55 @@
+/**
+ * baserCMS : Based Website Development Project
+ * Copyright (c) baserCMS Users Community
+ *
+ * @copyright Copyright (c) baserCMS Users Community
+ * @link https://basercms.net baserCMS Project
+ * @package Baser.View
+ * @since baserCMS v 0.1.0
+ * @license https://basercms.net/license/index.html
+ */
+
+$(function () {
+
+ $("#site-name").focus();
+
+ $('#BtnFinish, #BtnBack').click(function () {
+ $.bcUtil.showLoader();
+ var result = true;
+ if (this.id === 'BtnFinish') {
+ $("#mode").val('finish');
+ if ($("#site-name").val() === "") {
+ alert(bcI18n.message0);
+ result = false;
+ } else if ($("#admin-email").val() === "") {
+ alert(bcI18n.message1);
+ result = false;
+ } else if ($("#admin-username").val() === "") {
+ alert(bcI18n.message2);
+ result = false;
+ } else if (!$("#admin-username").val().match(/^[a-zA-Z0-9\-_]+$/)) {
+ alert(bcI18n.message3);
+ result = false;
+ } else if ($("#admin-password").val().length < 6) {
+ alert(bcI18n.message4);
+ result = false;
+ } else if ($("#admin-password").val() !== $("#admin-confirm-password").val()) {
+ alert(bcI18n.message5);
+ result = false;
+ } else if (!$("#admin-password").val().match(/^[a-zA-Z0-9\-_ \.:\/\(\)#,@\[\]\+=&;\{\}!\$\*]+$/)) {
+ alert(bcI18n.message6);
+ result = false;
+ }
+ } else if (this.id === 'BtnBack') {
+ $("#mode").val('back');
+ }
+
+ if (result) {
+ $('#AdminSettingForm').submit();
+ } else {
+ $.bcUtil.hideLoader();
+ return false;
+ }
+
+ });
+});
diff --git a/plugins/bc-installer/templates/Admin/Installations/index.php b/plugins/bc-installer/templates/Admin/Installations/index.php
index 10c58a0935..89fe48246b 100755
--- a/plugins/bc-installer/templates/Admin/Installations/index.php
+++ b/plugins/bc-installer/templates/Admin/Installations/index.php
@@ -1,38 +1,46 @@
- * Copyright (c) baserCMS Users Community
+ * Copyright (c) NPO baser foundation
*
- * @copyright Copyright (c) baserCMS Users Community
- * @link https://basercms.net baserCMS Project
- * @package Baser.View
- * @since baserCMS v 0.1.0
- * @license https://basercms.net/license/index.html
+ * @copyright Copyright (c) NPO baser foundation
+ * @link https://basercms.net baserCMS Project
+ * @since 5.0.0
+ * @license https://basercms.net/license/index.html MIT License
*/
/**
* [PUBLISH] インストーラー初期ページ
+ * @var \BaserCore\View\BcAdminAppView $this
*/
+$this->BcAdmin->setTitle(__d('baser', 'baserCMSのインストール'));
?>
-
よろしければ「インストール開始」ボタンをクリックしてください。'), Configure::read('BcApp.title')) ?>
+
+ よろしければ「インストール開始」ボタンをクリックしてください。'), \Cake\Core\Configure::read('BcApp.title')) ?>
+
-
SQLite3 を利用すれば、インストールにデータベースサーバーは必要ありません。') ?>
+
+ SQLite3 を利用すれば、インストールにデータベースサーバーは必要ありません。') ?>
+
※
-
+ BcAdminForm->create(null, ['url' => ['action' => 'step2'], 'type' => 'post']) ?>
+ BcAdminForm->button('' . __d('baser', 'インストール開始') . '', [
+ 'class' => 'bca-btn bca-actions__item bca-loading',
+ 'data-bca-btn-size' => 'lg',
+ 'data-bca-btn-width' => 'lg',
+ 'data-bca-btn-type' => 'save',
+ 'escapeTitle' => false
+ ]) ?>
+ BcAdminForm->end() ?>
diff --git a/plugins/bc-installer/templates/Admin/Installations/step2.php b/plugins/bc-installer/templates/Admin/Installations/step2.php
index 1f2a6d3995..4ce12bb3aa 100755
--- a/plugins/bc-installer/templates/Admin/Installations/step2.php
+++ b/plugins/bc-installer/templates/Admin/Installations/step2.php
@@ -1,38 +1,45 @@
- * Copyright (c) baserCMS Users Community
+ * Copyright (c) NPO baser foundation
*
- * @copyright Copyright (c) baserCMS Users Community
- * @link https://basercms.net baserCMS Project
- * @package Baser.View
- * @since baserCMS v 0.1.0
- * @license https://basercms.net/license/index.html
+ * @copyright Copyright (c) NPO baser foundation
+ * @link https://basercms.net baserCMS Project
+ * @since 5.0.0
+ * @license https://basercms.net/license/index.html MIT License
*/
/**
- * [PUBLISH] インストーラー Step2
+ * インストーラー Step2
+ *
+ * @var \BaserCore\View\BcAdminAppView $this
+ * @var string $configDir
+ * @var string $pluginDir
+ * @var string $filesDir
+ * @var string $tmpDir
+ * @var string $dbDir
+ * @var string $requirePhpVersion
+ * @var string $requirePhpMemory
+ * @var string $encoding
+ * @var string $phpMemory
+ * @var string $phpActualVersion
+ * @var bool $configDirWritable
+ * @var bool $pluginDirWritable
+ * @var bool $tmpDirWritable
+ * @var bool $filesDirWritable
+ * @var bool $dbDirWritable
+ * @var bool $encodingOk
+ * @var bool $phpMemoryOk
+ * @var bool $phpVersionOk
+ * @var bool $gdOk
+ * @var bool $xmlOk
+ * @var bool $blRequirementsMet
*/
+$this->BcBaser->js('BcInstaller.admin/step2.bundle', false);
+$this->BcAdmin->setTitle(__d('baser', 'baserCMSのインストール|ステップ2'));
?>
-
-
@@ -46,187 +53,95 @@
- '>
- >=
+ >=
:
-
+
- '>
-
+
-
-
+
+
- '>
-
+
-
-
+
+
- '>
-
+
-
-
-
-
-
- - '>
-
-
-
-
-
-
-
+
+
- '>
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
- - '>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
- - '>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - '>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - '>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - '>
+
- '>
-
+
-
+
- - '>
+
- '>
-
+
-
+
- - '>
+
- '>
-
+
-
+
@@ -245,13 +160,14 @@
class="bca-main__text">有効にするには、下記のフォルダへの書き込み権限が必要です ') ?>
- - '>
-
+ - '>
+
-
+
@@ -259,148 +175,52 @@ class="bca-main__text">
-
-
-
既に存在する場合には上書きされてしまいますのでご注意ください。') ?>
-
-
- - '>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - '>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - '>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ class="bca-main__text">
- - '>
- = %s'), Configure::read('BcRequire.phpMemory') . " MB") ?>
+
- '>
+ = %s'), $requirePhpMemory . " MB") ?>
-
-
+
+
-
-
-
-
-
- - '>
-
-
-
- Off
-
- On
-
-
-
-
-
-
-
レンタルサーバー等でセーフモードをOffにできない場合は、CGIモードに切り替えてから次のステップに進んでください。
サーバーによっては、最上位のフォルダにある .htaccess ファイルに次の2行を記述する事でCGIモードに切り替える事ができます。') ?>
-
-
-
AddHandler application/x-httpd-phpcgi .php
- mod_gzip_on Off
-
-
-
-
- FTPで接続を行い、次のフォルダ内のファイルやフォルダを全てコピーした上で、フォルダ全てに書き込み権限(707 Or 777 等、サーバー推奨がある場合はそちらに従ってください)を与えます。
コピーと権限の変更が完了したら次のステップに進みインストールを続けます。') ?>
-
-
-
-
-
+ BcAdminForm->create(null, ['url' => ['action' => 'step2'], 'type' => 'post', 'id' => 'CheckEnvForm']) ?>
+ BcAdminForm->hidden('mode', ['id' => 'mode']) ?>
+ BcAdminForm->unlockField('mode') ?>
+
+
+ BcAdminForm->button(__d('baser', '再チェック'), ['class' => 'bca-btn bca-actions__item', 'id' => 'BtnCheckAgain']) ?>
+
+ BcAdminForm->button(__d('baser', '次のステップへ'), [
+ 'class' => 'bca-btn bca-actions__item',
+ 'id' => 'BtnNext',
+ 'disabled' => 'disabled'
+ ]) ?>
+
+ BcAdminForm->button(__d('baser', '次のステップへ'), [
+ 'class' => 'bca-btn bca-actions__item',
+ 'id' => 'BtnNext',
+ 'data-bca-btn-size' => 'lg',
+ 'data-bca-btn-width' => 'lg',
+ 'data-bca-btn-type' => 'save'
+ ]) ?>
+
+
+ BcAdminForm->end() ?>
diff --git a/plugins/bc-installer/templates/Admin/Installations/step3.php b/plugins/bc-installer/templates/Admin/Installations/step3.php
index 2df4537ac6..56c9ed4430 100755
--- a/plugins/bc-installer/templates/Admin/Installations/step3.php
+++ b/plugins/bc-installer/templates/Admin/Installations/step3.php
@@ -12,6 +12,10 @@
/**
* [PUBLISH] インストーラー Step3
+ * @var \BaserCore\View\BcAdminAppView $this
+ * @var bool $blDBSettingsOK
+ * @var array $dbDataPatterns
+ * @var array $dbsource
*/
$this->BcBaser->i18nScript([
'message1' => __d('baser', 'データベースのホスト名を入力してください。'),
@@ -23,217 +27,92 @@
'message7' => __d('baser', 'ドット(.)を含むデータベース名にはインストールできません。'),
'message8' => __d('baser', 'データベースのポートナンバーを入力してください。')
]);
+$this->BcBaser->js('BcInstaller.admin/step3.bundle', false, [
+ 'id' => 'AdminInstallersScript',
+ 'data-dbSettingOk' => $blDBSettingsOK
+]);
+$this->BcAdmin->setTitle(__d('baser', 'baserCMSのインストール|ステップ3'));
?>
-
-
-BcAdminForm->create(null, ['url' => ['controller' => 'installations', 'action' => 'step3'], 'id' => 'dbsettings', 'name' => 'dbsettings']) ?>
+BcAdminForm->create(null, ['url' => ['controller' => 'installations', 'action' => 'step3'], 'id' => 'DbSettingForm']) ?>
+BcAdminForm->control('mode', ['style' => 'display:none', 'type' => 'hidden', 'id' => 'mode']); ?>
+BcAdminForm->unlockField('mode') ?>
- MySQL / PostgreSQLの場合は、データベースが存在し初期化されている必要があります。
既に用意したデータベースにデータが存在する場合は、初期データで上書きされてしまうので注意してください。
プレフィックスを活用しましょう。') ?>
+ MySQL / PostgreSQLの場合は、データベースが存在し初期化されている必要があります。
既に用意したデータベースにデータが存在する場合は、初期データで上書きされてしまうので注意してください。') ?>
+
+
+
+
- - BcAdminForm->label('Installation.dbType', __d('baser', 'データベースタイプ')); ?>
- BcAdminForm->control('Installation.dbType', ['type' => 'select', 'options' => $dbsource]) ?>
+
-
+ BcAdminForm->label('dbType', __d('baser', 'データベースタイプ')); ?>
+ BcAdminForm->control('dbType', ['type' => 'select', 'options' => $dbsource, 'id' => 'dbType']) ?>
※
- - BcAdminForm->label('Installation.dbHost', __d('baser', 'データベースホスト名')); ?>
- BcAdminForm->control('Installation.dbHost', ['type' => 'text', 'maxlength' => '300', 'size' => 45]); ?>
- -
+
-
+ BcAdminForm->label('dbHost', __d('baser', 'データベースホスト名')); ?>
+ BcAdminForm->control('dbHost', ['type' => 'text', 'maxlength' => '300', 'size' => 45, 'id' => 'dbHost']); ?>
+
+ -
-
BcAdminForm->control('Installation.dbUsername', ['type' => 'text', 'maxlength' => '100']); ?>
-
+
+ BcAdminForm->control('dbUsername', ['type' => 'text', 'maxlength' => '100', 'id' => 'dbUserName']); ?>
+
-
BcAdminForm->control('Installation.dbPassword', ['type' => 'text', 'maxlength' => '100', 'type' => 'password']); ?>
-
+
+ BcAdminForm->control('dbPassword', ['type' => 'password', 'maxlength' => '100', 'id' => 'dbPassword']); ?>
+
-
-
+
-
-
BcAdminForm->control('Installation.dbName', ['type' => 'text', 'maxlength' => '100']); ?>
-
-
- BcAdminForm->control('Installation.dbPrefix', ['type' => 'text', 'size' => '10']); ?>
-
-
- BcAdminForm->control('Installation.dbPort', ['type' => 'text', 'maxlength' => '5', 'size' => 5]); ?>
-
-
- BcAdminForm->control('buttonclicked', ['style' => 'display:none', 'type' => 'hidden']); ?>
-
+
+ BcAdminForm->control('dbName', ['type' => 'text', 'maxlength' => '100', 'id' => 'dbName']); ?>
+
+
+
+
+ BcAdminForm->control('dbPrefix', ['type' => 'text', 'size' => '10', 'id' => 'dbPrefix']); ?>
+
+
+
+
+ BcAdminForm->control('dbPort', ['type' => 'text', 'maxlength' => '5', 'size' => 5, 'id' => 'dbPort']); ?>
+
+
+
+
※ ※ ホスト名、データベース名、ポートは実際の環境に合わせて書き換えてください。') ?>
+
+
+
-
-
- BcAdminForm->control('Installation.dbDataPattern', ['type' => 'select', 'options' => $dbDataPatterns]) ?>
+
+
+
+ BcAdminForm->control('dbDataPattern', ['type' => 'select', 'options' => $dbDataPatterns, 'id' => 'dbDataPattern']) ?>
- request->getData('Installation.dbDataPattern')])): ?>
- ※ request->getData('Installation.dbDataPattern')]) ?>
+ request->getData('dbDataPattern')])): ?>
+ ※ request->getData('dbDataPattern')]) ?>
@@ -242,12 +121,29 @@ class="bca-main__text">
- BcAdminForm->button(__d('baser', '戻る'), ['type' => 'button', 'class' => 'button bca-btn bca-actions__item', 'id' => 'btnback']) ?>
- BcAdminForm->button(__d('baser', '接続テスト'), ['type' => 'button', 'class' => 'btn-orange button bca-btn bca-actions__item', 'id' => 'checkdb', 'data-bca-btn-type' => 'save']) ?>
-
- BcAdminForm->button(__d('baser', '次のステップへ'), ['type' => 'button', 'class' => 'button bca-btn bca-actions__item', 'id' => 'btnnext', 'name' => 'btnnext', 'disabled' => 'disabled']) ?>
+ BcAdminForm->button(__d('baser', '戻る'), ['type' => 'button', 'class' => 'button bca-btn bca-actions__item', 'id' => 'BtnBack']) ?>
+
+ BcAdminForm->button(__d('baser', '接続テスト'), [
+ 'type' => 'button',
+ 'class' => 'btn-orange button bca-btn bca-actions__item',
+ 'id' => 'BtnCheckDb',
+ 'data-bca-btn-size' => 'lg',
+ 'data-bca-btn-width' => 'lg',
+ 'data-bca-btn-type' => 'save']) ?>
+ BcAdminForm->button(__d('baser', '次のステップへ'), [
+ 'type' => 'button',
+ 'class' => 'button bca-btn bca-actions__item',
+ 'id' => 'BtnNext',
+ 'disabled' => 'disabled'
+ ]) ?>
- BcAdminForm->button(__d('baser', '次のステップへ'), ['type' => 'button', 'class' => 'button bca-btn bca-actions__item', 'id' => 'btnnext', 'name' => 'btnnext', 'data-bca-btn-type' => 'save']) ?>
+ BcAdminForm->button(__d('baser', '次のステップへ'), [
+ 'type' => 'button',
+ 'class' => 'button bca-btn bca-actions__item',
+ 'id' => 'BtnNext',
+ 'data-bca-btn-size' => 'lg',
+ 'data-bca-btn-width' => 'lg',
+ 'data-bca-btn-type' => 'save']) ?>
diff --git a/plugins/bc-installer/templates/Admin/Installations/step4.php b/plugins/bc-installer/templates/Admin/Installations/step4.php
index 67d1c91e2f..b6adde9666 100755
--- a/plugins/bc-installer/templates/Admin/Installations/step4.php
+++ b/plugins/bc-installer/templates/Admin/Installations/step4.php
@@ -1,22 +1,20 @@
- * Copyright (c) baserCMS Users Community
+ * Copyright (c) NPO baser foundation
*
- * @copyright Copyright (c) baserCMS Users Community
- * @link https://basercms.net baserCMS Project
- * @package Baser.View
- * @since baserCMS v 0.1.0
- * @license https://basercms.net/license/index.html
+ * @copyright Copyright (c) NPO baser foundation
+ * @link https://basercms.net baserCMS Project
+ * @since 5.0.0
+ * @license https://basercms.net/license/index.html MIT License
*/
/**
* [PUBLISH] インストーラー Step4
+ * @var \BaserCore\View\BcAdminAppView $this
*/
-?>
-
-BcBaser->i18nScript([
+ 'message0' => __d('baser', 'サイト名を入力してください。'),
'message1' => __d('baser', '管理用メールアドレスを入力してください。'),
'message2' => __d('baser', 'ユーザー名を入力してください。'),
'message3' => __d('baser', 'ユーザー名には半角英数字とハイフン、アンダースコアのみ利用可能です。'),
@@ -24,48 +22,10 @@
'message5' => __d('baser', 'パスワードが確認欄のパスワードと同じではありません。'),
'message6' => __d('baser', 'パスワードは半角英数字(英字は大文字小文字を区別)とスペース、記号(._-:/()#,@[]+=&;{}!$*)のみで入力してください。')
]);
+$this->BcAdmin->setTitle(__d('baser', 'baserCMSのインストール|ステップ4'));
+$this->BcBaser->js('BcInstaller.admin/step4.bundle', false);
?>
-
@@ -73,41 +33,55 @@
ここで入力した管理者アカウント名やパスワードは忘れないようにしておいてください。') ?>
-
+
- BcAdminForm->create(null, ['url' => ['controller' => 'installations', 'action' => 'step4'], 'id' => 'adminSettings', 'name' => 'adminSettings']) ?>
+ BcAdminForm->create(null, [
+ 'url' => ['controller' => 'installations', 'action' => 'step4'],
+ 'id' => 'AdminSettingForm',
+ 'method' => 'post'
+ ]) ?>
+ BcAdminForm->control('mode', ['type' => 'hidden']) ?>
+ BcAdminForm->unlockField('mode') ?>
+ -
+ BcAdminForm->control('site_name', ['type' => 'text', 'size' => 44]); ?>
+
-
- BcAdminForm->control('Installation.admin_email', ['type' => 'text', 'size' => 44]); ?>
+ BcAdminForm->control('admin_email', ['type' => 'text', 'size' => 44]); ?>
-
- BcAdminForm->control('Installation.admin_username', ['type' => 'text']); ?>
+ BcAdminForm->control('admin_username', ['type' => 'text']); ?>
-
-
+
- BcAdminForm->control('Installation.admin_password', ['type' => 'password']); ?>
+ BcAdminForm->control('admin_password', ['type' => 'password']); ?>
- BcAdminForm->control('Installation.admin_confirmpassword', ['type' => 'password']); ?>
+ BcAdminForm->control('admin_confirm_password', ['type' => 'password']); ?>
- BcAdminForm->control('Installation.clicked', ['type' => 'hidden']) ?>
-
-
- BcAdminForm->button(__d('baser', '戻る'), ['type' => 'button', 'class' => 'button bca-btn bca-actions__item', 'id' => 'btnback']) ?>
- BcAdminForm->button(__d('baser', '完了'), ['type' => 'button', 'class' => 'button bca-btn bca-actions__item', 'id' => 'btnfinish', 'name' => 'step5', 'data-bca-btn-type' => 'save']) ?>
+ BcAdminForm->button(__d('baser', '戻る'), ['type' => 'button', 'class' => 'button bca-btn bca-actions__item', 'id' => 'BtnBack']) ?>
+ BcAdminForm->button(__d('baser', '登録'), [
+ 'type' => 'button',
+ 'class' => 'bca-btn bca-actions__item',
+ 'id' => 'BtnFinish',
+ 'name' => 'step5',
+ 'data-bca-btn-size' => 'lg',
+ 'data-bca-btn-width' => 'lg',
+ 'data-bca-btn-type' => 'save'
+ ]) ?>
BcAdminForm->end() ?>
diff --git a/plugins/bc-installer/templates/Admin/Installations/step5.php b/plugins/bc-installer/templates/Admin/Installations/step5.php
index c024cc57d7..c1e1187ff2 100755
--- a/plugins/bc-installer/templates/Admin/Installations/step5.php
+++ b/plugins/bc-installer/templates/Admin/Installations/step5.php
@@ -1,46 +1,49 @@
- * Copyright (c) baserCMS Users Community
+ * Copyright (c) NPO baser foundation
*
- * @copyright Copyright (c) baserCMS Users Community
- * @link https://basercms.net baserCMS Project
- * @package Baser.View
- * @since baserCMS v 0.1.0
- * @license https://basercms.net/license/index.html
+ * @copyright Copyright (c) NPO baser foundation
+ * @link https://basercms.net baserCMS Project
+ * @since 5.0.0
+ * @license https://basercms.net/license/index.html MIT License
*/
/**
* [PUBLISH] インストーラー Step5
+ * @var \BaserCore\View\BcAdminAppView $this
*/
-$adminPrefix = Configure::read('Routing.prefixes.0');
+$this->BcAdmin->setTitle(__d('baser', 'baserCMSのインストール完了!'));
?>
-
管理用メールアドレスへインストール完了メールを送信しています。') ?>
+
+ 管理用メールアドレスへインストール完了メールを送信しています。') ?>
+
+
+
-
-
+ BcBaser->link(__d('baser', '管理者ダッシュボードに移動する'), ['prefix' => 'Admin', 'plugin' => 'BaserCore', 'controller' => 'Dashboard', 'action' => 'index']) ?>
+
+ -
+ BcBaser->link(__d('baser', 'トップページを確認する'), '/', ['target' => '_blank', 'class' => 'outside-link']) ?>
-
-
-
-
-
-
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
diff --git a/plugins/bc-installer/tests/TestCase/Model/Table/_NotYetMigrated/EditorTemplateTest.php b/plugins/bc-installer/tests/TestCase/Model/Table/_NotYetMigrated/EditorTemplateTest.php
deleted file mode 100644
index 8ea7319307..0000000000
--- a/plugins/bc-installer/tests/TestCase/Model/Table/_NotYetMigrated/EditorTemplateTest.php
+++ /dev/null
@@ -1,55 +0,0 @@
-
- * Copyright (c) baserCMS Users Community
- *
- * @copyright Copyright (c) baserCMS Users Community
- * @link https://basercms.net baserCMS Project
- * @package Baser.Test.Case.Model
- * @since baserCMS v 3.0.0-beta
- * @license https://basercms.net/license/index.html
- */
-App::uses('EditorTemplate', 'Model');
-
-/**
- * Class EditorTemplateTest
- */
-class EditorTemplateTest extends BaserTestCase
-{
-
- public $fixtures = [
- 'baser.Default.EditorTemplate',
- ];
-
- public function setUp()
- {
- parent::setUp();
- $this->EditorTemplate = ClassRegistry::init('EditorTemplate');
- }
-
- public function tearDown()
- {
- unset($this->EditorTemplate);
- parent::tearDown();
- }
-
- /**
- * validate
- */
- public function test必須チェック()
- {
- $this->EditorTemplate->create([
- 'EditorTemplate' => [
- 'name' => '',
- 'link' => '',
- ]
- ]);
- $this->assertFalse($this->EditorTemplate->validates());
- $this->assertArrayHasKey('name', $this->EditorTemplate->validationErrors);
- $this->assertEquals('テンプレート名を入力してください。', current($this->EditorTemplate->validationErrors['name']));
- }
-
-
-}
diff --git a/plugins/bc-installer/tests/TestCase/Service/InstallationsServiceTest.php b/plugins/bc-installer/tests/TestCase/Service/InstallationsServiceTest.php
new file mode 100644
index 0000000000..121664dc31
--- /dev/null
+++ b/plugins/bc-installer/tests/TestCase/Service/InstallationsServiceTest.php
@@ -0,0 +1,223 @@
+
+ * Copyright (c) NPO baser foundation
+ *
+ * @copyright Copyright (c) NPO baser foundation
+ * @link https://basercms.net baserCMS Project
+ * @since 5.0.0
+ * @license https://basercms.net/license/index.html MIT License
+ */
+
+namespace BcInstaller\Test\TestCase\Service;
+
+use BaserCore\TestSuite\BcTestCase;
+use BaserCore\Utility\BcContainerTrait;
+use BcInstaller\Service\InstallationsService;
+use BcInstaller\Service\InstallationsServiceInterface;
+
+/**
+ * InstallationsServiceTest
+ * @property InstallationsService $Installations
+ */
+class InstallationsServiceTest extends BcTestCase
+{
+
+ /**
+ * Trait
+ */
+ use BcContainerTrait;
+
+ /**
+ * setup
+ */
+ public function setUp(): void
+ {
+ parent::setUp();
+ $this->Installations = $this->getService(InstallationsServiceInterface::class);
+ }
+
+ /**
+ * 環境チェック
+ *
+ * @return array
+ */
+ public function testCheckEnv()
+ {
+ $this->markTestIncomplete('このテストは未実装です。BcManagerComponentから移植中です。');
+ $result = $this->BcManager->checkEnv();
+ $this->assertNotEmpty($result, '環境情報を取得できません');
+ }
+
+ public function test_deployAdminAssets()
+ {
+ $this->markTestIncomplete('このテストは未実装です。');
+ }
+
+ /**
+ * データベースのデータに初期更新を行う
+ */
+ public function testExecuteDefaultUpdates()
+ {
+ $this->markTestIncomplete('このテストは未実装です。BcManagerComponentから移植中です。');
+ $dbConfig = [
+ 'datasource' => 'Database/BcMysql',
+ 'persistent' => false,
+ 'host' => 'localhost',
+ 'port' => '8889',
+ 'login' => 'root',
+ 'password' => 'root',
+ 'database' => 'basercms',
+ 'schema' => '',
+ 'prefix' => 'mysite_',
+ 'encoding' => 'utf8',
+ ];
+
+ // プラグイン有効化チェック用準備(ダミーのプラグインディレクトリを作成)
+ $testPluginPath = BASER_PLUGINS . 'Test' . DS;
+ $testPluginConfigPath = $testPluginPath . 'config.php';
+ $Folder = new Folder();
+ $Folder->create($testPluginPath);
+ $File = new File($testPluginConfigPath, true);
+ $File->write('BcManager->executeDefaultUpdates($dbConfig);
+
+
+ // =====================
+ // プラグイン有効化チェック
+ // =====================
+ $File->delete();
+ $Folder->delete($testPluginPath);
+
+ $this->Plugin = ClassRegistry::init('Plugin');
+ $plugin = $this->Plugin->find('first', [
+ 'conditions' => ['id' => 4],
+ 'fields' => ['title', 'status'],
+ ]
+ );
+ $expected = [
+ 'Plugin' => [
+ 'title' => 'テスト',
+ 'status' => 1,
+ ]
+ ];
+ $this->Plugin->delete(4);
+ unset($this->Plugin);
+ $this->assertEquals($expected, $plugin, 'プラグインのステータスを正しく更新できません');
+ $this->assertTrue($result, 'データベースのデータに初期更新に失敗しました');
+ }
+
+ /**
+ * データベース設定ファイル[database.php]を保存する
+ *
+ * @param array $options
+ * @return boolean
+ */
+ public function testCreateDatabaseConfig()
+ {
+ $this->markTestIncomplete('このテストは未実装です。BcManagerComponentから移植中です。');
+ // database.phpをバックアップ
+ $configPath = APP . 'Config' . DS;
+ $copy = copy($configPath . 'database.php', $configPath . 'database.php.copy');
+
+ if ($copy) {
+ $options = [
+ 'datasource' => 'mysql',
+ 'host' => 'hoge',
+ 'port' => '0000',
+ ];
+ $this->BcManager->createDatabaseConfig($options);
+
+ $File = new File($configPath . 'database.php');
+ $result = $File->read();
+
+ // 生成されたファイルを削除し、バックアップしたファイルに置き換える
+ $File->delete();
+ $File->close();
+ rename($configPath . 'database.php.copy', $configPath . 'database.php');
+
+ $this->assertMatchesRegularExpression("/\\\$default.*'datasource' => 'Database\/BcMysql'.*'host' => 'hoge'.*'port' => '0000'/s", $result, 'データベース設定ファイル[database.php]を正しく保存できません');
+
+ } else {
+ $this->markTestIncomplete('database.phpのバックアップに失敗したため、このテストをスキップします。');
+ }
+ }
+
+ /**
+ * インストール設定ファイルを生成する
+ */
+ public function testCreateInstallFile()
+ {
+ $this->markTestIncomplete('このテストは未実装です。BcManagerComponentから移植中です。');
+ // install.phpをバックアップ
+ $configPath = APP . 'Config' . DS;
+ $copy = copy($configPath . 'install.php', $configPath . 'install.php.copy');
+
+ if ($copy) {
+
+ $this->BcManager->createInstallFile('hogeSalt', 'hogeSeed', 'hogeUrl');
+
+ $File = new File($configPath . 'install.php');
+ $result = $File->read();
+
+ // 生成されたファイルを削除し、バックアップしたファイルに置き換える
+ $File->delete();
+ $File->close();
+ rename($configPath . 'install.php.copy', $configPath . 'install.php');
+
+ $this->assertMatchesRegularExpression("/'Security.salt', 'hogeSalt'.*'Security.cipherSeed', 'hogeSeed'.*'BcEnv.siteUrl', 'hogeUrl'/s", $result, 'インストール設定ファイルを正しく生成できません');
+
+ } else {
+ $this->markTestIncomplete('install.phpのバックアップに失敗したため、このテストをスキップします。');
+
+ }
+
+ }
+
+ /**
+ * エディタテンプレート用のアイコン画像をデプロイ
+ *
+ * @return boolean
+ */
+ public function testDeployEditorTemplateImage()
+ {
+ $this->markTestIncomplete('このテストは未実装です。BcManagerComponentから移植中です。');
+ // editor フォルダを削除
+ $Folder = new Folder();
+ $targetPath = WWW_ROOT . 'files' . DS . 'editor' . DS;
+ $Folder->delete($targetPath);
+
+ $this->BcManager->deployEditorTemplateImage();
+
+ $this->assertFileExists($targetPath, 'エディタテンプレート用のアイコン画像をデプロイできません');
+
+ }
+
+ /**
+ * アップロード用初期フォルダを作成する
+ */
+ public function testCreateDefaultFiles()
+ {
+ $this->markTestIncomplete('このテストは未実装です。BcManagerComponentから移植中です。');
+ // 各フォルダを削除
+ $Folder = new Folder();
+ $path = WWW_ROOT . 'files' . DS;
+ $dirs = ['blog', 'editor', 'theme_configs'];
+
+ foreach($dirs as $dir) {
+ $Folder->delete($path . $dir);
+ }
+
+ $this->BcManager->createDefaultFiles();
+
+ foreach($dirs as $dir) {
+ $this->assertFileExists($path . $dir, 'アップロード用初期フォルダを正しく作成できません');
+ }
+ }
+
+}
diff --git a/plugins/bc-installer/webpack.config.js b/plugins/bc-installer/webpack.config.js
new file mode 100755
index 0000000000..2e0f626a85
--- /dev/null
+++ b/plugins/bc-installer/webpack.config.js
@@ -0,0 +1,52 @@
+/**
+ * baserCMS : Based Website Development Project
+ * Copyright (c) NPO baser foundation
+ *
+ * @copyright Copyright (c) NPO baser foundation
+ * @link https://basercms.net baserCMS Project
+ * @since 5.0.0
+ * @license https://basercms.net/license/index.html MIT License
+ */
+
+const glob = require("glob");
+const TerserPlugin = require('terser-webpack-plugin');
+let entries = {};
+webpack = require('webpack');
+
+glob.sync("./src/js/**/*.js").map(function(file){
+ if(!file.replace('./src/js/admin/', '').match(/^_/)) {
+ entries[file.replace('./src/js/', '').split('.').shift()] = file;
+ }
+});
+
+module.exports = {
+ mode: 'production',
+ entry: entries,
+ devtool: 'source-map',
+ output: {
+ filename: "[name].bundle.js"
+ },
+ optimization: {
+ splitChunks: {
+ name: 'admin/vendor',
+ chunks: 'initial',
+ },
+ minimizer: [new TerserPlugin({
+ extractComments: false,
+ })],
+ },
+ module: {
+ rules: [
+ {
+ test: /\.js$/,
+ exclude: /node_modules/,
+ use: {
+ loader: 'babel-loader',
+ options: {
+ presets: ['@babel/preset-env']
+ }
+ }
+ }
+ ]
+ }
+};
diff --git a/plugins/bc-installer/webroot/js/admin/step2.bundle.js b/plugins/bc-installer/webroot/js/admin/step2.bundle.js
new file mode 100644
index 0000000000..edd21f2ea3
--- /dev/null
+++ b/plugins/bc-installer/webroot/js/admin/step2.bundle.js
@@ -0,0 +1,11 @@
+/**
+ * baserCMS : Based Website Development Project
+ * Copyright (c) NPO baser foundation
+ *
+ * @copyright Copyright (c) NPO baser foundation
+ * @link https://basercms.net baserCMS Project
+ * @since 5.0.0
+ * @license https://basercms.net/license/index.html MIT License
+ */
+$((function(){$("#BtnNext, #BtnCheckAgain").click((function(){$.bcUtil.showLoader();var c=$("#mode");switch(this.id){case"BtnNext":c.val("next");break;case"BtnCheckAgain":c.val("check")}$("#CheckEnvForm").submit()}))}));
+//# sourceMappingURL=step2.bundle.js.map
\ No newline at end of file
diff --git a/plugins/bc-installer/webroot/js/admin/step2.bundle.js.map b/plugins/bc-installer/webroot/js/admin/step2.bundle.js.map
new file mode 100644
index 0000000000..20ac1b1a75
--- /dev/null
+++ b/plugins/bc-installer/webroot/js/admin/step2.bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"admin/step2.bundle.js","mappings":";;;;;;;;;AAUAA,GAAE,WACEA,EAAE,4BAA4BC,OAAM,WAChCD,EAAEE,OAAOC,aACT,IAAIC,EAAOJ,EAAE,SACb,OAAQK,KAAKC,IACT,IAAK,UACDF,EAAKG,IAAI,QACT,MACJ,IAAK,gBACDH,EAAKG,IAAI,SAGjBP,EAAE,iBAAiBQ,QACvB,GACJ","sources":["webpack://bc-installer/./src/js/admin/step2.js"],"sourcesContent":["/**\n * baserCMS : Based Website Development Project \n * Copyright (c) NPO baser foundation \n *\n * @copyright Copyright (c) NPO baser foundation\n * @link https://basercms.net baserCMS Project\n * @since 5.0.0\n * @license https://basercms.net/license/index.html MIT License\n */\n\n$(function () {\n $(\"#BtnNext, #BtnCheckAgain\").click(function () {\n $.bcUtil.showLoader();\n let mode = $(\"#mode\");\n switch (this.id) {\n case 'BtnNext':\n mode.val('next');\n break;\n case 'BtnCheckAgain':\n mode.val('check');\n break;\n }\n $(\"#CheckEnvForm\").submit();\n });\n});\n"],"names":["$","click","bcUtil","showLoader","mode","this","id","val","submit"],"sourceRoot":""}
\ No newline at end of file
diff --git a/plugins/bc-installer/webroot/js/admin/step3.bundle.js b/plugins/bc-installer/webroot/js/admin/step3.bundle.js
new file mode 100644
index 0000000000..e0c90055eb
--- /dev/null
+++ b/plugins/bc-installer/webroot/js/admin/step3.bundle.js
@@ -0,0 +1,2 @@
+(()=>{function a(){var a,e,t,s,l=$("#dbType"),b=$("#BtnNext"),o=$("#dbHost"),i=$("#dbName"),c=$("#dbPort"),n=$("#dbPrefix");"mysql"===l.val()?($("#liDbHost").show(500),$("#liDbUser").show(500),$("#liDbInfo").show(500),$("#BtnCheckDb").show(),e="localhost",t="baser",a="3306",s="mysite_"):"postgres"===l.val()?($("#liDbHost").show(500),$("#liDbUser").show(500),$("#liDbInfo").show(500),$("#BtnCheckDb").show(),e="localhost",t="baser",a="5432",s="mysite_"):"sqlite"===l.val()?($("#liDbHost").hide(500),$("#liDbUser").hide(500),$("#liDbInfo").hide(500),$("#BtnCheckDb").hide(),b.removeAttr("disabled").attr("data-bca-btn-size","lg").attr("data-bca-btn-width","lg"),t="baser",a="",n.val("")):($("#liDbHost").show(500),$("#dbUser").show(500),$("#dbInfo").show(500),$("#BtnCheckDb").show()),o.val()||o.val(e),i.val()||i.val(t),c.val()||c.val(a),n.val()||n.val(s),o.focus()}$((function(){var e=$("#dbHost"),t=$("#dbName"),s=$("#dbPort"),l=$("#dbPrefix"),b=$("#dbUsername"),o=$("#dbPassword");a(),$("#BtnCheckDb, #BtnNext, #BtnBack").click((function(){$.bcUtil.showLoader(),"BtnNext"===this.id?$("#mode").val("createDb"):"BtnBack"===this.id?$("#mode").val("back"):"BtnCheckDb"===this.id&&$("#mode").val("checkDb");var a=!0;if("BtnBack"!==this.id&&"sqlite"!==$("#dbType").val()&&(""===e.val()?(alert(bcI18n.message1),a=!1):""===b.val()?(alert(bcI18n.message2),a=!1):""===t.val()?(alert(bcI18n.message3),a=!1):""===l.val()?(alert(bcI18n.message4),a=!1):l.val().match(/[_]$/)?l.val().match(/^[a-zA-z0-9_]+_$/)?t.val().match(/^.*\..*$/)?(alert(bcI18n.message7),a=!1):""===s.val()&&(alert(bcI18n.message8),a=!1):(alert(bcI18n.message6),a=!1):(alert(bcI18n.message5),a=!1)),!a)return $.bcUtil.hideLoader(),!1;$("#DbSettingForm").submit()})),$("#dbType").change((function(){e.val(""),b.val(""),o.val(""),t.val(""),s.val(""),l.val(""),a()}))}))})();
+//# sourceMappingURL=step3.bundle.js.map
\ No newline at end of file
diff --git a/plugins/bc-installer/webroot/js/admin/step3.bundle.js.map b/plugins/bc-installer/webroot/js/admin/step3.bundle.js.map
new file mode 100644
index 0000000000..a750dd21d0
--- /dev/null
+++ b/plugins/bc-installer/webroot/js/admin/step3.bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"admin/step3.bundle.js","mappings":"MAwEA,SAASA,IAEL,IAMIC,EAAMC,EAAMC,EAAQC,EANpBC,EAAUC,EAAE,WACZC,EAAWD,EAAE,YACbE,EAAUF,EAAE,WACZG,EAAUH,EAAE,WACZI,EAAUJ,EAAE,WACZK,EAAYL,EAAE,aAGI,UAAlBD,EAAQO,OACRN,EAAE,aAAaO,KAAK,KACpBP,EAAE,aAAaO,KAAK,KACpBP,EAAE,aAAaO,KAAK,KACpBP,EAAE,eAAeO,OACjBX,EAAO,YACPC,EAAS,QACTF,EAAO,OACPG,EAAS,WACgB,aAAlBC,EAAQO,OACfN,EAAE,aAAaO,KAAK,KACpBP,EAAE,aAAaO,KAAK,KACpBP,EAAE,aAAaO,KAAK,KACpBP,EAAE,eAAeO,OACjBX,EAAO,YACPC,EAAS,QACTF,EAAO,OACPG,EAAS,WACgB,WAAlBC,EAAQO,OACfN,EAAE,aAAaQ,KAAK,KACpBR,EAAE,aAAaQ,KAAK,KACpBR,EAAE,aAAaQ,KAAK,KACpBR,EAAE,eAAeQ,OACjBP,EAASQ,WAAW,YAAYC,KAAK,oBAAqB,MAAMA,KAAK,qBAAsB,MAC3Fb,EAAS,QACTF,EAAO,GACPU,EAAUC,IAAI,MAEdN,EAAE,aAAaO,KAAK,KACpBP,EAAE,WAAWO,KAAK,KAClBP,EAAE,WAAWO,KAAK,KAClBP,EAAE,eAAeO,QAEhBL,EAAQI,OAAOJ,EAAQI,IAAIV,GAC3BO,EAAQG,OAAOH,EAAQG,IAAIT,GAC3BO,EAAQE,OAAOF,EAAQE,IAAIX,GAC3BU,EAAUC,OAAOD,EAAUC,IAAIR,GACpCI,EAAQS,OACZ,CAxHAX,GAAE,WACE,IAAIE,EAAUF,EAAE,WACZG,EAAUH,EAAE,WACZI,EAAUJ,EAAE,WACZK,EAAYL,EAAE,aACdY,EAAcZ,EAAE,eAChBa,EAAcb,EAAE,eAEpBN,IAGAM,EAAE,mCAAmCc,OAAM,WACvCd,EAAEe,OAAOC,aACO,YAAZC,KAAKC,GACLlB,EAAE,SAASM,IAAI,YACI,YAAZW,KAAKC,GACZlB,EAAE,SAASM,IAAI,QACI,eAAZW,KAAKC,IACZlB,EAAE,SAASM,IAAI,WAEnB,IAAIa,GAAS,EA4Bb,GA3BgB,YAAZF,KAAKC,IAA2C,WAAvBlB,EAAE,WAAWM,QAChB,KAAlBJ,EAAQI,OACRc,MAAMC,OAAOC,UACbH,GAAS,GACoB,KAAtBP,EAAYN,OACnBc,MAAMC,OAAOE,UACbJ,GAAS,GACgB,KAAlBhB,EAAQG,OACfc,MAAMC,OAAOG,UACbL,GAAS,GACkB,KAApBd,EAAUC,OACjBc,MAAMC,OAAOI,UACbN,GAAS,GACDd,EAAUC,MAAMoB,MAAM,QAGtBrB,EAAUC,MAAMoB,MAAM,oBAGvBvB,EAAQG,MAAMoB,MAAM,aAC3BN,MAAMC,OAAOM,UACbR,GAAS,GACgB,KAAlBf,EAAQE,QACfc,MAAMC,OAAOO,UACbT,GAAS,IAPTC,MAAMC,OAAOQ,UACbV,GAAS,IAJTC,MAAMC,OAAOS,UACbX,GAAS,KAYbA,EAIA,OADAnB,EAAEe,OAAOgB,cACF,EAHP/B,EAAE,kBAAkBgC,QAK5B,IAEAhC,EAAE,WAAWiC,QAAO,WAChB/B,EAAQI,IAAI,IACZM,EAAYN,IAAI,IAChBO,EAAYP,IAAI,IAChBH,EAAQG,IAAI,IACZF,EAAQE,IAAI,IACZD,EAAUC,IAAI,IACdZ,GACJ,GAEJ,G","sources":["webpack://bc-installer/./src/js/admin/step3.js"],"sourcesContent":["$(function () {\n let $dbHost = $('#dbHost');\n let $dbName = $('#dbName');\n let $dbPort = $('#dbPort');\n let $dbPrefix = $('#dbPrefix');\n let $dbUserName = $('#dbUsername');\n let $dbPassword = $('#dbPassword');\n\n initForm();\n\n /* イベント登録 */\n $('#BtnCheckDb, #BtnNext, #BtnBack').click(function array() {\n $.bcUtil.showLoader();\n if (this.id === 'BtnNext') {\n $(\"#mode\").val('createDb');\n } else if (this.id === 'BtnBack') {\n $(\"#mode\").val('back');\n } else if (this.id === 'BtnCheckDb') {\n $(\"#mode\").val('checkDb');\n }\n var result = true;\n if (this.id !== 'BtnBack' && $('#dbType').val() !== 'sqlite') {\n if ($dbHost.val() === \"\") {\n alert(bcI18n.message1);\n result = false;\n } else if ($dbUserName.val() === \"\") {\n alert(bcI18n.message2);\n result = false;\n } else if ($dbName.val() === \"\") {\n alert(bcI18n.message3);\n result = false;\n } else if ($dbPrefix.val() === \"\") {\n alert(bcI18n.message4);\n result = false;\n } else if (!$dbPrefix.val().match(/[_]$/)) {\n alert(bcI18n.message5);\n result = false;\n } else if (!$dbPrefix.val().match(/^[a-zA-z0-9_]+_$/)) {\n alert(bcI18n.message6);\n result = false;\n } else if ($dbName.val().match(/^.*\\..*$/)) {\n alert(bcI18n.message7);\n result = false;\n } else if ($dbPort.val() === \"\") {\n alert(bcI18n.message8);\n result = false;\n }\n }\n if (result) {\n $('#DbSettingForm').submit();\n } else {\n $.bcUtil.hideLoader();\n return false;\n }\n });\n\n $('#dbType').change(function () {\n $dbHost.val('');\n $dbUserName.val('');\n $dbPassword.val('');\n $dbName.val('');\n $dbPort.val('');\n $dbPrefix.val('');\n initForm();\n });\n\n});\n\n/**\n * フォームを初期化する\n * @return void\n */\nfunction initForm() {\n\n let $dbType = $('#dbType');\n let $btnNext = $('#BtnNext');\n let $dbHost = $('#dbHost');\n let $dbName = $('#dbName');\n let $dbPort = $('#dbPort');\n let $dbPrefix = $('#dbPrefix');\n let port, host, dbName, prefix;\n\n if ($dbType.val() === 'mysql') {\n $('#liDbHost').show(500);\n $('#liDbUser').show(500);\n $('#liDbInfo').show(500);\n $('#BtnCheckDb').show();\n host = 'localhost';\n dbName = 'baser';\n port = '3306';\n prefix = 'mysite_';\n } else if ($dbType.val() === 'postgres') {\n $('#liDbHost').show(500);\n $('#liDbUser').show(500);\n $('#liDbInfo').show(500);\n $('#BtnCheckDb').show();\n host = 'localhost';\n dbName = 'baser';\n port = '5432';\n prefix = 'mysite_';\n } else if ($dbType.val() === 'sqlite') {\n $('#liDbHost').hide(500);\n $('#liDbUser').hide(500);\n $('#liDbInfo').hide(500);\n $('#BtnCheckDb').hide();\n $btnNext.removeAttr(\"disabled\").attr('data-bca-btn-size', 'lg').attr('data-bca-btn-width', 'lg');\n dbName = 'baser';\n port = '';\n $dbPrefix.val('');\n } else {\n $('#liDbHost').show(500);\n $('#dbUser').show(500);\n $('#dbInfo').show(500);\n $('#BtnCheckDb').show();\n }\n if (!$dbHost.val()) $dbHost.val(host);\n if (!$dbName.val()) $dbName.val(dbName);\n if (!$dbPort.val()) $dbPort.val(port);\n if (!$dbPrefix.val()) $dbPrefix.val(prefix);\n $dbHost.focus();\n}\n"],"names":["initForm","port","host","dbName","prefix","$dbType","$","$btnNext","$dbHost","$dbName","$dbPort","$dbPrefix","val","show","hide","removeAttr","attr","focus","$dbUserName","$dbPassword","click","bcUtil","showLoader","this","id","result","alert","bcI18n","message1","message2","message3","message4","match","message7","message8","message6","message5","hideLoader","submit","change"],"sourceRoot":""}
\ No newline at end of file
diff --git a/plugins/bc-installer/webroot/js/admin/step4.bundle.js b/plugins/bc-installer/webroot/js/admin/step4.bundle.js
new file mode 100644
index 0000000000..9cbd7e6147
--- /dev/null
+++ b/plugins/bc-installer/webroot/js/admin/step4.bundle.js
@@ -0,0 +1,12 @@
+/**
+ * baserCMS : Based Website Development Project
+ * Copyright (c) baserCMS Users Community
+ *
+ * @copyright Copyright (c) baserCMS Users Community
+ * @link https://basercms.net baserCMS Project
+ * @package Baser.View
+ * @since baserCMS v 0.1.0
+ * @license https://basercms.net/license/index.html
+ */
+$((function(){$("#site-name").focus(),$("#BtnFinish, #BtnBack").click((function(){$.bcUtil.showLoader();var a=!0;if("BtnFinish"===this.id?($("#mode").val("finish"),""===$("#site-name").val()?(alert(bcI18n.message0),a=!1):""===$("#admin-email").val()?(alert(bcI18n.message1),a=!1):""===$("#admin-username").val()?(alert(bcI18n.message2),a=!1):$("#admin-username").val().match(/^[a-zA-Z0-9\-_]+$/)?$("#admin-password").val().length<6?(alert(bcI18n.message4),a=!1):$("#admin-password").val()!==$("#admin-confirm-password").val()?(alert(bcI18n.message5),a=!1):$("#admin-password").val().match(/^[a-zA-Z0-9\-_ \.:\/\(\)#,@\[\]\+=&;\{\}!\$\*]+$/)||(alert(bcI18n.message6),a=!1):(alert(bcI18n.message3),a=!1)):"BtnBack"===this.id&&$("#mode").val("back"),!a)return $.bcUtil.hideLoader(),!1;$("#AdminSettingForm").submit()}))}));
+//# sourceMappingURL=step4.bundle.js.map
\ No newline at end of file
diff --git a/plugins/bc-installer/webroot/js/admin/step4.bundle.js.map b/plugins/bc-installer/webroot/js/admin/step4.bundle.js.map
new file mode 100644
index 0000000000..dd0a15993b
--- /dev/null
+++ b/plugins/bc-installer/webroot/js/admin/step4.bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"admin/step4.bundle.js","mappings":";;;;;;;;;;AAWAA,GAAE,WAEEA,EAAE,cAAcC,QAEhBD,EAAE,wBAAwBE,OAAM,WAC5BF,EAAEG,OAAOC,aACT,IAAIC,GAAS,EA6Bb,GA5BgB,cAAZC,KAAKC,IACLP,EAAE,SAASQ,IAAI,UACe,KAA1BR,EAAE,cAAcQ,OAChBC,MAAMC,OAAOC,UACbN,GAAS,GAC0B,KAA5BL,EAAE,gBAAgBQ,OACzBC,MAAMC,OAAOE,UACbP,GAAS,GAC6B,KAA/BL,EAAE,mBAAmBQ,OAC5BC,MAAMC,OAAOG,UACbR,GAAS,GACDL,EAAE,mBAAmBQ,MAAMM,MAAM,qBAGlCd,EAAE,mBAAmBQ,MAAMO,OAAS,GAC3CN,MAAMC,OAAOM,UACbX,GAAS,GACFL,EAAE,mBAAmBQ,QAAUR,EAAE,2BAA2BQ,OACnEC,MAAMC,OAAOO,UACbZ,GAAS,GACDL,EAAE,mBAAmBQ,MAAMM,MAAM,sDACzCL,MAAMC,OAAOQ,UACbb,GAAS,IAVTI,MAAMC,OAAOS,UACbd,GAAS,IAWM,YAAZC,KAAKC,IACZP,EAAE,SAASQ,IAAI,SAGfH,EAIA,OADAL,EAAEG,OAAOiB,cACF,EAHPpB,EAAE,qBAAqBqB,QAM/B,GACJ","sources":["webpack://bc-installer/./src/js/admin/step4.js"],"sourcesContent":["/**\n * baserCMS : Based Website Development Project \n * Copyright (c) baserCMS Users Community \n *\n * @copyright Copyright (c) baserCMS Users Community\n * @link https://basercms.net baserCMS Project\n * @package Baser.View\n * @since baserCMS v 0.1.0\n * @license https://basercms.net/license/index.html\n */\n\n$(function () {\n\n $(\"#site-name\").focus();\n\n $('#BtnFinish, #BtnBack').click(function () {\n $.bcUtil.showLoader();\n var result = true;\n if (this.id === 'BtnFinish') {\n $(\"#mode\").val('finish');\n if ($(\"#site-name\").val() === \"\") {\n alert(bcI18n.message0);\n result = false;\n } else if ($(\"#admin-email\").val() === \"\") {\n alert(bcI18n.message1);\n result = false;\n } else if ($(\"#admin-username\").val() === \"\") {\n alert(bcI18n.message2);\n result = false;\n } else if (!$(\"#admin-username\").val().match(/^[a-zA-Z0-9\\-_]+$/)) {\n alert(bcI18n.message3);\n result = false;\n } else if ($(\"#admin-password\").val().length < 6) {\n alert(bcI18n.message4);\n result = false;\n } else if ($(\"#admin-password\").val() !== $(\"#admin-confirm-password\").val()) {\n alert(bcI18n.message5);\n result = false;\n } else if (!$(\"#admin-password\").val().match(/^[a-zA-Z0-9\\-_ \\.:\\/\\(\\)#,@\\[\\]\\+=&;\\{\\}!\\$\\*]+$/)) {\n alert(bcI18n.message6);\n result = false;\n }\n } else if (this.id === 'BtnBack') {\n $(\"#mode\").val('back');\n }\n\n if (result) {\n $('#AdminSettingForm').submit();\n } else {\n $.bcUtil.hideLoader();\n return false;\n }\n\n });\n});\n"],"names":["$","focus","click","bcUtil","showLoader","result","this","id","val","alert","bcI18n","message0","message1","message2","match","length","message4","message5","message6","message3","hideLoader","submit"],"sourceRoot":""}
\ No newline at end of file
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
index 2d651cb74f..1f3be71b2f 100644
--- a/tests/bootstrap.php
+++ b/tests/bootstrap.php
@@ -72,4 +72,5 @@
['plugin' => 'BcBlog'],
['plugin' => 'BcSearchIndex'],
['plugin' => 'BcContentLink'],
+ ['plugin' => 'BcInstaller'],
]);
diff --git a/vendor/.gitkeep b/vendor/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/webroot/index.php b/webroot/index.php
index 1937ae6881..df1286158b 100644
--- a/webroot/index.php
+++ b/webroot/index.php
@@ -28,7 +28,12 @@
return false;
}
}
-require dirname(__DIR__) . '/vendor/autoload.php';
+if(file_exists(dirname(__DIR__) . '/vendor/autoload.php')) {
+ require dirname(__DIR__) . '/vendor/autoload.php';
+} else {
+ require dirname(__DIR__) . '/composer_installer.php';
+ return;
+}
use App\Application;
use Cake\Http\Server;