diff --git a/.gitignore b/.gitignore index 133d508a93..d76d4a7675 100644 --- a/.gitignore +++ b/.gitignore @@ -96,11 +96,18 @@ node_modules /webroot/bc_search_index /webroot/bc_spa_sample /webroot/bc_theme_sample +/webroot/bc_installer /webroot/debug_kit # jwt /config/jwt.key /config/jwt.pem /config/setting.php +/config/install.php +# composer +/composer/* +!/composer/.gitkeep +# vendor +!/vendor/.gitkeep # etc LOCAL_TODO.md LOCAL_Q&A.md diff --git a/composer.json b/composer.json index 07f362584e..26a80be312 100755 --- a/composer.json +++ b/composer.json @@ -14,7 +14,8 @@ "firebase/php-jwt": "6.1.0", "imo-tikuwa/cakephp-soft-delete": "^2.0", "josegonzalez/dotenv": "^3.2", - "mobiledetect/mobiledetectlib": "^2.8" + "mobiledetect/mobiledetectlib": "^2.8", + "ext-pdo": "*" }, "require-dev": { "cakephp/bake": "^2.6", @@ -42,7 +43,6 @@ "BcInstaller\\": "plugins/bc-installer/src/", "BcMail\\": "plugins/bc-mail/src/", "BcSearchIndex\\": "plugins/bc-search-index/src/", - "BcContentLink\\": "plugins/bc-content-link/src/", "BcSpaSample\\": "plugins/BcSpaSample/src/", "BcThemeConfig\\": "plugins/bc-theme-config/src/", "BcThemeFile\\": "plugins/bc-theme-file/src/", @@ -61,7 +61,6 @@ "BcInstaller\\Test\\": "plugins/bc-installer/tests/", "BcMail\\Test\\": "plugins/bc-mail/tests/", "BcSearchIndex\\Test\\": "plugins/bc-search-index/tests/", - "BcContentLink\\Test\\": "plugins/bc-content-link/tests/", "BcThemeConfig\\Test\\": "plugins/bc-theme-config/tests/", "BcThemeFile\\Test\\": "plugins/bc-theme-file/tests/", "BcUploader\\Test\\": "plugins/bc-uploader/tests/", @@ -78,7 +77,6 @@ "baserproject/bc-front": "self.version", "baserproject/bc-installer": "self.version", "baserproject/bc-search-index": "self.version", - "baserproject/bc-content-link": "self.version", "baserproject/bc-theme-config": "self.version", "baserproject/bc-theme-file": "self.version", "baserproject/bc-widget-area": "self.version" diff --git a/composer.lock b/composer.lock index 06d794787b..298d5b1a5c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "945eadc7b5ec08b6ff1a5418b7657321", + "content-hash": "c3009858fb9b754d0bcfc029a001c80c", "packages": [ { "name": "cakephp/authentication", @@ -180,16 +180,16 @@ }, { "name": "cakephp/chronos", - "version": "2.3.0", + "version": "2.3.2", "source": { "type": "git", "url": "https://github.com/cakephp/chronos.git", - "reference": "3ecd6e7ae191c676570cd1bed51fd561de4606dd" + "reference": "a21b7b633f483c4cf525d200219d200f551ee38b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/chronos/zipball/3ecd6e7ae191c676570cd1bed51fd561de4606dd", - "reference": "3ecd6e7ae191c676570cd1bed51fd561de4606dd", + "url": "https://api.github.com/repos/cakephp/chronos/zipball/a21b7b633f483c4cf525d200219d200f551ee38b", + "reference": "a21b7b633f483c4cf525d200219d200f551ee38b", "shasum": "" }, "require": { @@ -220,41 +220,40 @@ }, { "name": "The CakePHP Team", - "homepage": "http://cakephp.org" + "homepage": "https://cakephp.org" } ], "description": "A simple API extension for DateTime.", - "homepage": "http://cakephp.org", + "homepage": "https://cakephp.org", "keywords": [ "date", "datetime", "time" ], "support": { - "irc": "irc://irc.freenode.org/cakephp", "issues": "https://github.com/cakephp/chronos/issues", "source": "https://github.com/cakephp/chronos" }, - "time": "2021-10-17T02:44:05+00:00" + "time": "2022-11-08T02:17:04+00:00" }, { "name": "cakephp/migrations", - "version": "3.5.2", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/cakephp/migrations.git", - "reference": "e1b03bfef53ce41feabbf2120021ad5187e80289" + "reference": "e1a0a768d6ff572ef5a9aa9024243882f29c96c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/migrations/zipball/e1b03bfef53ce41feabbf2120021ad5187e80289", - "reference": "e1b03bfef53ce41feabbf2120021ad5187e80289", + "url": "https://api.github.com/repos/cakephp/migrations/zipball/e1a0a768d6ff572ef5a9aa9024243882f29c96c9", + "reference": "e1a0a768d6ff572ef5a9aa9024243882f29c96c9", "shasum": "" }, "require": { "cakephp/cache": "^4.3.0", "cakephp/orm": "^4.3.0", - "php": ">=7.2.0", + "php": ">=7.4.0", "robmorgan/phinx": "^0.12" }, "require-dev": { @@ -295,7 +294,7 @@ "issues": "https://github.com/cakephp/migrations/issues", "source": "https://github.com/cakephp/migrations" }, - "time": "2022-05-10T15:01:58+00:00" + "time": "2022-10-14T05:38:58+00:00" }, { "name": "cakephp/plugin-installer", @@ -348,16 +347,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.3.3", + "version": "1.3.4", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c" + "reference": "69098eca243998b53eed7a48d82dedd28b447cd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/30897edbfb15e784fe55587b4f73ceefd3c4d98c", - "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/69098eca243998b53eed7a48d82dedd28b447cd5", + "reference": "69098eca243998b53eed7a48d82dedd28b447cd5", "shasum": "" }, "require": { @@ -404,7 +403,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.3" + "source": "https://github.com/composer/ca-bundle/tree/1.3.4" }, "funding": [ { @@ -420,7 +419,7 @@ "type": "tidelift" } ], - "time": "2022-07-20T07:14:26+00:00" + "time": "2022-10-12T12:08:29+00:00" }, { "name": "doctrine/annotations", @@ -736,20 +735,20 @@ }, { "name": "laminas/laminas-diactoros", - "version": "2.15.0", + "version": "2.21.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-diactoros.git", - "reference": "de9cd9cd56f51d24bd6eeaf9012ac04b2be4d587" + "reference": "e5b6419fea007b8b4a71034edc8ec96c88d4c57d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/de9cd9cd56f51d24bd6eeaf9012ac04b2be4d587", - "reference": "de9cd9cd56f51d24bd6eeaf9012ac04b2be4d587", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/e5b6419fea007b8b4a71034edc8ec96c88d4c57d", + "reference": "e5b6419fea007b8b4a71034edc8ec96c88d4c57d", "shasum": "" }, "require": { - "php": "^7.4 || ~8.0.0 || ~8.1.0", + "php": "~8.0.0 || ~8.1.0 || ~8.2.0", "psr/http-factory": "^1.0", "psr/http-message": "^1.0" }, @@ -768,9 +767,9 @@ "http-interop/http-factory-tests": "^0.9.0", "laminas/laminas-coding-standard": "^2.4.0", "php-http/psr7-integration-tests": "^1.1.1", - "phpunit/phpunit": "^9.5.23", - "psalm/plugin-phpunit": "^0.17.0", - "vimeo/psalm": "^4.24.0" + "phpunit/phpunit": "^9.5.26", + "psalm/plugin-phpunit": "^0.18.0", + "vimeo/psalm": "^4.29.0" }, "type": "library", "extra": { @@ -829,7 +828,7 @@ "type": "community_bridge" } ], - "time": "2022-08-25T00:08:18+00:00" + "time": "2022-11-11T09:01:24+00:00" }, { "name": "laminas/laminas-httphandlerrunner", @@ -1110,16 +1109,16 @@ }, { "name": "mobiledetect/mobiledetectlib", - "version": "2.8.39", + "version": "2.8.41", "source": { "type": "git", "url": "https://github.com/serbanghita/Mobile-Detect.git", - "reference": "0fd6753003fc870f6e229bae869cc1337c99bc45" + "reference": "fc9cccd4d3706d5a7537b562b59cc18f9e4c0cb1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/0fd6753003fc870f6e229bae869cc1337c99bc45", - "reference": "0fd6753003fc870f6e229bae869cc1337c99bc45", + "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/fc9cccd4d3706d5a7537b562b59cc18f9e4c0cb1", + "reference": "fc9cccd4d3706d5a7537b562b59cc18f9e4c0cb1", "shasum": "" }, "require": { @@ -1160,9 +1159,9 @@ ], "support": { "issues": "https://github.com/serbanghita/Mobile-Detect/issues", - "source": "https://github.com/serbanghita/Mobile-Detect/tree/2.8.39" + "source": "https://github.com/serbanghita/Mobile-Detect/tree/2.8.41" }, - "time": "2022-02-17T19:24:25+00:00" + "time": "2022-11-08T18:31:26+00:00" }, { "name": "psr/cache", @@ -1643,16 +1642,16 @@ }, { "name": "robmorgan/phinx", - "version": "0.12.12", + "version": "0.12.13", "source": { "type": "git", "url": "https://github.com/cakephp/phinx.git", - "reference": "9a6ce1e7fdf0fa4e602ba5875b5bc9442ccaa115" + "reference": "6eb0f295e140ed2804d93396755f0ce9ada4ec07" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/phinx/zipball/9a6ce1e7fdf0fa4e602ba5875b5bc9442ccaa115", - "reference": "9a6ce1e7fdf0fa4e602ba5875b5bc9442ccaa115", + "url": "https://api.github.com/repos/cakephp/phinx/zipball/6eb0f295e140ed2804d93396755f0ce9ada4ec07", + "reference": "6eb0f295e140ed2804d93396755f0ce9ada4ec07", "shasum": "" }, "require": { @@ -1723,9 +1722,9 @@ ], "support": { "issues": "https://github.com/cakephp/phinx/issues", - "source": "https://github.com/cakephp/phinx/tree/0.12.12" + "source": "https://github.com/cakephp/phinx/tree/0.12.13" }, - "time": "2022-07-09T18:53:51+00:00" + "time": "2022-10-03T04:57:40+00:00" }, { "name": "symfony/config", @@ -1806,16 +1805,16 @@ }, { "name": "symfony/console", - "version": "v6.1.3", + "version": "v6.1.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "43fcb5c5966b43c56bcfa481368d90d748936ab8" + "reference": "a1282bd0c096e0bdb8800b104177e2ce404d8815" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/43fcb5c5966b43c56bcfa481368d90d748936ab8", - "reference": "43fcb5c5966b43c56bcfa481368d90d748936ab8", + "url": "https://api.github.com/repos/symfony/console/zipball/a1282bd0c096e0bdb8800b104177e2ce404d8815", + "reference": "a1282bd0c096e0bdb8800b104177e2ce404d8815", "shasum": "" }, "require": { @@ -1882,7 +1881,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.1.3" + "source": "https://github.com/symfony/console/tree/v6.1.7" }, "funding": [ { @@ -1898,7 +1897,7 @@ "type": "tidelift" } ], - "time": "2022-07-22T14:17:57+00:00" + "time": "2022-10-26T21:42:49+00:00" }, { "name": "symfony/deprecation-contracts", @@ -1969,16 +1968,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.1.3", + "version": "v6.1.5", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "c780e677cddda78417fa5187a7c6cd2f21110db9" + "reference": "4d216a2beef096edf040a070117c39ca2abce307" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/c780e677cddda78417fa5187a7c6cd2f21110db9", - "reference": "c780e677cddda78417fa5187a7c6cd2f21110db9", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/4d216a2beef096edf040a070117c39ca2abce307", + "reference": "4d216a2beef096edf040a070117c39ca2abce307", "shasum": "" }, "require": { @@ -2012,7 +2011,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.1.3" + "source": "https://github.com/symfony/filesystem/tree/v6.1.5" }, "funding": [ { @@ -2028,20 +2027,20 @@ "type": "tidelift" } ], - "time": "2022-07-20T14:45:06+00:00" + "time": "2022-09-21T20:29:40+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", "shasum": "" }, "require": { @@ -2056,7 +2055,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2094,7 +2093,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" }, "funding": [ { @@ -2110,20 +2109,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "433d05519ce6990bf3530fba6957499d327395c2" + "reference": "511a08c03c1960e08a883f4cffcacd219b758354" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", - "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", "shasum": "" }, "require": { @@ -2135,7 +2134,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2175,7 +2174,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" }, "funding": [ { @@ -2191,20 +2190,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", "shasum": "" }, "require": { @@ -2216,7 +2215,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2259,7 +2258,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" }, "funding": [ { @@ -2275,20 +2274,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", "shasum": "" }, "require": { @@ -2303,7 +2302,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2342,7 +2341,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" }, "funding": [ { @@ -2358,7 +2357,7 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/service-contracts", @@ -2447,16 +2446,16 @@ }, { "name": "symfony/string", - "version": "v6.1.3", + "version": "v6.1.7", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "f35241f45c30bcd9046af2bb200a7086f70e1d6b" + "reference": "823f143370880efcbdfa2dbca946b3358c4707e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/f35241f45c30bcd9046af2bb200a7086f70e1d6b", - "reference": "f35241f45c30bcd9046af2bb200a7086f70e1d6b", + "url": "https://api.github.com/repos/symfony/string/zipball/823f143370880efcbdfa2dbca946b3358c4707e5", + "reference": "823f143370880efcbdfa2dbca946b3358c4707e5", "shasum": "" }, "require": { @@ -2512,7 +2511,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.1.3" + "source": "https://github.com/symfony/string/tree/v6.1.7" }, "funding": [ { @@ -2528,7 +2527,7 @@ "type": "tidelift" } ], - "time": "2022-07-27T15:50:51+00:00" + "time": "2022-10-10T09:34:31+00:00" } ], "packages-dev": [ @@ -2583,22 +2582,23 @@ }, { "name": "cakephp/bake", - "version": "2.7.1", + "version": "2.8.2", "source": { "type": "git", "url": "https://github.com/cakephp/bake.git", - "reference": "808608b039088f7276b7128c1880ce6a915810b5" + "reference": "ef021497ab517c33ecd97d2184200d8990ffc0ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/bake/zipball/808608b039088f7276b7128c1880ce6a915810b5", - "reference": "808608b039088f7276b7128c1880ce6a915810b5", + "url": "https://api.github.com/repos/cakephp/bake/zipball/ef021497ab517c33ecd97d2184200d8990ffc0ab", + "reference": "ef021497ab517c33ecd97d2184200d8990ffc0ab", "shasum": "" }, "require": { "brick/varexporter": "^0.3.5", "cakephp/cakephp": "^4.3.0", "cakephp/twig-view": "^1.0.2", + "nikic/php-parser": "^4.13.2", "php": ">=7.2" }, "require-dev": { @@ -2635,7 +2635,7 @@ "issues": "https://github.com/cakephp/bake/issues", "source": "https://github.com/cakephp/bake" }, - "time": "2022-07-22T05:28:18+00:00" + "time": "2022-10-05T18:45:20+00:00" }, { "name": "cakephp/debug_kit", @@ -2841,16 +2841,16 @@ }, { "name": "composer/composer", - "version": "2.4.1", + "version": "2.4.4", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "777d542e3af65f8e7a66a4d98ce7a697da339414" + "reference": "e8d9087229bcdbc5867594d3098091412f1130cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/777d542e3af65f8e7a66a4d98ce7a697da339414", - "reference": "777d542e3af65f8e7a66a4d98ce7a697da339414", + "url": "https://api.github.com/repos/composer/composer/zipball/e8d9087229bcdbc5867594d3098091412f1130cf", + "reference": "e8d9087229bcdbc5867594d3098091412f1130cf", "shasum": "" }, "require": { @@ -2880,7 +2880,7 @@ "phpstan/phpstan-deprecation-rules": "^1", "phpstan/phpstan-phpunit": "^1.0", "phpstan/phpstan-strict-rules": "^1", - "phpstan/phpstan-symfony": "^1.1", + "phpstan/phpstan-symfony": "^1.2.10", "symfony/phpunit-bridge": "^6.0" }, "suggest": { @@ -2933,7 +2933,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.4.1" + "source": "https://github.com/composer/composer/tree/2.4.4" }, "funding": [ { @@ -2949,7 +2949,7 @@ "type": "tidelift" } ], - "time": "2022-08-20T09:44:50+00:00" + "time": "2022-10-27T12:39:29+00:00" }, { "name": "composer/metadata-minifier", @@ -3022,16 +3022,16 @@ }, { "name": "composer/pcre", - "version": "3.0.0", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" + "reference": "4482b6409ca6bfc2af043a5711cd21ac3e7a8dfb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "url": "https://api.github.com/repos/composer/pcre/zipball/4482b6409ca6bfc2af043a5711cd21ac3e7a8dfb", + "reference": "4482b6409ca6bfc2af043a5711cd21ac3e7a8dfb", "shasum": "" }, "require": { @@ -3073,7 +3073,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.0.0" + "source": "https://github.com/composer/pcre/tree/3.0.2" }, "funding": [ { @@ -3089,7 +3089,7 @@ "type": "tidelift" } ], - "time": "2022-02-25T20:21:48+00:00" + "time": "2022-11-03T20:24:16+00:00" }, { "name": "composer/semver", @@ -3704,16 +3704,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.14.0", + "version": "v4.15.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" + "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", + "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", "shasum": "" }, "require": { @@ -3754,9 +3754,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.2" }, - "time": "2022-05-31T20:59:12+00:00" + "time": "2022-11-12T15:38:23+00:00" }, { "name": "phar-io/manifest", @@ -3871,16 +3871,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.16", + "version": "9.2.18", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "2593003befdcc10db5e213f9f28814f5aa8ac073" + "reference": "12fddc491826940cf9b7e88ad9664cf51f0f6d0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2593003befdcc10db5e213f9f28814f5aa8ac073", - "reference": "2593003befdcc10db5e213f9f28814f5aa8ac073", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/12fddc491826940cf9b7e88ad9664cf51f0f6d0a", + "reference": "12fddc491826940cf9b7e88ad9664cf51f0f6d0a", "shasum": "" }, "require": { @@ -3936,7 +3936,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.16" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.18" }, "funding": [ { @@ -3944,7 +3944,7 @@ "type": "github" } ], - "time": "2022-08-20T05:26:47+00:00" + "time": "2022-10-27T13:35:33+00:00" }, { "name": "phpunit/php-file-iterator", @@ -4189,16 +4189,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.23", + "version": "9.5.26", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "888556852e7e9bbeeedb9656afe46118765ade34" + "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/888556852e7e9bbeeedb9656afe46118765ade34", - "reference": "888556852e7e9bbeeedb9656afe46118765ade34", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/851867efcbb6a1b992ec515c71cdcf20d895e9d2", + "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2", "shasum": "" }, "require": { @@ -4220,14 +4220,14 @@ "phpunit/php-timer": "^5.0.2", "sebastian/cli-parser": "^1.0.1", "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.5", + "sebastian/comparator": "^4.0.8", "sebastian/diff": "^4.0.3", "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.3", + "sebastian/exporter": "^4.0.5", "sebastian/global-state": "^5.0.1", "sebastian/object-enumerator": "^4.0.3", "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.0", + "sebastian/type": "^3.2", "sebastian/version": "^3.0.2" }, "suggest": { @@ -4271,7 +4271,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.23" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.26" }, "funding": [ { @@ -4281,9 +4281,13 @@ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" } ], - "time": "2022-08-22T14:01:36+00:00" + "time": "2022-10-28T06:00:21+00:00" }, { "name": "react/promise", @@ -4530,16 +4534,16 @@ }, { "name": "sebastian/comparator", - "version": "4.0.6", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382" + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", "shasum": "" }, "require": { @@ -4592,7 +4596,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" }, "funding": [ { @@ -4600,7 +4604,7 @@ "type": "github" } ], - "time": "2020-10-26T15:49:45+00:00" + "time": "2022-09-14T12:41:17+00:00" }, { "name": "sebastian/complexity", @@ -4790,16 +4794,16 @@ }, { "name": "sebastian/exporter", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", "shasum": "" }, "require": { @@ -4855,7 +4859,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" }, "funding": [ { @@ -4863,7 +4867,7 @@ "type": "github" } ], - "time": "2021-11-11T14:18:36+00:00" + "time": "2022-09-14T06:03:37+00:00" }, { "name": "sebastian/global-state", @@ -5218,16 +5222,16 @@ }, { "name": "sebastian/type", - "version": "3.0.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad" + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", - "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", "shasum": "" }, "require": { @@ -5239,7 +5243,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -5262,7 +5266,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.0.0" + "source": "https://github.com/sebastianbergmann/type/tree/3.2.0" }, "funding": [ { @@ -5270,7 +5274,7 @@ "type": "github" } ], - "time": "2022-03-15T09:54:48+00:00" + "time": "2022-09-12T14:47:03+00:00" }, { "name": "sebastian/version", @@ -5391,16 +5395,16 @@ }, { "name": "seld/phar-utils", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "9f3452c93ff423469c0d56450431562ca423dcee" + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/9f3452c93ff423469c0d56450431562ca423dcee", - "reference": "9f3452c93ff423469c0d56450431562ca423dcee", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", "shasum": "" }, "require": { @@ -5433,9 +5437,9 @@ ], "support": { "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.2.0" + "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" }, - "time": "2021-12-10T11:20:11+00:00" + "time": "2022-08-31T10:31:18+00:00" }, { "name": "seld/signal-handler", @@ -5564,16 +5568,16 @@ }, { "name": "symfony/polyfill-php73", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", "shasum": "" }, "require": { @@ -5582,7 +5586,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5623,7 +5627,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" }, "funding": [ { @@ -5639,20 +5643,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", "shasum": "" }, "require": { @@ -5661,7 +5665,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5706,7 +5710,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" }, "funding": [ { @@ -5722,7 +5726,7 @@ "type": "tidelift" } ], - "time": "2022-05-10T07:21:04+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/process", @@ -6156,7 +6160,8 @@ "prefer-lowest": false, "platform": { "php": ">=8.1", - "ext-json": "*" + "ext-json": "*", + "ext-pdo": "*" }, "platform-dev": [], "plugin-api-version": "2.3.0" diff --git a/composer/.gitkeep b/composer/.gitkeep new file mode 100755 index 0000000000..e69de29bb2 diff --git a/composer_installer.php b/composer_installer.php new file mode 100644 index 0000000000..1ffe358e3a --- /dev/null +++ b/composer_installer.php @@ -0,0 +1,338 @@ + + * 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 + */ + +/** + * composer のインストーラー + * + * - composer をインストール + * - composer self-update を実行 + * - composer install を実行 + * + * ブラウザでアクセスした際、/vendor/autoload.php が存在しない場合に /webroot/index.php より呼び出される。 + * ロゴと jQuery 以外は、このファイルだけで完結させる。 + */ +define('DS', DIRECTORY_SEPARATOR); +define('ROOT_DIR', __DIR__ . DS); +$url = $_SERVER['REQUEST_URI']; +if (preg_match('/\/logo\.png$/', $url)) { + header('Content-Type: image/png; charset=utf-8'); + echo file_get_contents(ROOT_DIR . 'plugins' . DS . 'bc-admin-third' . DS . 'webroot' . DS . 'img' . DS . 'admin' . DS . 'logo_large.png'); + return; +} elseif (preg_match('/\/install_composer$/', $url) && $_SERVER['REQUEST_METHOD'] === 'POST') { + try { + command(); + echo json_encode([ + 'result' => true, + ]); + } catch (Exception $e) { + echo json_encode([ + 'result' => false, + 'error' => $e->getMessage() + ]); + } + return; +} elseif (!preg_match('/\/$/', $url)) { + return; +} +function command() +{ + if (!is_writable(ROOT_DIR . 'composer')) { + throw new Exception('/composer に書き込み権限がありません。書き込み権限を与えてください。'); + } + if (!is_writable(ROOT_DIR . 'vendor')) { + throw new Exception('/vendor に書き込み権限がありません。書き込み権限を与えてください。'); + } + $composerDir = ROOT_DIR . 'composer' . DS; + $command = "cd {$composerDir}; export HOME={$composerDir}; curl -sS https://getcomposer.org/installer | php"; + exec($command, $out, $code); + if ($code !== 0) throw new Exception('composer のインストールに失敗しました。'); + $command = "cd " . ROOT_DIR . "; export HOME={$composerDir} ; {$composerDir}composer.phar self-update"; + exec($command, $out, $code); + if ($code !== 0) throw new Exception('composer のアップデートに失敗しました。'); + $command = "cd " . ROOT_DIR . "; export HOME={$composerDir} ; {$composerDir}composer.phar install"; + exec($command, $out, $code); + if ($code !== 0) throw new Exception('ライブラリのインストールに失敗しました。'); +} + +?> + + + + + + baserCMSのインストール + + + + + + + +
+ +
+
+
+
+ +
+ + +
+
+
+ + +
+ + + diff --git a/config/app_local.example.php b/config/app_local.example.php index 543db95297..5485750693 100644 --- a/config/app_local.example.php +++ b/config/app_local.example.php @@ -40,7 +40,7 @@ */ 'Datasources' => [ 'default' => [ - 'host' => 'bc5-db', + 'host' => '', /* * CakePHP will use the default DB port based on the driver selected * MySQL on MAMP uses port 8889, MAMP users will want to uncomment @@ -48,9 +48,9 @@ */ //'port' => 'non_standard_port_number', - 'username' => 'root', - 'password' => 'root', - 'database' => 'basercms', + 'username' => '', + 'password' => '', + 'database' => '', /* * If not using the default 'public' schema with the PostgreSQL driver * set it here. @@ -68,11 +68,11 @@ * The test connection is used during the test suite. */ 'test' => [ - 'host' => 'bc5-db', + 'host' => '', //'port' => 'non_standard_port_number', - 'username' => 'root', - 'password' => 'root', - 'database' => 'test_basercms', + 'username' => '', + 'password' => '', + 'database' => '', //'schema' => 'myapp', 'url' => env('DATABASE_TEST_URL', null), ], diff --git a/config/bootstrap.php b/config/bootstrap.php index 2e3b450f79..7b0b8c3cda 100644 --- a/config/bootstrap.php +++ b/config/bootstrap.php @@ -157,7 +157,6 @@ unset($fullBaseUrl); Cache::setConfig(Configure::consume('Cache')); -ConnectionManager::setConfig(Configure::consume('Datasources')); TransportFactory::setConfig(Configure::consume('EmailTransport')); Mailer::setConfig(Configure::consume('Email')); Log::setConfig(Configure::consume('Log')); @@ -213,3 +212,8 @@ //Inflector::rules('irregular', ['red' => 'redlings']); //Inflector::rules('uninflected', ['dontinflectme']); //Inflector::rules('transliteration', ['/å/' => 'aa']); + +if(file_exists(CONFIG . 'install.php')) { + Configure::load('install'); + ConnectionManager::setConfig(Configure::consume('Datasources')); +} diff --git a/config/routes.php b/config/routes.php index 00dbfdbc08..06df3f5036 100644 --- a/config/routes.php +++ b/config/routes.php @@ -45,18 +45,6 @@ $routes->setRouteClass(DashedRoute::class); $routes->scope('/', function (RouteBuilder $builder) { - /* - * Here, we are connecting '/' (base path) to a controller called 'Pages', - * its action called 'display', and we pass a param to select the view file - * to use (in this case, templates/Pages/home.php)... - */ - $builder->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']); - - /* - * ...and connect the rest of 'Pages' controller's URLs. - */ - $builder->connect('/pages/*', 'Pages::display'); - /* * Connect catchall routes for all controllers. * diff --git a/config/test_install.php b/config/test_install.php new file mode 100644 index 0000000000..b859cdc8b4 --- /dev/null +++ b/config/test_install.php @@ -0,0 +1,42 @@ + + * 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 + */ +/** + * ユニットテスト用のインストール設定ファイル + */ +return [ + 'Security.salt' => '0AjCJRJdl3i3caMm5WKDWSLUDXJZQhDSMEmQQF78', + 'Datasources.default' => [ + 'className' => 'Cake\\Database\\Connection', + 'driver' => 'Cake\\Database\\Driver\\Mysql', + 'host' => 'bc5-db', + 'port' => '3306', + 'username' => 'root', + 'password' => 'root', + 'database' => 'basercms', + 'prefix' => 'mysite_', + 'schema' => '', + 'encoding' => 'utf8', + 'persistent' => '', + ], + 'Datasources.test' => [ + 'className' => 'Cake\\Database\\Connection', + 'driver' => 'Cake\\Database\\Driver\\Mysql', + 'host' => 'bc5-db', + 'port' => '3306', + 'username' => 'root', + 'password' => 'root', + 'database' => 'test_basercms', + 'prefix' => 'mysite_', + 'schema' => '', + 'encoding' => 'utf8', + 'persistent' => '', + ], +]; diff --git a/docker/init.sh b/docker/init.sh index 662f1718a0..0c44c7c28d 100755 --- a/docker/init.sh +++ b/docker/init.sh @@ -35,6 +35,9 @@ if [ ! -e '/var/www/html/docker_inited' ]; then chmod -R 777 /var/www/html/logs chmod 777 /var/www/html/plugins + # Setup install setting + cp /var/www/html/config/test_install.php /var/www/html/config/install.php + # Migrations echo "[$(date +"%Y/%m/%d %H:%M:%S")] Migration start." TIMES=0 diff --git a/package-lock.json b/package-lock.json index 61bcd089e9..a6879a39db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2704,6 +2704,10 @@ "resolved": "plugins/bc-front", "link": true }, + "node_modules/bc-installer": { + "resolved": "plugins/bc-installer", + "link": true + }, "node_modules/bc-mail": { "resolved": "plugins/bc-mail", "link": true @@ -11273,6 +11277,21 @@ "sass": "^1.51.0" } }, + "plugins/bc-installer": { + "version": "1.0.0", + "license": "MIT", + "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" + } + }, "plugins/bc-mail": { "version": "1.0.0", "license": "MIT", @@ -14184,6 +14203,20 @@ "sass": "^1.51.0" } }, + "bc-installer": { + "version": "file:plugins/bc-installer", + "requires": { + "@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" + } + }, "bc-mail": { "version": "file:plugins/bc-mail", "requires": { diff --git a/phpunit.xml.dist b/phpunit.xml.dist index e54037d04a..43d2f698c0 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -21,6 +21,9 @@ plugins/bc-content-link/tests/TestCase + + plugins/bc-installer/tests/TestCase + diff --git a/plugins/baser-core/config/bootstrap.php b/plugins/baser-core/config/bootstrap.php index d2ef11101a..d234d69b50 100644 --- a/plugins/baser-core/config/bootstrap.php +++ b/plugins/baser-core/config/bootstrap.php @@ -51,12 +51,6 @@ // require BASER . DS . 'src' . DS . 'basics.php'; // <<< -// TODO ucmitz dockerに依存しているため、インストーラー実装後に見直し -// ユニットテストの setUp() で状態を書き換える事ができるようにするため、config/setting.php にはキーは記述しないようにする。 -if(is_null(Configure::read('BcRequest.isInstalled'))) { - Configure::write('BcRequest.isInstalled', file_exists(ROOT . DS . 'docker_inited')); -} - /** * 文字コードの検出順を指定 */ @@ -64,12 +58,6 @@ mb_detect_order(Configure::read('BcEncode.detectOrder')); } -/** - * コンソール判定 - * BcUtil::isConsole で利用 - */ -$_ENV['IS_CONSOLE'] = (substr(php_sapi_name(), 0, 3) === 'cli'); - /** * fullBaseUrl * コンソールの場合、CakePHP の ShellDispatcher において、 diff --git a/plugins/baser-core/config/setting-4.php b/plugins/baser-core/config/setting-4.php index d3e5a544e1..76ca9412b0 100755 --- a/plugins/baser-core/config/setting-4.php +++ b/plugins/baser-core/config/setting-4.php @@ -13,8 +13,6 @@ * アプリケーション基本設定 */ $config['BcApp'] = [ - // デフォルトタイトル設定(インストールの際のエラー時等DB接続まえのエラーで利用) - 'title' => __d('baser', 'baserCMS'), // 初期テーマ 'defaultTheme' => 'bc_sample', // 管理システムテーマ(キャメルケース) @@ -172,17 +170,6 @@ 'systemMessageLangFromSiteSetting' => false ]; -/** - * システム要件 - */ -$config['BcRequire'] = [ - 'phpVersion' => "5.4.0", - 'phpMemory' => "128", - 'MySQLVersion' => "5.0.0", - 'winSQLiteVersion' => "3.7.16", - 'PostgreSQLVersion' => "8.4.0" -]; - /** * 認証プレフィックス設定 * ※ CSVは非対応 diff --git a/plugins/baser-core/config/setting.php b/plugins/baser-core/config/setting.php index cd2e077ffd..38f5865229 100644 --- a/plugins/baser-core/config/setting.php +++ b/plugins/baser-core/config/setting.php @@ -52,6 +52,8 @@ 'host' => (isset($_SERVER['HTTP_HOST']))? $_SERVER['HTTP_HOST'] : null ], 'BcApp' => [ + // デフォルトタイトル設定(インストールの際のエラー時等DB接続まえのエラーで利用) + 'title' => __d('baser', 'baserCMS'), /** * baserコアのプレフィックス * URLの先頭に付与 @@ -333,9 +335,11 @@ 'marketPluginRss' => 'https://market.basercms.net/plugins.php', 'specialThanks' => 'https://basercms.net/special_thanks/special_thanks/ajax_users', // インストールマニュアル - 'installManual' => 'http://wiki.basercms.net/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89', + // TODO ucmitz リンク先を準備した上で変更要 + 'installManual' => 'https://wiki.basercms.net/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89', // アップデートマニュアル - 'updateManual' => 'http://wiki.basercms.net/%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97%E3%82%AC%E3%82%A4%E3%83%89' + // TODO ucmitz リンク先を準備した上で変更要 + 'updateManual' => 'https://wiki.basercms.net/%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97%E3%82%AC%E3%82%A4%E3%83%89' ], /** diff --git a/plugins/baser-core/src/BcPlugin.php b/plugins/baser-core/src/BcPlugin.php index d60dfb8923..fb8d8301bb 100644 --- a/plugins/baser-core/src/BcPlugin.php +++ b/plugins/baser-core/src/BcPlugin.php @@ -419,21 +419,6 @@ public function routes($routes): void $plugin = $this->getName(); - /** - * コンテンツ管理ルーティング - * リバースルーティングのために必要 - */ - $routes->plugin( - $plugin, - ['path' => '/'], - function(RouteBuilder $routes) { - $routes->setRouteClass('BaserCore.BcContentsRoute'); - $routes->connect('/', []); - $routes->connect('/{controller}/index', []); - $routes->connect('/:controller/:action/*', []); - } - ); - /** * プラグインの管理画面用ルーティング * プラグイン名がダッシュ区切りの場合 @@ -457,6 +442,46 @@ function(RouteBuilder $routes) { ); } + /** + * APIのプラグイン用ルーティング + * プラグイン名がダッシュ区切りの場合 + */ + $routes->prefix( + 'Api', + ['path' => '/' . BcUtil::getBaserCorePrefix() . '/api'], + function(RouteBuilder $routes) use ($plugin) { + $routes->plugin( + $plugin, + ['path' => '/' . Inflector::dasherize($plugin)], + function(RouteBuilder $routes) { + $routes->setExtensions(['json']); + $routes->connect('/{controller}/index', [], ['routeClass' => InflectedRoute::class]); + $routes->fallbacks(InflectedRoute::class); + } + ); + } + ); + + if (!BcUtil::isInstalled()) { + parent::routes($routes); + return; + } + + /** + * コンテンツ管理ルーティング + * リバースルーティングのために必要 + */ + $routes->plugin( + $plugin, + ['path' => '/'], + function(RouteBuilder $routes) { + $routes->setRouteClass('BaserCore.BcContentsRoute'); + $routes->connect('/', []); + $routes->connect('/{controller}/index', []); + $routes->connect('/:controller/:action/*', []); + } + ); + /** * プラグインのフロントエンド用ルーティング * プラグイン名がダッシュ区切りの場合 @@ -496,26 +521,6 @@ function(RouteBuilder $routes) use ($site){ ); } - /** - * APIのプラグイン用ルーティング - * プラグイン名がダッシュ区切りの場合 - */ - $routes->prefix( - 'Api', - ['path' => '/' . BcUtil::getBaserCorePrefix() . '/api'], - function(RouteBuilder $routes) use ($plugin) { - $routes->plugin( - $plugin, - ['path' => '/' . Inflector::dasherize($plugin)], - function(RouteBuilder $routes) { - $routes->setExtensions(['json']); - $routes->connect('/{controller}/index', [], ['routeClass' => InflectedRoute::class]); - $routes->fallbacks(InflectedRoute::class); - } - ); - } - ); - parent::routes($routes); } diff --git a/plugins/baser-core/src/Controller/Admin/BcAdminAppController.php b/plugins/baser-core/src/Controller/Admin/BcAdminAppController.php index 97d64f08f7..2cc6acbf0b 100644 --- a/plugins/baser-core/src/Controller/Admin/BcAdminAppController.php +++ b/plugins/baser-core/src/Controller/Admin/BcAdminAppController.php @@ -51,6 +51,8 @@ public function initialize(): void { parent::initialize(); + if(!BcUtil::isInstalled()) return; + $this->loadComponent('Authentication.Authentication', [ 'logoutRedirect' => Router::url(Configure::read('BcPrefixAuth.Admin.loginAction'), true), ]); @@ -83,6 +85,9 @@ public function initialize(): void public function beforeFilter(EventInterface $event) { parent::beforeFilter($event); + + if(!BcUtil::isInstalled()) return; + $user = BcUtil::loginUser(); /* @var PermissionsServiceInterface $permission */ $permission = $this->getService(PermissionsServiceInterface::class); diff --git a/plugins/baser-core/src/Controller/Admin/UsersController.php b/plugins/baser-core/src/Controller/Admin/UsersController.php index a72447d9ef..c92d4b935c 100644 --- a/plugins/baser-core/src/Controller/Admin/UsersController.php +++ b/plugins/baser-core/src/Controller/Admin/UsersController.php @@ -13,7 +13,6 @@ use BaserCore\Model\Entity\User; use BaserCore\Service\Admin\UsersAdminServiceInterface; -use BaserCore\Service\SiteConfigsServiceInterface; use BaserCore\Service\UsersService; use BaserCore\Service\UsersServiceInterface; use BaserCore\Utility\BcSiteConfig; diff --git a/plugins/baser-core/src/Controller/AppController.php b/plugins/baser-core/src/Controller/AppController.php index f58263256a..59d5f0b8c3 100644 --- a/plugins/baser-core/src/Controller/AppController.php +++ b/plugins/baser-core/src/Controller/AppController.php @@ -71,15 +71,29 @@ public function __construct( { parent::__construct($request, $response, $name, $eventManager, $components); - $isInstall = $request ? $request->is('install') : false; + $request->getSession()->start(); // インストールされていない場合、トップページにリダイレクトする - // コンソールベースのインストールの際のページテンプレート生成において、 - // BC_INSTALLED、$isInstall ともに true でない為、コンソールの場合は無視する - if (!(BcUtil::isInstalled() || BcUtil::isConsole()) && !$isInstall) { - $this->redirect('/'); + // コンソールの場合は無視する + if (!(BcUtil::isInstalled() || BcUtil::isConsole())) { + if (!($request? $request->is('install') : false)) { + return $this->redirect('/'); + } else { + // インストーラーの最初のステップでログイン状態を解除 + if ($request->getParam('action') === 'index') { + $sessionKey = Configure::read('BcPrefixAuth.Admin.sessionKey'); + if ($request->getSession()->check($sessionKey)) { + $request->getSession()->delete($sessionKey); + // 2022/11/16 by ryuring + // $this->redirect() を利用した場合、なぜか、リダイレクト後にセッションが復活してしまう。 + // header() に切り替えるとうまくいった。 + header('Location: ' . $request->getAttribute('base') . '/'); + exit(); + } + } + } } - $request->getSession()->start(); + } /** @@ -218,7 +232,7 @@ protected function _autoConvertEncodingByArray($data, $outenc = 'UTF-8'): array $data[$key] = $this->_autoConvertEncodingByArray($value, $outenc); continue; } - $inenc = mb_detect_encoding((string) $value); + $inenc = mb_detect_encoding((string)$value); if ($value && $inenc !== $outenc) { // 半角カナは一旦全角に変換する $value = mb_convert_kana($value, 'KV', $inenc); @@ -271,24 +285,13 @@ public function setTitle($title): void */ public function redirectIfIsRequireMaintenance() { - if ($this->request->is('ajax')) { - return; - } - if (empty(BcSiteConfig::get('maintenance'))) { - return; - } - if (Configure::read('debug')) { - return; - } - if ($this->getRequest()->is('maintenance')) { - return; - } - if ($this->getRequest()->is('admin')) { - return; - } - if (BcUtil::isAdminUser()) { - return; - } + if (!BcUtil::isInstalled()) return; + if ($this->request->is('ajax')) return; + if (empty(BcSiteConfig::get('maintenance'))) return; + if (Configure::read('debug')) return; + if ($this->getRequest()->is('maintenance')) return; + if ($this->getRequest()->is('admin')) return; + if (BcUtil::isAdminUser()) return; // TODO ucmitz 削除検討要 // CakePHP4 から requestAction がなくなっているので不要の可能性が高い @@ -376,7 +379,7 @@ protected function saveViewConditions($targetModel = [], $options = []): void if ($options['post'] && $targetModel) { foreach($targetModel as $model) { - if(count($targetModel) > 1) { + if (count($targetModel) > 1) { $data = $request->getData($model); } else { $data = $request->getData(); @@ -439,7 +442,7 @@ protected function loadViewConditions($targetModel = [], $options = []): void $data = array_merge($data, $session->read("BcApp.viewConditions.{$contentsName}.data.{$model}")); } if ($data) { - if(count($targetModel) > 1) { + if (count($targetModel) > 1) { $this->setRequest($request->withData($model, array_merge($data, $request->getData($model)))); } else { $this->setRequest($request->withParsedBody(array_merge($data, $request->getData()))); diff --git a/plugins/baser-core/src/Controller/Component/BcManagerComponent.php b/plugins/baser-core/src/Controller/Component/BcManagerComponent.php index e9d859c486..0b0721f82f 100644 --- a/plugins/baser-core/src/Controller/Component/BcManagerComponent.php +++ b/plugins/baser-core/src/Controller/Component/BcManagerComponent.php @@ -160,698 +160,6 @@ public function install($siteUrl, $dbConfig, $adminUser = [], $baseUrl = '', $db return $result; } - /** - * コアプラグインをインストールする - * - * TODO 引数となる $dbDataPattern は、BcManager::installPlugin() で利用できる仕様となっていない - * @return bool - */ - public function installCorePlugin($dbConfig, $dbDataPattern) - { - $result = true; - $corePlugins = Configure::read('BcApp.corePlugins'); - $this->connectDb($dbConfig, 'plugin'); - foreach($corePlugins as $corePlugin) { - CakePlugin::load($corePlugin); - if (!$this->installPlugin($corePlugin, $dbDataPattern)) { - $this->log(sprintf(__d('baser', 'コアプラグイン %s のインストールに失敗しました。'), $corePlugin)); - $result = false; - } - } - return $result; - } - - /** - * データベースに接続する - * - * @param array $config - * @return DboSource $db - */ - public function connectDb($config, $name = 'default') - { - - if (!$datasource = $this->getDatasourceName($config['datasource'])) { - return ConnectionManager::getDataSource($name); - } - $result = ConnectionManager::create($name, [ - 'datasource' => $datasource, - 'persistent' => false, - 'host' => $config['host'], - 'port' => $config['port'], - 'login' => $config['login'], - 'password' => $config['password'], - 'database' => $config['database'], - 'schema' => $config['schema'], - 'prefix' => $config['prefix'], - 'encoding' => $config['encoding']]); - if ($result) { - return $result; - } else { - return ConnectionManager::getDataSource($name); - } - } - - /** - * datasource名を取得 - * - * @param string datasource name.postgre.mysql.etc. - * @return string - */ - public function getDatasourceName($datasource = null) - { - $name = $datasource; - switch($datasource) { - case 'postgres' : - $name = 'Database/BcPostgres'; - break; - case 'mysql' : - $name = 'Database/BcMysql'; - break; - case 'sqlite' : - $name = 'Database/BcSqlite'; - break; - case 'csv' : - $name = 'Database/BcCsv'; - break; - default : - } - return $name; - } - - /** - * 実際の設定用のDB名を取得する - * - * @param string $type - * @param string $name - * @return string - * @access public - */ - public function getRealDbName($type, $name) - { - if (preg_match('/^\//', $name)) { - return $name; - } - /* dbName */ - if (!empty($type) && !empty($name)) { - if ($type == 'sqlite') { - return APP . 'db' . DS . 'sqlite' . DS . $name . '.db'; - } elseif ($type == 'csv') { - return APP . 'db' . DS . 'csv' . DS . $name; - } - } - - return $name; - } - - /** - * テーマ用のページファイルを生成する - * - * @access protected - */ - public function createPageTemplates() - { - ClassRegistry::flush(); - $Page = ClassRegistry::init('Page'); - $Page->searchIndexSaving = false; - BcUtil::clearAllCache(); - $pages = $Page->find('all', ['conditions' => ['Content.alias_id' => null], 'recursive' => 0]); - if ($pages) { - foreach($pages as $page) { - $Page->create($page); - $Page->afterSave(true); - } - } - return true; - } - - /** - * データベースのデータに初期更新を行う - */ - public function executeDefaultUpdates($dbConfig) - { - $result = true; - if (!$this->_updatePluginStatus($dbConfig)) { - $this->log(__d('baser', 'プラグインの有効化に失敗しました。')); - $result = false; - } - if (!$this->_updateContents()) { - $this->log(__d('baser', 'コンテンツの更新に失敗しました。')); - $result = false; - } - return $result; - } - - /** - * コンテンツを更新する - * @return bool - */ - protected function _updateContents() - { - App::uses('Content', 'Model'); - $Content = new Content(); - $contents = $Content->find('all', ['recursive' => -1]); - $result = true; - foreach($contents as $content) { - $content['Content']['created_date'] = date('Y-m-d H:i:s'); - if (!$Content->save($content, ['validation' => false, 'callbacks' => false])) { - $result = false; - } - } - return $result; - } - - /** - * プラグインのステータスを更新する - * - * @return boolean - * @access protected - */ - protected function _updatePluginStatus($dbConfig) - { - $db = $this->_getDataSource('default', $dbConfig); - $db->truncate('plugins'); - - $version = BcUtil::getVersion(); - $Plugin = new Plugin(); - $corePlugins = Configure::read('BcApp.corePlugins'); - - $result = true; - $priority = intval($Plugin->getMax('priority')) + 1; - foreach($corePlugins as $corePlugin) { - $data = []; - include BASER_PLUGINS . $corePlugin . DS . 'config.php'; - $data['Plugin']['name'] = $corePlugin; - $data['Plugin']['title'] = $title; - $data['Plugin']['version'] = $version; - $data['Plugin']['status'] = true; - $data['Plugin']['db_inited'] = false; - $data['Plugin']['priority'] = $priority; - $Plugin->create($data); - if (!$Plugin->save()) { - $result = false; - } - $priority++; - } - return $result; - } - - /** - * サイト基本設定に管理用メールアドレスを登録する - * - * @param string $email - * @return boolean - * @access public - */ - public function setAdminEmail($email) - { - App::uses('SiteConfig', 'Model'); - $data['SiteConfig']['email'] = $email; - $SiteConfig = new SiteConfig(); - return $SiteConfig->saveKeyValue($data); - } - - /** - * 初期ユーザーを登録する - * - * @param array $user - * @return boolean - */ - public function addDefaultUser($user, $securitySalt = '') - { - if ($securitySalt) { - Configure::write('Security.salt', $securitySalt); - } - - $user += [ - 'real_name_1' => $user['name'] - ]; - $user = array_merge([ - 'name' => '', - 'real_name_1' => '', - 'email' => '', - 'user_group_id' => 1, - 'password_1' => '', - 'password_2' => '' - ], $user); - - /** 2016/09/21 gondoh - * Consoleから動作させた場合ClassRegistryからインスタンスを取得すると - * 動的生成されたAppModelを利用してしまうため明示的にnewする。 - */ - $User = new User(); - - $user['password'] = $user['password_1']; - $User->create($user); - - return $User->save(); - } - - /** - * データベース設定ファイル[database.php]を保存する - * - * @param array $options - * @return boolean - */ - public function createDatabaseConfig($options = []) - { - if (!is_writable(APP . 'Config' . DS)) { - return false; - } - - $options = array_merge([ - 'datasource' => '', - 'host' => 'localhost', - 'port' => '', - 'login' => 'dummy', - 'password' => 'dummy', - 'database' => 'dummy', - 'prefix' => '', - 'schema' => '', - 'encoding' => 'utf8' - ], $options); - - // 入力された文字列よりPHPプログラムファイルを生成するため'(シングルクオート)をサニタイズ - foreach($options as $key => $option) { - $options[$key] = addcslashes($option, '\'\\'); - } - - extract($options); - - $datasource = $this->getDatasourceName($datasource); - - $dbfilename = APP . 'Config' . DS . 'database.php'; - $file = new File($dbfilename); - - if ($file !== false) { - - if ($file->exists()) { - $file->delete(); - } - - $file->create(); - $file->open('w', true); - $file->write("write("//\n"); - $file->write("// Database Configuration File created by baserCMS Installation\n"); - $file->write("//\n"); - - $file->write("class DATABASE_CONFIG {\n"); - $file->write('public $default = array(' . "\n"); - $file->write("\t'datasource' => '" . $datasource . "',\n"); - $file->write("\t'persistent' => false,\n"); - $file->write("\t'host' => '" . $host . "',\n"); - $file->write("\t'port' => '" . $port . "',\n"); - $file->write("\t'login' => '" . $login . "',\n"); - $file->write("\t'password' => '" . $password . "',\n"); - $file->write("\t'database' => '" . $database . "',\n"); - $file->write("\t'schema' => '" . $schema . "',\n"); - $file->write("\t'prefix' => '" . $prefix . "',\n"); - $file->write("\t'encoding' => '" . $encoding . "'\n"); - $file->write(");\n"); - - $file->write('public $test = array(' . "\n"); - $file->write("\t'datasource' => '" . $datasource . "',\n"); - $file->write("\t'persistent' => false,\n"); - $file->write("\t'host' => '" . $host . "',\n"); - $file->write("\t'port' => '" . $port . "',\n"); - $file->write("\t'login' => '" . $login . "',\n"); - $file->write("\t'password' => '" . $password . "',\n"); - $file->write("\t'database' => '" . $database . "',\n"); - $file->write("\t'schema' => '" . $schema . "',\n"); - $file->write("\t'prefix' => '" . $prefix . Configure::read('BcEnv.testDbPrefix') . "',\n"); - $file->write("\t'encoding' => '" . $encoding . "'\n"); - $file->write(");\n"); - $file->write("}\n"); - - $file->close(); - return true; - } else { - return false; - } - } - - /** - * インストール設定ファイルを生成する - * - * @return boolean - */ - public function createInstallFile($securitySalt, $secrityCipherSeed, $siteUrl = "") - { - $installFileName = APP . 'Config' . DS . 'install.php'; - - if (!$siteUrl) { - $siteUrl = BcUtil::siteUrl(); - } - $installCoreData = [" 'File'));", - "Configure::write('debug', 0);" - ]; - if (file_put_contents($installFileName, implode("\n", $installCoreData))) { - return chmod($installFileName, 0666); - } else { - return false; - } - } - - /** - * セキュリティ用のキーを生成する - * - * @param int $length - * @return string キー - * @access protected - */ - public function setSecuritySalt($length = 40) - { - $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 int $length - * @return string 数字キー - * @access public - */ - public function setSecurityCipherSeed($length = 29) - { - $keyset = "0123456789"; - $randkey = ""; - for($i = 0; $i < $length; $i++) { - $randkey .= substr($keyset, rand(0, strlen($keyset) - 1), 1); - } - Configure::write('Security.cipherSeed', $randkey); - return $randkey; - } - - /** - * baserCMSコアのデータベースを構築する - * - * @param array $dbConfig データベース設定名 - * @param string $dbDataPattern データパターン - * @return boolean - */ - public function constructionDb($dbConfig, $dbDataPattern = '', $adminTheme = '') - { - - $coreExcludes = ['users', 'dblogs', 'plugins']; - - if (!$dbDataPattern) { - $dbDataPattern = Configure::read('BcApp.defaultTheme') . '.default'; - } - - if (strpos($dbDataPattern, '.') === false) { - $this->log(__d('baser', 'データパターンの形式が不正です。')); - return false; - } - - [$theme, $pattern] = explode('.', $dbDataPattern); - - if (!$this->constructionTable('BaserCore', 'default', $dbConfig)) { - $this->log(__d('baser', 'コアテーブルの構築に失敗しました。')); - return false; - } - - if (!$this->loadDefaultDataPattern('default', $dbConfig, $pattern, $theme, 'core', $coreExcludes)) { - $this->log(__d('baser', 'コアの初期データのロードに失敗しました。')); - return false; - } - - if (!$this->initSystemData($dbConfig, ['adminTheme' => $adminTheme])) { - $this->log(__d('baser', 'システムデータの初期化に失敗しました。')); - return false; - } - - $Db = $this->_getDataSource(); - if ($Db->config['datasource'] == 'Database/BcPostgres') { - $Db->updateSequence(); - } - - return true; - } - - /** - * 全ての初期データセットのリストを取得する - * - * @return array - */ - public function getAllDefaultDataPatterns() - { - $patterns = []; - - // コア - $patterns = $this->getDefaultDataPatterns(); - - // コアテーマ - $Folder = new Folder(BASER_CONFIGS . 'theme'); - $files = $Folder->read(true, true); - foreach($files[0] as $theme) { - if ($theme != 'empty') { - $patterns = array_merge($patterns, $this->getDefaultDataPatterns($theme)); - } - } - - // 外部テーマ - $Folder = new Folder(BASER_THEMES); - $files = $Folder->read(true, true, false); - foreach($files[0] as $theme) { - if ($theme != 'empty') { - $patterns = array_merge($patterns, $this->getDefaultDataPatterns($theme)); - } - } - - return $patterns; - } - - /** - * テーブルを構築する - * - * @param string $path - * @param string $dbConfigKeyName - * @param string $dbConfig - * @param string $dbDataPattern - * @return boolean - */ - public function constructionTable($plugin, $dbConfigKeyName = 'default', $dbConfig = null) - { - - $db = $this->_getDataSource($dbConfigKeyName, $dbConfig); - $datasource = strtolower(preg_replace('/^Database\/Bc/', '', $db->config['datasource'])); - - if (@!$db->connected && $datasource != 'csv') { - return false; - } elseif ($datasource == 'csv') { - // CSVの場合はフォルダを作成する - $Folder = new Folder($db->config['database'], true, 0777); - } elseif ($datasource == 'sqlite') { - $db->connect(); - chmod($db->config['database'], 0666); - } - - $path = BcUtil::getSchemaPath($plugin); - - // DB構築 - $Folder = new Folder($path); - $files = $Folder->read(true, true, true); - if (isset($files[1])) { - foreach($files[1] as $file) { - - if (!preg_match('/\.php$/', $file)) { - continue; - } - if (!$db->createTableBySchema(['path' => $file])) { - return false; - } - } - } - - return true; - } - - /** - * テーブルを削除する - * - * @param string $dbConfigKeyName - * @param array $dbConfig - * @return boolean - * TODO 処理を DboSource に移動する - * TODO コアのテーブルを削除する際、プレフィックスだけでは、プラグインを識別できないので、プラグインのテーブルも削除されてしまう。 - * そのため、プラグインのテーブルを削除しようとすると存在しない為、Excerptionが発生してしまい。処理が停止してしまうので、 - * try で実行し、catch はスルーしている。 - */ - public function deleteTables($dbConfigKeyName = 'default', $dbConfig = null) - { - $db = $this->_getDataSource($dbConfigKeyName, $dbConfig); - $dbConfig = $db->config; - - /* 削除実行 */ - // TODO schemaを有効活用すればここはスッキリしそうだが見送り - $datasource = strtolower(preg_replace('/^Database\/Bc/', '', $db->config['datasource'])); - switch($datasource) { - case 'mysql': - $sources = $db->listSources(); - foreach($sources as $source) { - if (preg_match("/^" . $dbConfig['prefix'] . "([^_].+)$/", $source)) { - $sql = 'DROP TABLE ' . $source; - try { - $db->execute($sql); - } catch (Exception $e) { - } - } - } - break; - - case 'postgres': - $sources = $db->listSources(); - foreach($sources as $source) { - if (preg_match("/^" . $dbConfig['prefix'] . "([^_].+)$/", $source)) { - $sql = 'DROP TABLE ' . $source; - try { - $db->execute($sql); - } catch (Exception $e) { - } - } - } - // シーケンスも削除 - $sql = "SELECT sequence_name FROM INFORMATION_SCHEMA.sequences WHERE sequence_schema = '{$dbConfig['schema']}';"; - $sequences = []; - try { - $sequences = $db->query($sql); - } catch (Exception $e) { - } - if ($sequences) { - $sequences = Hash::extract($sequences, '0.sequence_name'); - foreach($sequences as $sequence) { - if (preg_match("/^" . $dbConfig['prefix'] . "([^_].+)$/", $sequence)) { - $sql = 'DROP SEQUENCE ' . $sequence; - try { - $db->execute($sql); - } catch (Exception $e) { - } - } - } - } - break; - - case 'sqlite': - @unlink($dbConfig['database']); - break; - - case 'csv': - $folder = new Folder($dbConfig['database']); - $files = $folder->read(true, true, true); - foreach($files[1] as $file) { - if (basename($file) != 'empty') { - @unlink($file); - } - } - break; - } - return true; - } - - /** - * テーマを配置する - * - * @param string $theme - * @return boolean - */ - public function deployTheme($theme = null) - { - - $this->resetTheme(); - $Folder = new Folder(BASER_CONFIGS . 'theme'); - - if ($theme) { - if (is_array($theme)) { - $sources = $theme; - } else { - $sources = [$theme]; - } - } else { - $files = $Folder->read(); - $sources = $files[0]; - } - - $result = true; - foreach($sources as $theme) { - $targetPath = WWW_ROOT . 'theme' . DS . $theme; - $sourcePath = BASER_CONFIGS . 'theme' . DS . $theme; - if ($Folder->copy(['to' => $targetPath, 'from' => $sourcePath, 'mode' => 0777, 'skip' => ['_notes']])) { - if (!$Folder->create($targetPath . DS . 'Pages', 0777)) { - $result = false; - } - } else { - $result = false; - } - } - $Folder = null; - return $result; - } - - /** - * エディタテンプレート用のアイコン画像をデプロイ - * - * @return boolean - */ - public function deployEditorTemplateImage() - { - $path = WWW_ROOT . 'files' . DS . 'editor' . DS; - if (!is_dir($path)) { - $Folder = new Folder(); - $Folder->create($path, 0777); - } - - $src = BASER_WEBROOT . '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; - } - - /** - * アップロード用初期フォルダを作成する - */ - public function createDefaultFiles() - { - $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; - } - /** * 設定ファイルをリセットする * @@ -1159,152 +467,6 @@ public function checkEnv() return $status + $check; } - /** - * DB接続チェック - * - * @param string[] $config - * 'datasource' 'MySQL' or 'Postgres' or 'SQLite' or 'CSV' - * 'database' データベース名 SQLiteの場合はファイルパス CSVの場合はディレクトリへのパス - * 'host' テキストDB or localhostの場合は不要 - * 'port' 接続ポート テキストDBの場合は不要 - * 'login' 接続ユーザ名 テキストDBの場合は不要 - * 'password' 接続パスワード テキストDBの場合は不要 - * - * @return boolean - * @throws PDOException - * @throws Exception - */ - public function checkDbConnection($config) - { - $datasource = Hash::get($config, 'datasource'); - $database = Hash::get($config, 'database'); - $host = Hash::get($config, 'host'); - $port = Hash::get($config, 'port'); - $login = Hash::get($config, 'login'); - $password = Hash::get($config, 'password'); - - $datasource = strtolower($datasource); - - try { - if ($datasource == 'mysql') { - $dsn = "mysql:dbname={$database}"; - if ($host) { - $dsn .= ";host={$host}"; - } - if ($port) { - $dsn .= ";port={$port}"; - } - $pdo = new PDO($dsn, $login, $password); - } elseif ($datasource == 'postgres') { - $dsn = "pgsql:dbname={$database}"; - if ($host) { - $dsn .= ";host={$host}"; - } - if ($port) { - $dsn .= ";port={$port}"; - } - $pdo = new PDO($dsn, $login, $password); - } elseif ($datasource == 'sqlite') { - // すでにある場合 - if (file_exists($database)) { - if (!is_writable($database)) { - throw new Exception(__d('baser', "データベースファイルに書き込み権限がありません。")); - } - // ない場合 - } else { - if (!is_writable(dirname($database))) { - throw new Exception(__d('baser', 'データベースの保存フォルダに書き込み権限がありません。')); - } - } - $dsn = "sqlite:" . $database; - $pdo = new PDO($dsn); - } elseif ($datasource == 'csv') { - if (is_writable($database)) { - return true; - } - throw new Exception(__d('baser', 'データベースの保存フォルダに書き込み権限がありません。')); - } else { - // ドライバが見つからない - throw new Exception(__d('baser', 'ドライバが見つかりません Driver is not defined.(MySQL|Postgres|SQLite|CSV)')); - } - } catch (PDOException $e) { - throw new PDOException($e->getMessage()); - } - - // 接続できたよ - if ($pdo) { - // disconnect - unset($pdo); - return true; - } - } - - /** - * サイトルートに管理システム用アセットを配置する - * - * @return boolean - */ - public function deployAdminAssets() - { - $adminTheme = Configure::read('BcSite.admin_theme'); - $viewPath = WWW_ROOT; - $baserWebroot = BASER_WEBROOT; - if ($adminTheme) { - if (is_dir(BASER_THEMES . $adminTheme)) { - return true; - } elseif (is_dir(BASER_VIEWS . 'Themed' . DS . $adminTheme)) { - $baserWebroot = BASER_VIEWS . 'Themed' . DS . $adminTheme . DS; - } - } - $adminCss = $baserWebroot . 'css' . DS . 'admin'; - $adminJs = $baserWebroot . 'js' . DS . 'admin'; - $adminImg = $baserWebroot . 'img' . DS . 'admin'; - $adminFonts = $baserWebroot . 'fonts' . DS . 'admin'; - $css = $viewPath . 'css' . DS . 'admin'; - $js = $viewPath . 'js' . DS . 'admin'; - $img = $viewPath . 'img' . DS . 'admin'; - $fonts = $viewPath . 'fonts' . DS . 'admin'; - $result = true; - $Folder = new Folder(); - if (is_dir($adminCss)) { - if (!$Folder->copy([ - 'from' => $adminCss, - 'to' => $css, - 'mode' => 0777 - ])) { - $result = false; - } - } - if (is_dir($adminJs)) { - if (!$Folder->copy([ - 'from' => $adminJs, - 'to' => $js, - 'mode' => 0777 - ])) { - $result = false; - } - } - if (is_dir($adminImg)) { - if (!$Folder->copy([ - 'from' => $adminImg, - 'to' => $img, - 'mode' => 0777 - ])) { - $result = false; - } - } - if (is_dir($adminFonts)) { - if (!$Folder->copy([ - 'from' => $adminFonts, - 'to' => $fonts, - 'mode' => 0777 - ])) { - $result = false; - } - } - return $result; - } - /** * サイトルートの管理システム用アセットを削除する * @@ -1334,110 +496,6 @@ public function deleteAdminAssets() return $result; } - /** - * プラグインをインストールする - * - * @param string $name - * @return boolean - */ - public function installPlugin($name, $dbDataPattern = '') - { - BcUtil::clearAllCache(); - - $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()); - } - } - } - /** * テーマに梱包されているプラグインをインストールする * diff --git a/plugins/baser-core/src/Middleware/BcAdminMiddleware.php b/plugins/baser-core/src/Middleware/BcAdminMiddleware.php index dc6a47e0a1..8b26ed7175 100644 --- a/plugins/baser-core/src/Middleware/BcAdminMiddleware.php +++ b/plugins/baser-core/src/Middleware/BcAdminMiddleware.php @@ -41,7 +41,7 @@ public function process( RequestHandlerInterface $handler ): ResponseInterface { - if(BcUtil::isAdminSystem()) $request = $this->setCurrentSite($request); + if(BcUtil::isAdminSystem() && BcUtil::isInstalled()) $request = $this->setCurrentSite($request); return $handler->handle($request); } diff --git a/plugins/baser-core/src/Middleware/BcFrontMiddleware.php b/plugins/baser-core/src/Middleware/BcFrontMiddleware.php index b05214e26b..b4826cd2dc 100644 --- a/plugins/baser-core/src/Middleware/BcFrontMiddleware.php +++ b/plugins/baser-core/src/Middleware/BcFrontMiddleware.php @@ -42,7 +42,7 @@ public function process( RequestHandlerInterface $handler ): ResponseInterface { - if(!BcUtil::isAdminSystem()) $request = $this->setCurrent($request); + if(!BcUtil::isAdminSystem() && BcUtil::isInstalled()) $request = $this->setCurrent($request); return $handler->handle($request); } diff --git a/plugins/baser-core/src/Middleware/BcRedirectSubSiteFilter.php b/plugins/baser-core/src/Middleware/BcRedirectSubSiteFilter.php index 64fa1abfdc..74af95a5e7 100644 --- a/plugins/baser-core/src/Middleware/BcRedirectSubSiteFilter.php +++ b/plugins/baser-core/src/Middleware/BcRedirectSubSiteFilter.php @@ -11,6 +11,7 @@ namespace BaserCore\Middleware; +use BaserCore\Utility\BcUtil; use Cake\Core\Configure; use Cake\Http\Response; use Psr\Http\Message\ResponseInterface; @@ -53,7 +54,7 @@ public function process( if (Configure::read('BcRequest.isUpdater')) { return $handler->handle($request); } - if ($request->is('admin')) { + if ($request->is('admin') || !BcUtil::isInstalled()) { return $handler->handle($request); } $sites = \Cake\ORM\TableRegistry::getTableLocator()->get('BaserCore.Sites'); diff --git a/plugins/baser-core/src/Middleware/BcRequestFilterMiddleware.php b/plugins/baser-core/src/Middleware/BcRequestFilterMiddleware.php index 4ae8438766..ddd2007c81 100644 --- a/plugins/baser-core/src/Middleware/BcRequestFilterMiddleware.php +++ b/plugins/baser-core/src/Middleware/BcRequestFilterMiddleware.php @@ -52,7 +52,7 @@ public function process( return new Response(); } - $this->redirectIfIsDeviceFile($request, $handler); + if(BcUtil::isInstalled()) $this->redirectIfIsDeviceFile($request, $handler); return $handler->handle($request); } diff --git a/plugins/baser-core/src/Plugin.php b/plugins/baser-core/src/Plugin.php index 563dcf7652..206b3b597f 100644 --- a/plugins/baser-core/src/Plugin.php +++ b/plugins/baser-core/src/Plugin.php @@ -28,11 +28,11 @@ use Cake\Core\Configure; use Cake\Core\ContainerInterface; use Cake\Core\PluginApplicationInterface; +use Cake\Datasource\ConnectionManager; use Cake\Event\EventManager; use Cake\Http\Middleware\CsrfProtectionMiddleware; use Cake\Http\MiddlewareQueue; use Cake\Http\ServerRequestFactory; -use Cake\Routing\Route\InflectedRoute; use Cake\Routing\RouteBuilder; use Cake\Routing\Router; use Cake\Utility\Inflector; @@ -63,34 +63,64 @@ class Plugin extends BcPlugin implements AuthenticationServiceProviderInterface */ public function bootstrap(PluginApplicationInterface $application): void { - // composer インストール対応 - // composer でインストールした場合、プラグインは vendor 保存されるためパスを追加 - // bootstrap() で、setting.php の読み込みがあるので、その前に呼び出す必要あり + /** + * composer インストール対応 + * composer でインストールした場合、プラグインは vendor 保存されるためパスを追加 + * bootstrap() で、setting.php の読み込みがあるので、その前に呼び出す必要あり + */ Configure::write('App.paths.plugins', array_merge( Configure::read('App.paths.plugins'), [ROOT . DS . 'vendor' . DS . 'baserproject' . DS] )); - parent::bootstrap($application); + /** + * インストール状態の設定 + * インストールされてない場合のテストをできるようにするため、Configure の設定を優先する + */ + $hasInstall = file_exists(CONFIG . 'install.php'); + if(is_null(Configure::read('BcRequest.isInstalled'))) { + Configure::write('BcRequest.isInstalled', $hasInstall); + } + /** + * コンソール判定 + * BcUtil::isConsole で利用 + */ + $_ENV['IS_CONSOLE'] = (substr(php_sapi_name(), 0, 3) === 'cli'); + + /** + * インストール状態による初期化設定 + * インストールされている場合は、TMP フォルダの設定を行い、 + * されていない場合は、インストールプラグインをロードする。 + */ if(BcUtil::isInstalled()) { BcUtil::checkTmpFolders(); + } else { + $application->addPlugin('BcInstaller'); } - if (file_exists(CONFIG . 'setting.php')) { - Configure::load('setting', 'baser'); - } + /** + * プラグインごとの設定ファイル読み込み + */ + parent::bootstrap($application); - if (!filter_var(env('USE_DEBUG_KIT', true), FILTER_VALIDATE_BOOLEAN)) { - // 明示的に指定がない場合、DebugKitは重すぎるのでデバッグモードでも利用しない - \Cake\Core\Plugin::getCollection()->remove('DebugKit'); - } + /** + * 設定ファイル読み込み + * baserCMSの各種設定は、ここで上書きできる事を想定 + */ + if (file_exists(CONFIG . 'setting.php')) Configure::load('setting', 'baser'); + /** + * プラグインロード + */ $application->addPlugin('Authentication'); $application->addPlugin('Migrations'); $application->addPlugin(Inflector::camelize(Configure::read('BcApp.defaultAdminTheme'), '-')); $application->addPlugin(Inflector::camelize(Configure::read('BcApp.defaultFrontTheme'), '-')); - + if (!filter_var(env('USE_DEBUG_KIT', true), FILTER_VALIDATE_BOOLEAN)) { + // 明示的に指定がない場合、DebugKitは重すぎるのでデバッグモードでも利用しない + \Cake\Core\Plugin::getCollection()->remove('DebugKit'); + } $plugins = BcUtil::getEnablePlugins(); if ($plugins) { foreach($plugins as $plugin) { @@ -99,6 +129,10 @@ public function bootstrap(PluginApplicationInterface $application): void } } } + + /** + * デフォルトテンプレートを設定する + */ $this->setupDefaultTemplatesPath(); /** @@ -235,6 +269,11 @@ public function getAuthenticationService(ServerRequestInterface $request): Authe } if (!$authSetting || !BcUtil::isInstalled()) { $service->loadAuthenticator('Authentication.Form'); + if(!empty($authSetting['sessionKey'])) { + $service->loadAuthenticator('Authentication.Session', [ + 'sessionKey' => $authSetting['sessionKey'], + ]); + } return $service; } @@ -362,6 +401,12 @@ public function routes($routes): void return; } + // インストールされていない場合は実行しない + if (!BcUtil::isInstalled()) { + parent::routes($routes); + return; + } + $request = Router::getRequest(); if(!$request) { $request = ServerRequestFactory::fromGlobals(); @@ -379,17 +424,6 @@ public function routes($routes): void $property->setValue($collection, []); } - /** - * インストーラー - */ - if (!BcUtil::isInstalled()) { - $routes->connect('/', ['plugin' => 'BaserCore', 'controller' => 'Installations', 'action' => 'index']); - $routes->connect('/install', ['plugin' => 'BaserCore', 'controller' => 'Installations', 'action' => 'index']); - $routes->fallbacks(InflectedRoute::class); - parent::routes($routes); - return; - } - /** * アップデーター * /config/setting.php にて URLを変更することができる diff --git a/plugins/baser-core/src/Service/Admin/BcAdminAppService.php b/plugins/baser-core/src/Service/Admin/BcAdminAppService.php index 0d355033d7..8ad9417275 100644 --- a/plugins/baser-core/src/Service/Admin/BcAdminAppService.php +++ b/plugins/baser-core/src/Service/Admin/BcAdminAppService.php @@ -17,6 +17,7 @@ use BaserCore\Service\PermissionsServiceInterface; use BaserCore\Service\SiteConfigsServiceInterface; use BaserCore\Utility\BcContainerTrait; +use BaserCore\Utility\BcUtil; /** * BcAdminAppService @@ -38,6 +39,7 @@ class BcAdminAppService implements BcAdminAppServiceInterface */ public function getViewVarsForAll(): array { + if(!BcUtil::isInstalled()) return []; return [ 'permissionMethodList' => $this->getService(PermissionsServiceInterface::class)->getMethodList(), 'permissionAuthList' => $this->getService(PermissionsServiceInterface::class)->getAuthList(), diff --git a/plugins/baser-core/src/Service/BcDatabaseService.php b/plugins/baser-core/src/Service/BcDatabaseService.php index 5ead953199..c87261034c 100644 --- a/plugins/baser-core/src/Service/BcDatabaseService.php +++ b/plugins/baser-core/src/Service/BcDatabaseService.php @@ -18,8 +18,13 @@ use Cake\Cache\Cache; use Cake\Core\Configure; use Cake\Core\Plugin; +use Cake\Database\Connection; +use Cake\Database\Driver\Mysql; +use Cake\Database\Driver\Postgres; +use Cake\Database\Driver\Sqlite; use Cake\Database\Schema\TableSchemaInterface; use Cake\Datasource\ConnectionManager; +use Cake\Datasource\Exception\MissingDatasourceConfigException; use Cake\Event\EventManager; use Cake\Filesystem\File; use Cake\Filesystem\Folder; @@ -27,11 +32,15 @@ use Cake\ORM\Entity; use Cake\ORM\Table; use Cake\ORM\TableRegistry; +use Cake\Utility\Hash; use Cake\Utility\Inflector; use Cake\View\View; use BaserCore\Annotation\UnitTest; use BaserCore\Annotation\NoTodo; use BaserCore\Annotation\Checked; +use Migrations\Migrations; +use PDO; +use PDOException; /** * @@ -54,7 +63,7 @@ class BcDatabaseService implements BcDatabaseServiceInterface /** * 初期データを読み込む - * + * * @param $theme * @param $pattern * @param $excludes @@ -263,7 +272,7 @@ public function resetTables($plugin = 'BaserCore', $excludes = []): bool /** * テーブルのデータをリセットする - * + * * @param $table * @return bool * @noTodo @@ -358,7 +367,7 @@ public function initSystemData($options = []): bool /** * メールメッセージテーブルを初期化する - * + * * @return bool * @checked * @noTodo @@ -383,20 +392,39 @@ public function initMessageTables(): bool /** * データベースシーケンスをアップデートする - * - * @checked - * @noTodo - * @unitTest */ public function updateSequence() { - // TODO ucmitz 未実装のため一旦スキップ - return; - $Db = ConnectionManager::getDataSource('default'); - if ($Db->config['datasource'] === 'Database/BcPostgres') { - $Db->updateSequence(); + // TODO ucmitz 未実装 + return true; + + $db = ConnectionManager::get('default'); + $tables = $db->getSchemaCollection()->listTables(); + $result = true; + foreach($tables as $table) { + $sql = 'select setval(\'' . $this->getSequence($table) . '\', (select max(id) from ' . $table . '));'; + if (!$db->execute($sql)) $result = false; + } + return $result; + } + + /** + * シーケンスを取得する + */ + public function getSequence($table, $field = 'id') + { + // TODO ucmitz 未実装 + // CakePHP4系で存在しないので、CakePHP2系のPostgresクラスより持ってきた + if (is_object($table)) { + $table = $this->fullTableName($table, false, false); } - return; + if (!isset($this->_sequenceMap[$table])) { + $this->describe($table); + } + if (isset($this->_sequenceMap[$table][$field])) { + return $this->_sequenceMap[$table][$field]; + } + return "{$table}_{$field}_seq"; } /** @@ -678,7 +706,7 @@ public function getAppTableList($plugin = ''): array /** * アプリケーションに関連するテーブルリストのキャッシュをクリアする - * + * * @checked * @noTodo * @unitTest @@ -743,7 +771,7 @@ public function writeSchema($table, $options) /** * テキストのスキーマ情報を生成する * Bake\Command\FixtureCommand::_generateSchema() を移植 - * + * * @param TableSchemaInterface $table * @return string * @checked @@ -790,7 +818,7 @@ protected function _generateSchema(TableSchemaInterface $table) /** * Formats Schema columns from Model Object * Bake\Command\FixtureCommand::_values() を移植 - * + * * @param array $values options keys(type, null, default, key, length, extra) * @return string[] Formatted values * @checked @@ -822,7 +850,7 @@ protected function _values(array $values): array /** * スキーマを読み込む - * + * * @param $options * @return bool * @checked @@ -851,4 +879,323 @@ public function loadSchema($options): bool return true; } + /** + * datasource名を取得 + * + * @param string datasource name.postgre.mysql.etc. + * @return string + */ + public function getDatasourceName($datasource = null) + { + $name = $datasource; + switch($datasource) { + case 'postgres' : + $name = Postgres::class; + break; + case 'mysql' : + $name = Mysql::class; + break; + case 'sqlite' : + $name = Sqlite::class; + break; + default : + } + return $name; + } + + /** + * データベースに接続する + * + * @param array $config + */ + public function connectDb(array $config, $name = 'default') + { + if (empty($config['driver']) && !empty($config['datasource'])) { + $config['driver'] = $this->getDatasourceName($config['datasource']); + } + if (empty($config['driver'])) return ConnectionManager::get($name); + ConnectionManager::setConfig($name, [ + 'className' => Connection::class, + 'driver' => $config['driver'], + 'persistent' => false, + 'host' => $config['host'], + 'port' => $config['port'], + 'username' => $config['username'], + 'password' => $config['password'], + 'database' => $config['database'], + 'schema' => $config['schema'], + 'prefix' => $config['prefix'], + 'encoding' => $config['encoding'] + ]); + $db = ConnectionManager::get($name); + $db->connect(); + return $db; + } + + /** + * データソースを取得する + * + * @param string $configKeyName + * @param array $dbConfig + * @return Connection + */ + public function getDataSource($dbConfigKeyName = 'default', $dbConfig = null) + { + try { + $db = ConnectionManager::get($dbConfigKeyName); + } catch (MissingDatasourceConfigException $e) { + if ($dbConfig) { + if (empty($dbConfig['driver']) && !empty($dbConfig['datasource'])) { + $dbConfig['driver'] = $this->getDatasourceName($dbConfig['datasource']); + } + ConnectionManager::setConfig($dbConfigKeyName, $dbConfig); + $db = ConnectionManager::get($dbConfigKeyName); + } else { + throw $e; + } + } + return $db; + } + + /** + * テーブルを削除する + * + * @param string $dbConfigKeyName + * @param array $dbConfig + * @return boolean + */ + public function deleteTables($dbConfigKeyName = 'default', $dbConfig = null) + { + $db = $this->getDataSource($dbConfigKeyName, $dbConfig); + if (!$dbConfig) $dbConfig = ConnectionManager::getConfig($dbConfigKeyName); + $prefix = Configure::read('Datasources.default.prefix'); + $datasource = strtolower(str_replace('Cake\\Database\\Driver\\', '', $dbConfig['driver'])); + switch($datasource) { + case 'mysql': + $sources = $db->getSchemaCollection()->listTables(); + foreach($sources as $source) { + if (!preg_match("/^" . $prefix . "([^_].+)$/", $source)) continue; + try { + $db->execute('DROP TABLE ' . $source); + } catch (BcException $e) { + } + } + break; + + case 'postgres': + $sources = $db->getSchemaCollection()->listTables(); + foreach($sources as $source) { + if (!preg_match("/^" . $prefix . "([^_].+)$/", $source)) continue; + try { + $db->execute('DROP TABLE ' . $source); + } catch (BcException $e) { + } + } + // シーケンスも削除 + $sql = "SELECT sequence_name FROM INFORMATION_SCHEMA.sequences WHERE sequence_schema = '{$dbConfig['schema']}';"; + $sequences = []; + try { + $sequences = $db->query($sql); + } catch (BcException $e) { + } + if ($sequences) { + $sequences = Hash::extract($sequences, '0.sequence_name'); + foreach($sequences as $sequence) { + if (!preg_match("/^" . $prefix . "([^_].+)$/", $sequence)) continue; + $sql = 'DROP SEQUENCE ' . $sequence; + try { + $db->execute($sql); + } catch (BcException $e) { + } + } + } + break; + + case 'sqlite': + @unlink($dbConfig['database']); + break; + } + return true; + } + + /** + * DB接続チェック + * + * @param string[] $config + * - `datasource`: 'MySQL' or 'Postgres' or 'SQLite' or 'CSV' + * - `database`: データベース名 SQLiteの場合はファイルパス CSVの場合はディレクトリへのパス + * - `host`: テキストDB or localhostの場合は不要 + * - `port`: 接続ポート テキストDBの場合は不要 + * - `login`: 接続ユーザ名 テキストDBの場合は不要 + * - `password`: 接続パスワード テキストDBの場合は不要 + * @throws PDOException + * @throws BcException + */ + public function checkDbConnection($config) + { + $datasource = Hash::get($config, 'datasource'); + $database = Hash::get($config, 'database'); + $host = Hash::get($config, 'host'); + $port = Hash::get($config, 'port'); + $login = Hash::get($config, 'username'); + $password = Hash::get($config, 'password'); + $datasource = strtolower($datasource); + + try { + switch($datasource) { + case 'mysql': + $dsn = "mysql:dbname={$database}"; + if ($host) $dsn .= ";host={$host}"; + if ($port) $dsn .= ";port={$port}"; + $pdo = new PDO($dsn, $login, $password); + break; + case 'postgres': + $dsn = "pgsql:dbname={$database}"; + if ($host) $dsn .= ";host={$host}"; + if ($port) $dsn .= ";port={$port}"; + $pdo = new PDO($dsn, $login, $password); + break; + case 'sqlite': + if (file_exists($database)) { + if (!is_writable($database)) { + throw new BcException(__d('baser', "データベースファイルに書き込み権限がありません。")); + } + } else { + if (!is_writable(dirname($database))) { + throw new BcException(__d('baser', 'データベースの保存フォルダに書き込み権限がありません。')); + } + } + $dsn = "sqlite:" . $database; + $pdo = new PDO($dsn); + break; + default: + throw new BcException(__d('baser', 'ドライバが見つかりません Driver is not defined.(MySQL|Postgres|SQLite)')); + } + unset($pdo); + } catch (PDOException $e) { + throw $e; + } + } + + /** + * データベース接続テスト + * + * @param array $config + */ + public function testConnectDb($config) + { + /* データベース接続確認 */ + try { + $this->checkDbConnection($config); + } catch (PDOException $e) { + if ($e->getCode() === 2002) { + throw new PDOException(__d('baser', "データベースへの接続でエラーが発生しました。データベース設定を見直してください。\nサーバー上に指定されたデータベースが存在しない可能性が高いです。\n" . $e->getMessage())); + } + throw $e; + } catch (BcException $e) { + $message = __d('baser', "データベースへの接続でエラーが発生しました。データベース設定を見直してください。\nサーバー上に指定されたデータベースが存在しない可能性が高いです。"); + if (preg_match('/with message \'(.+?)\' in/s', $e->getMessage(), $matches)) { + $message .= "\n" . $matches[1]; + } + throw new BcException($message); + } + + /* データベース接続生成 */ + /* @var Connection $db */ + $db = $this->connectDb($config); + + if (!$db->isConnected()) { + throw new BcException(__d('baser', "データベースへの接続でエラーが発生しました。データベース設定を見直してください。")); + } + + //version check + $driver = $db->getDriver(); + switch(get_class($driver)) { + case 'Cake\Database\Driver\Mysql' : + $result = $db->execute("SELECT version() as version")->fetch(); + if (version_compare($result[0], Configure::read('BcRequire.MySQLVersion')) == -1) { + throw new BcException(sprintf(__d('baser', 'データベースのバージョンが %s 以上か確認してください。'), Configure::read('BcRequire.MySQLVersion'))); + } + break; + case 'Cake\Database\Driver\Postgres' : + // TODO ucmitz 未検証 + $result = $db->query("SELECT version() as version")->fetch(); + [, $version] = explode(" ", $result[0]); + if (version_compare(trim($version), Configure::read('BcRequire.PostgreSQLVersion')) == -1) { + throw new BcException(sprintf(__d('baser', 'データベースのバージョンが %s 以上か確認してください。'), Configure::read('BcRequire.PostgreSQLVersion'))); + } + break; + } + + try { + /* 一時的にテーブルを作成できるかテスト */ + $randomtablename = 'deleteme' . rand(100, 100000); + $db->execute("CREATE TABLE $randomtablename (a varchar(10))"); + $db->execute('drop TABLE ' . $randomtablename); + } catch (PDOException $e) { + throw new PDOException(__d('baser', "データベースへの接続でエラーが発生しました。\n") . $e->getMessage()); + } + + // データベースのテーブルをチェック + $tableNames = $db->getSchemaCollection()->listTables(); + $prefix = Hash::get($config, 'prefix'); + $duplicateTableNames = array_filter($tableNames, function($tableName) use ($prefix) { + return strpos($tableName, $prefix) === 0; + }); + if (count($duplicateTableNames) > 0) { + throw new BcException(__d('baser', 'データベースへの接続に成功しましたが、プレフィックスが重複するテーブルが存在します。') . implode(', ', $duplicateTableNames)); + } + } + + /** + * テーブルを構築する + * + * @param string $plugin + * @param string $dbConfigKeyName + * @param array $dbConfig + * @return boolean + */ + public function constructionTable(string $plugin, string $dbConfigKeyName = 'default', array $dbConfig = []) + { + $db = $this->getDataSource($dbConfigKeyName, $dbConfig); + if (!$dbConfig) $dbConfig = ConnectionManager::getConfig($dbConfigKeyName); + $datasource = strtolower(str_replace('Cake\\Database\\Driver\\', '', $dbConfig['driver'])); + if (!$db->isConnected()) { + return false; + } elseif ($datasource == 'sqlite') { + $db->connect(); + chmod($dbConfig['database'], 0666); + } + return $this->migrate($plugin, $dbConfigKeyName); + } + + /** + * データベースのマイグレーションを実行する + * + * @param string $plugin + * @param string $connection + * @return bool + */ + public function migrate(string $plugin, string $connection = 'default') + { + $pluginPath = BcUtil::getPluginPath($plugin); + if (!is_dir($pluginPath . 'config' . DS . 'Migrations')) return false; + $options = [ + 'plugin' => $plugin, + 'connection' => $connection + ]; + try { + $migrations = new Migrations(); + $migrations->migrate([ + 'plugin' => $plugin, + 'connection' => $connection + ]); + return true; + } catch (BcException $e) { + $this->log($e->getMessage()); + $migrations->rollback($options); + return false; + } + } + } diff --git a/plugins/baser-core/src/Service/ThemesService.php b/plugins/baser-core/src/Service/ThemesService.php index 108ee9d4e7..163b0e93f0 100644 --- a/plugins/baser-core/src/Service/ThemesService.php +++ b/plugins/baser-core/src/Service/ThemesService.php @@ -25,7 +25,6 @@ use Cake\Core\Configure; use Cake\Core\Plugin; use Cake\Datasource\EntityInterface; -use Cake\Filesystem\File; use Cake\Filesystem\Folder; use Cake\Http\Client; use Cake\ORM\TableRegistry; @@ -46,7 +45,7 @@ class ThemesService implements ThemesServiceInterface /** * 単一データ取得 - * + * * @param string $theme * @return EntityInterface * @checked @@ -61,7 +60,7 @@ public function get(string $theme) /** * 一覧データ取得 - * + * * @checked * @noTodo * @unitTest @@ -88,10 +87,10 @@ public function getIndex(): array */ public function getDefaultDataPatterns($theme = '', $options = []) { - if (!$theme) $theme = Configure::read('BcApp.defaultFrontTheme'); + if (!$theme) $theme = Inflector::camelize(Configure::read('BcApp.defaultFrontTheme'), '-'); $options = array_merge(['useTitle' => true], $options); $dataPath = dirname(BcUtil::getDefaultDataPath($theme)); - + if(!$dataPath) return []; if ($theme !== Inflector::camelize(Configure::read('BcApp.defaultFrontTheme'), '-') && $dataPath === dirname(BcUtil::getDefaultDataPath())) { return []; @@ -103,10 +102,14 @@ public function getDefaultDataPatterns($theme = '', $options = []) if ($files[0]) { foreach($files[0] as $pattern) { if ($options['useTitle']) { - $pluginsTable = TableRegistry::getTableLocator()->get('BaserCore.Plugins'); - $themeRecord = $pluginsTable->getPluginConfig($theme); - if ($themeRecord && $themeRecord->title) { - $title = $themeRecord->title; + if(BcUtil::isInstalled()) { + $pluginsTable = TableRegistry::getTableLocator()->get('BaserCore.Plugins'); + $themeRecord = $pluginsTable->getPluginConfig($theme); + if ($themeRecord && $themeRecord->title) { + $title = $themeRecord->title; + } else { + $title = $theme; + } } else { $title = $theme; } @@ -122,7 +125,7 @@ public function getDefaultDataPatterns($theme = '', $options = []) /** * 新しいテーマをアップロードする - * + * * @param UploadedFile[] $postData * @checked * @noTodo @@ -167,7 +170,7 @@ public function add(array $postData): string /** * テーマを適用する - * + * * @param string $theme * @return array 適用完了後に表示するメッセージ * @checked @@ -195,7 +198,7 @@ public function apply(Site $site, string $theme): array /** * 現在のテーマのプラグインを無効化する - * + * * @checked * @unitTest * @noTodo @@ -214,7 +217,7 @@ private function detachCurrentThemesPlugins() /** * 指定したテーマが梱包するプラグイン情報を取得 - * + * * @param string $theme * @return array|string[] * @checked @@ -240,7 +243,7 @@ private function getThemesPluginsInfo(string $theme) /** * テーマが初期データを保有している場合の情報を取得 - * + * * @param string $theme * @param array $info * @return array|mixed|string[] @@ -263,7 +266,7 @@ private function getThemesDefaultDataInfo(string $theme, array $info = []) /** * テーマが梱包するプラグインをインストールする - * + * * @param string $theme * @throws \Exception * @checked @@ -285,7 +288,7 @@ private function installThemesPlugins(string $theme) /** * 初期データを読み込む - * + * * @param string $currentTheme * @param string $dbDataPattern * @return bool @@ -336,7 +339,7 @@ public function loadDefaultDataPattern(string $currentTheme, string $dbDataPatte /** * コピーする - * + * * @checked * @noTodo * @unitTest @@ -363,7 +366,7 @@ public function copy(string $theme): bool /** * 削除する - * + * * @param string $theme * @checked * @noTodo @@ -382,7 +385,7 @@ public function delete(string $theme): bool /** * baserマーケットのテーマ一覧を取得する - * + * * @checked * @noTodo * @unitTest @@ -417,7 +420,7 @@ public function getMarketThemes(): array /** * 指定したテーマをダウンロード用のテーマとして一時フォルダに作成する - * + * * @param string $theme * @return string * @checked @@ -440,7 +443,7 @@ public function createDownloadToTmp(string $theme): string /** * 現在のDB内のデータをダウンロード用のCSVとして一時フォルダに作成する - * + * * @return string * @checked * @noTodo @@ -474,7 +477,7 @@ public function createDownloadDefaultDataPatternToTmp(): string /** * site_configs テーブルにて、 CSVに出力しないフィールドを空にする - * + * * @param string $path * @return bool * @checked diff --git a/plugins/baser-core/src/TestSuite/BcTestCase.php b/plugins/baser-core/src/TestSuite/BcTestCase.php index 13d2fa36e6..d55c000d25 100644 --- a/plugins/baser-core/src/TestSuite/BcTestCase.php +++ b/plugins/baser-core/src/TestSuite/BcTestCase.php @@ -23,6 +23,7 @@ use BaserCore\Utility\BcUtil; use BcBlog\ServiceProvider\BcBlogServiceProvider; use BcContentLink\ServiceProvider\BcContentLinkServiceProvider; +use BcInstaller\ServiceProvider\BcInstallerServiceProvider; use BcSearchIndex\ServiceProvider\BcSearchIndexServiceProvider; use Cake\Core\Configure; use Cake\Datasource\ConnectionManager; @@ -192,9 +193,6 @@ public function tearDownFixtureManager() */ public function setUp(): void { - if(!empty($_SERVER['REQUEST_URI']) && $_SERVER['REQUEST_URI'] === '/s/') { - $a = 1; - } if (!$this->autoFixtures) { $this->setUpFixtureManager(); } @@ -212,6 +210,7 @@ public function setUp(): void $container->addServiceProvider(new BcSearchIndexServiceProvider()); $container->addServiceProvider(new BcContentLinkServiceProvider()); $container->addServiceProvider(new BcBlogServiceProvider()); + $container->addServiceProvider(new BcInstallerServiceProvider()); EventManager::instance(new EventManager()); if(!empty($_SERVER['REQUEST_URI']) && $_SERVER['REQUEST_URI'] === '/s/') { $a = 1; diff --git a/plugins/baser-core/src/Utility/BcUtil.php b/plugins/baser-core/src/Utility/BcUtil.php index c1cd2c3290..4897144436 100644 --- a/plugins/baser-core/src/Utility/BcUtil.php +++ b/plugins/baser-core/src/Utility/BcUtil.php @@ -359,6 +359,7 @@ public static function getPrefix($regex = false) */ public static function getEnablePlugins() { + if(!BcUtil::isInstalled()) return []; $enablePlugins = []; if (!Configure::read('debug')) { $enablePlugins = Cache::read('enable_plugins', '_bc_env_'); @@ -571,37 +572,6 @@ public static function getThemesPlugins($theme) return []; } - /** - * スキーマ情報のパスを取得する - * - * @param string $plugin プラグイン名 - * @return string Or false - */ - public static function getSchemaPath($plugin = null) - { - - if (!$plugin) { - $plugin = 'BaserCore'; - } else { - $plugin = Inflector::camelize($plugin); - } - - if ($plugin == 'BaserCore') { - return BASER_CONFIGS . 'Schema'; - } - - $paths = App::path('Plugin'); - foreach($paths as $path) { - $_path = $path . $plugin . DS . 'Config' . DS . 'Schema'; - if (is_dir($_path)) { - return $_path; - } - } - - return false; - - } - /** * 初期データのパスを取得する * @@ -1079,6 +1049,7 @@ public static function getViewPath() public static function getCurrentTheme() { $theme = Inflector::camelize(Inflector::underscore(Configure::read('BcApp.defaultFrontTheme'))); + if(!BcUtil::isInstalled()) return $theme; $request = Router::getRequest(); if (BcUtil::isAdminSystem()) { $site = $request->getAttribute('currentSite'); @@ -1116,7 +1087,7 @@ public static function getRootTheme() public static function getCurrentAdminTheme() { $adminTheme = Inflector::camelize(Inflector::underscore(Configure::read('BcApp.defaultAdminTheme'))); - if (!empty(BcSiteConfig::get('admin_theme'))) { + if (BcUtil::isInstalled() && !empty(BcSiteConfig::get('admin_theme'))) { $adminTheme = BcSiteConfig::get('admin_theme'); } return $adminTheme; diff --git a/plugins/baser-core/src/View/Helper/BcAdminHelper.php b/plugins/baser-core/src/View/Helper/BcAdminHelper.php index ccfed30f84..5a2b008b86 100755 --- a/plugins/baser-core/src/View/Helper/BcAdminHelper.php +++ b/plugins/baser-core/src/View/Helper/BcAdminHelper.php @@ -263,6 +263,7 @@ public function addAdminMainBodyHeaderLinks($links) */ public function isAvailableSideBar() { + if(!BcUtil::isInstalled()) return false; $prefix = $this->_View->getRequest()->getParam('prefix'); $loginAction = Router::url(Configure::read('BcPrefixAuth.' . $prefix . '.loginAction')); $name = $this->_View->getName(); diff --git a/plugins/baser-core/src/View/Helper/BcBaserHelper.php b/plugins/baser-core/src/View/Helper/BcBaserHelper.php index 7b2bd490a8..d246c457bb 100755 --- a/plugins/baser-core/src/View/Helper/BcBaserHelper.php +++ b/plugins/baser-core/src/View/Helper/BcBaserHelper.php @@ -179,6 +179,7 @@ public function __construct(View $View, $settings = []) public function initialize($config): void { parent::initialize($config); + if(!BcUtil::isInstalled()) return; $this->PermissionsService = $this->getService(PermissionsServiceInterface::class); } @@ -411,7 +412,7 @@ public function getLink($title, $url = null, $options = [], $confirmMessage = fa // 認証チェック $user = Bcutil::loginUser(); - if ($user) { + if ($user && BcUtil::isInstalled()) { $userGruops = array_column($user->user_groups, 'id'); if (!$this->PermissionsService->check($_url, $userGruops)) { $enabled = false; diff --git a/plugins/baser-core/src/View/Helper/BcContentsHelper.php b/plugins/baser-core/src/View/Helper/BcContentsHelper.php index 5b6483e175..f46c01f08f 100644 --- a/plugins/baser-core/src/View/Helper/BcContentsHelper.php +++ b/plugins/baser-core/src/View/Helper/BcContentsHelper.php @@ -69,6 +69,7 @@ class BcContentsHelper extends Helper public function initialize(array $config): void { parent::initialize($config); + if(!BcUtil::isInstalled()) return; $this->_Contents = TableRegistry::getTableLocator()->get('BaserCore.Contents'); $this->PermissionsService = $this->getService(PermissionsServiceInterface::class); $this->ContentsService = $this->getService(ContentsServiceInterface::class); diff --git a/plugins/baser-core/src/View/Helper/BcPageHelper.php b/plugins/baser-core/src/View/Helper/BcPageHelper.php index 42446c41c7..c58f5d3265 100755 --- a/plugins/baser-core/src/View/Helper/BcPageHelper.php +++ b/plugins/baser-core/src/View/Helper/BcPageHelper.php @@ -11,6 +11,7 @@ namespace BaserCore\View\Helper; +use BaserCore\Utility\BcUtil; use Cake\View\View; use Cake\View\Helper; use BaserCore\Utility\BcContainerTrait; @@ -81,6 +82,7 @@ public function __construct(View $View, $settings = []) public function initialize(array $config): void { parent::initialize($config); + if(!BcUtil::isInstalled()) return; $this->ContentsService = $this->getService(ContentsServiceInterface::class); } diff --git a/plugins/baser-core/src/View/Helper/BcSiteConfigHelper.php b/plugins/baser-core/src/View/Helper/BcSiteConfigHelper.php index 578ac87b5c..5959f48a20 100644 --- a/plugins/baser-core/src/View/Helper/BcSiteConfigHelper.php +++ b/plugins/baser-core/src/View/Helper/BcSiteConfigHelper.php @@ -17,6 +17,7 @@ use BaserCore\Service\SiteConfigsService; use BaserCore\Service\SiteConfigsServiceInterface; use BaserCore\Utility\BcContainerTrait; +use BaserCore\Utility\BcUtil; use Cake\View\Helper; /** @@ -41,6 +42,7 @@ class BcSiteConfigHelper extends Helper public function initialize(array $config): void { parent::initialize($config); + if(!BcUtil::isInstalled()) return; $this->SiteConfigsService = $this->getService(SiteConfigsServiceInterface::class); } diff --git a/plugins/baser-core/src/View/Helper/BcToolbarHelper.php b/plugins/baser-core/src/View/Helper/BcToolbarHelper.php index 2f0d8e089a..c74e2810db 100644 --- a/plugins/baser-core/src/View/Helper/BcToolbarHelper.php +++ b/plugins/baser-core/src/View/Helper/BcToolbarHelper.php @@ -11,7 +11,6 @@ namespace BaserCore\View\Helper; -use BaserCore\Error\BcException; use BaserCore\Service\SitesService; use BaserCore\Service\SitesServiceInterface; use BaserCore\Utility\BcContainerTrait; @@ -191,6 +190,7 @@ public function getLogoutUrl() */ public function getMode(): string { + if(!BcUtil::isInstalled()) return ''; if (!$this->isLoginUrl()) { if (Configure::read('debug')) { return 'debug'; @@ -282,6 +282,7 @@ public function getLogoType(): string */ public function getLogoLink() { + if(!BcUtil::isInstalled()) return Configure::read('BcLinks.installManual'); $currentSite = $this->_View->getRequest()->getAttribute('currentSite'); /* @var SitesService $siteService */ $siteService = $this->getService(SitesServiceInterface::class); @@ -289,7 +290,6 @@ public function getLogoLink() $normalUrl = '/'; if($content) $normalUrl = $this->BcBaser->getContentsUrl($content->url, true, $currentSite->use_subdomain); $links = [ - 'install' => Configure::read('BcLinks.installManual'), 'update' => Configure::read('BcLinks.updateManual'), 'normal' => $normalUrl, 'frontAdminAvailable' => ['prefix' => 'Admin', 'plugin' => 'BaserCore', 'controller' => 'dashboard', 'action' => 'index'], @@ -327,8 +327,8 @@ public function getLogoText() public function getLogoLinkOptions() { $options = [ - 'install' => ['target' => '_blank', 'class' => 'bca-toolbar__logo-link'], - 'update' => ['target' => '_blank', 'class' => 'bca-toolbar__logo-link'], + 'install' => ['target' => '_blank', 'class' => 'bca-toolbar__logo-link', 'escapeTitle' => false], + 'update' => ['target' => '_blank', 'class' => 'bca-toolbar__logo-link', 'escapeTitle' => false], 'normal' => ['class' => 'bca-toolbar__logo-link', 'escapeTitle' => false], 'frontAdminAvailable' => ['class' => 'bca-toolbar__logo-link', 'escapeTitle' => false], 'frontAdminNotAvailable' => ['title' => $this->BcAuth->getCurrentName()], diff --git a/plugins/baser-core/src/View/Helper/BcUploadHelper.php b/plugins/baser-core/src/View/Helper/BcUploadHelper.php index 2484da2c9a..045663216c 100755 --- a/plugins/baser-core/src/View/Helper/BcUploadHelper.php +++ b/plugins/baser-core/src/View/Helper/BcUploadHelper.php @@ -69,6 +69,7 @@ class BcUploadHelper extends Helper public function initialize(array $config): void { parent::initialize($config); + if(!BcUtil::isInstalled()) return; $this->siteConfigService = $this->getService(SiteConfigsServiceInterface::class); } diff --git a/plugins/baser-core/src/basics.php b/plugins/baser-core/src/basics.php index f1b4c197e2..28d467cafc 100644 --- a/plugins/baser-core/src/basics.php +++ b/plugins/baser-core/src/basics.php @@ -325,28 +325,6 @@ function getEnablePlugins() } -/** - * サイト基本設定をConfigureへ読み込む - * - * @return bool - * @var bool $force 強制的に読み込み直す - */ -function loadSiteConfig($force = false) -{ - if (Configure::read('BcSite') && !$force) { - return true; - } - // DBに接続できない場合、CakePHPのエラーメッセージが表示されてしまう為、 try を利用 - try { - $SiteConfig = ClassRegistry::init('SiteConfig'); - } catch (Exception $ex) { - return false; - } - Configure::write('BcSite', $SiteConfig->getKeyValue()); - ClassRegistry::removeObject('SiteConfig'); - return true; -} - /** * アップデートのURLを記載したメールを送信する */ diff --git a/plugins/baser-core/tests/TestCase/BcBasicsTest.php b/plugins/baser-core/tests/TestCase/BcBasicsTest.php index 1ce4a18174..b845949493 100644 --- a/plugins/baser-core/tests/TestCase/BcBasicsTest.php +++ b/plugins/baser-core/tests/TestCase/BcBasicsTest.php @@ -409,26 +409,6 @@ public function testGetEnablePlugins() $this->assertEquals($expect, $pluginNames, '利用可能なプラグインのリストを正しく取得できません'); } - /** - * サイト基本設定をConfigureへ読み込む - */ - public function testLoadSiteConfig() - { - // 通常読み込み - Configure::write('BcSite', null); - loadSiteConfig(); - $this->assertArrayHasKey('name', Configure::read('BcSite')); - // 強制読み込み - /* @var SiteConfig $SiteConfig */ - $SiteConfig = ClassRegistry::init('SiteConfig'); - $siteConfigs = $SiteConfig->findExpanded(); - $siteConfigs['SiteConfig']['name'] = 'hoge'; - $SiteConfig->saveKeyValue($siteConfigs); - $this->assertNotEquals('hoge', Configure::read('BcSite.name')); - loadSiteConfig(true); - $this->assertEquals('hoge', Configure::read('BcSite.name')); - } - /** * アップデートのURLを記載したメールを送信する */ diff --git a/plugins/baser-core/tests/TestCase/Controller/Component/_NotYetMigrated/BcManagerComponentTest.php b/plugins/baser-core/tests/TestCase/Controller/Component/_NotYetMigrated/BcManagerComponentTest.php index 3c166d35e4..2ef09b07ec 100644 --- a/plugins/baser-core/tests/TestCase/Controller/Component/_NotYetMigrated/BcManagerComponentTest.php +++ b/plugins/baser-core/tests/TestCase/Controller/Component/_NotYetMigrated/BcManagerComponentTest.php @@ -83,38 +83,6 @@ public function tearDown() unset($this->BcManager); } - public function test_updateContents() - { - $this->markTestIncomplete('このテストは、まだ実装されていません。'); - } - - public function test_updatePluginStatus() - { - $this->markTestIncomplete('このテストは、まだ実装されていません。'); - } - - /** - * baserCMSのインストール - * - * @param type $dbConfig - * @param type $adminUser - * @param type $adminPassword - * @param type $adminEmail - * @return boolean - */ - public function testInstall() - { - $this->markTestIncomplete('このテストは、まだ実装されていません。'); - } - - /** - * データベースに接続する - */ - public function testConnectDb() - { - $this->markTestIncomplete('このテストは、まだ実装されていません。'); - } - /** * datasource名を取得 * @@ -161,74 +129,6 @@ public function getRealDbNameDataProvider() ]; } - /** - * テーマ用のページファイルを生成する - * - * @access protected - */ - public function testCreatePageTemplates() - { - $this->markTestIncomplete('このテストは、まだ実装されていません。'); - } - - /** - * データベースのデータに初期更新を行う - */ - public function testExecuteDefaultUpdates() - { - - $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, 'データベースのデータに初期更新に失敗しました'); - } - /** * サイト基本設定に管理用メールアドレスを登録する */ @@ -245,8 +145,6 @@ public function testSetAdminEmail() ); $this->assertEquals('hoge', $result['SiteConfig']['value'], 'サイト基本設定に管理用メールアドレスを登録できません'); - - } /** @@ -272,75 +170,6 @@ public function testAddDefaultUser() $result = Configure::read('Security.salt'); $this->assertEquals('hogehoge', $result, 'SecuritySaltを設定できません'); - - } - - /** - * データベース設定ファイル[database.php]を保存する - * - * @param array $options - * @return boolean - */ - public function testCreateDatabaseConfig() - { - - // 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() - { - - // 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のバックアップに失敗したため、このテストをスキップします。'); - - } - } /** @@ -348,7 +177,6 @@ public function testCreateInstallFile() */ public function testSetSecuritySalt() { - $result = $this->BcManager->setSecuritySalt(); $length = strlen($result); $this->assertEquals(40, $length, 'セキュリティ用のキーが指定した長さで生成されません'); @@ -356,7 +184,6 @@ public function testSetSecuritySalt() $result = $this->BcManager->setSecuritySalt(20); $length = strlen($result); $this->assertEquals(20, $length, 'セキュリティ用のキーが指定した長さで生成されません'); - } /** @@ -364,7 +191,6 @@ public function testSetSecuritySalt() */ public function testSetSecurityCipherSeed() { - $result = $this->BcManager->setSecurityCipherSeed(); $length = strlen($result); $this->assertEquals(29, $length, 'セキュリティ用のキーが指定した長さで生成されません'); @@ -372,31 +198,6 @@ public function testSetSecurityCipherSeed() $result = $this->BcManager->setSecurityCipherSeed(20); $length = strlen($result); $this->assertEquals(20, $length, 'セキュリティ用のキーが指定した長さで生成されません'); - - } - - /** - * データベースを構築する - * - * @param array $dbConfig - * @param string $dbDataPattern - * @return boolean - */ - public function testConstructionDb() - { - $this->markTestIncomplete('このテストは、まだ実装されていません。'); - - } - - /** - * メール受信テーブルの再構築 - * - * @return boolean - */ - public function testReconstructionMessage() - { - $this->markTestIncomplete('このテストは、まだ実装されていません。'); - } /** @@ -404,7 +205,6 @@ public function testReconstructionMessage() */ public function testGetAllDefaultDataPatterns() { - $result = $this->BcManager->getAllDefaultDataPatterns(); $expecteds = [ 'core.default' => 'コア ( default )', @@ -414,172 +214,6 @@ public function testGetAllDefaultDataPatterns() foreach($expecteds as $expected) { $this->assertContains($expected, $result, '全ての初期データセットのリストを正しく取得できません'); } - - } - - /** - * 初期データを読み込む - * - * @param string $dbConfigKeyName - * @param array $dbConfig - * @param string $pattern - * @param string $theme - * @param string $plugin - * @return boolean - */ - public function testLoadDefaultDataPattern() - { - $this->markTestIncomplete('このテストは、まだ実装されていません。'); - - } - - - public function testInitPlugin() - { - $this->markTestIncomplete('このテストは、まだ実装されていません。'); - } - - /** - * システムデータを初期化する - * - * @param string $dbConfigKeyName - * @param array $dbConfig - */ - public function testInitSystemData() - { - $this->markTestIncomplete('このテストは、まだ実装されていません。'); - - } - - /** - * テーブルを構築する - * - * @param string $path - * @param string $dbConfigKeyName - * @param string $dbConfig - * @param string $dbDataPattern - * @return boolean - */ - public function testConstructionTable() - { - $this->markTestIncomplete('このテストは、まだ実装されていません。'); - - - } - - /** - * 全てのテーブルを削除する - * - * @param array $dbConfig - * @return boolean - */ - public function testDeleteAllTables($dbConfig = null) - { - $this->markTestIncomplete('このテストは、まだ実装されていません。'); - - } - - /** - * プラグインも含めて全てのテーブルをリセットする - * - * プラグインは有効となっているもののみ - * 現在のテーマでないテーマの梱包プラグインを検出できない為 - * - * @param array $dbConfig - * @return boolean - */ - public function testResetAllTables($dbConfig = null, $excludes = []) - { - $this->markTestIncomplete('このテストは、まだ実装されていません。'); - - } - - /** - * テーブルを削除する - */ - public function testDeleteTables() - { - $this->markTestIncomplete('このテストは、まだ実装されていません。'); - - } - - /** - * テーマを配置する - * - * @param string $theme テーマ名 - * @dataProvider deployThemeDataProvider - */ - public function testDeployTheme($theme) - { - $this->markTestIncomplete('このテストは、まだ実装されていません。'); - - // nada-icons テーマフォルダを削除 - $Folder = new Folder(); - $targetPath = WWW_ROOT . 'theme' . DS . 'nada-icons'; - $Folder->delete($targetPath); - - $this->BcManager->deployTheme($theme); - - if ($theme != 'bccolumn') { - $this->assertFileExists($targetPath, 'テーマを配置できません'); - - } else { - $this->assertFileDoesNotExist($targetPath, '指定したテーマのみを配置することができません'); - $this->BcManager->deployTheme(); - - } - - } - - public function deployThemeDataProvider() - { - return [ - [null], - ['nada-icons'], - ['bccolumn'], - ]; - } - - /** - * エディタテンプレート用のアイコン画像をデプロイ - * - * @return boolean - */ - public function testDeployEditorTemplateImage() - { - - // editor フォルダを削除 - $Folder = new Folder(); - $targetPath = WWW_ROOT . 'files' . DS . 'editor' . DS; - $Folder->delete($targetPath); - - $this->BcManager->deployEditorTemplateImage(); - - $this->assertFileExists($targetPath, 'エディタテンプレート用のアイコン画像をデプロイできません'); - - } - - /** - * アップロード用初期フォルダを作成する - */ - public function testCreateDefaultFiles() - { - - // 各フォルダを削除 - $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, 'アップロード用初期フォルダを正しく作成できません'); - } - } /** @@ -589,7 +223,6 @@ public function testCreateDefaultFiles() */ public function testResetSetting() { - // database.phpとinstall.phpをバックアップ $configPath = APP . 'Config' . DS; $copy1 = copy($configPath . 'database.php', $configPath . 'database.php.copy'); @@ -610,7 +243,6 @@ public function testResetSetting() $this->markTestIncomplete('database.phpとinstall.phpのバックアップに失敗したため、このテストをスキップします。'); } - } /** @@ -620,7 +252,6 @@ public function testResetSetting() */ public function testResetFiles() { - $this->BcManager->resetFiles(); $path = WWW_ROOT . 'files' . DS; @@ -631,7 +262,6 @@ public function testResetFiles() // 削除されたフォルダを復元 $this->BcManager->createDefaultFiles(); - } /** @@ -659,35 +289,6 @@ public function testResetAdminAssets() } - /** - * baserCMSをリセットする - * - * @param array $dbConfig - */ - public function testReset() - { - $this->markTestIncomplete('このテストは、まだ実装されていません。'); - - } - - public function testResetPage() - { - $this->markTestIncomplete('このテストは、まだ実装されていません。'); - - } - - public function testResetThema() - { - $this->markTestIncomplete('このテストは、まだ実装されていません。'); - - } - - public function testEmptyFolder() - { - $this->markTestIncomplete('このテストは、まだ実装されていません。'); - - } - /** * インストール設定を書き換える * @@ -721,18 +322,6 @@ public function testSetInstallSetting() $this->markTestIncomplete('install.phpのバックアップに失敗したため、このテストをスキップします。'); } - - } - - /** - * 環境チェック - * - * @return array - */ - public function testCheckEnv() - { - $result = $this->BcManager->checkEnv(); - $this->assertNotEmpty($result, '環境情報を取得できません'); } /** @@ -850,31 +439,6 @@ public function testCheckDbConnectionPDOException() } - /** - * テーマに管理システム用アセットを配置する - */ - public function testDeployAdminAssets() - { - // 初期化 - $this->BcManager->resetAdminAssets(); - // 配置 - $this->BcManager->deployAdminAssets(); - - if (is_dir(BASER_THEMES . Configure::read('BcSite.admin_theme'))) { - $assetRoot = BASER_THEMES . Configure::read('BcSite.admin_theme') . DS; - } else { - $assetRoot = WWW_ROOT; - } - $paths = [ - $assetRoot . 'img' . DS . 'admin', - $assetRoot . 'css' . DS . 'admin', - $assetRoot . 'js' . DS . 'admin' - ]; - foreach($paths as $path) { - $this->assertFileExists($path, '管理画面用のアセットフォルダを配置きません'); - } - } - /** * プラグインをインストール/アンインストールする * @@ -975,14 +539,4 @@ public function testInstallThemesPlugins() $this->assertTrue($result, 'デフォルトテーマのプラグインのインストールに失敗しました。'); } - public function testStartup() - { - $this->markTestIncomplete('このテストは、まだ実装されていません。'); - } - - public function testUninstallPlugin() - { - $this->markTestIncomplete('このテストは、まだ実装されていません。'); - } - } diff --git a/plugins/baser-core/tests/TestCase/View/Helper/BcToolbarHelperTest.php b/plugins/baser-core/tests/TestCase/View/Helper/BcToolbarHelperTest.php index 8d8f96bfd6..9d9580d2b2 100644 --- a/plugins/baser-core/tests/TestCase/View/Helper/BcToolbarHelperTest.php +++ b/plugins/baser-core/tests/TestCase/View/Helper/BcToolbarHelperTest.php @@ -295,11 +295,13 @@ public function testGetLogoLink() $this->assertEquals('https://localhost/', $bcToolbar->getLogoLink()); // アップデーター Configure::write('BcRequest.isUpdater', true); - $this->assertEquals('http://wiki.basercms.net/%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97%E3%82%AC%E3%82%A4%E3%83%89', $bcToolbar->getLogoLink()); + $this->assertEquals('https://wiki.basercms.net/%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97%E3%82%AC%E3%82%A4%E3%83%89', $bcToolbar->getLogoLink()); Configure::write('BcRequest.isUpdater', false); // インストーラー + Configure::write('BcRequest.isInstalled', false); $bcToolbar = new BcToolbarHelper(new View(null, null, null, ['name' => 'Installations'])); - $this->assertEquals('http://wiki.basercms.net/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89', $bcToolbar->getLogoLink()); + $this->assertEquals('https://wiki.basercms.net/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89', $bcToolbar->getLogoLink()); + Configure::write('BcRequest.isInstalled', true); } /** diff --git a/plugins/bc-admin-third/src/js/admin/_lib/jquery.bcJwt.js b/plugins/bc-admin-third/src/js/admin/_lib/jquery.bcJwt.js index b71f63fd05..04b0fdc0ca 100644 --- a/plugins/bc-admin-third/src/js/admin/_lib/jquery.bcJwt.js +++ b/plugins/bc-admin-third/src/js/admin/_lib/jquery.bcJwt.js @@ -77,7 +77,7 @@ alert('APIトークンが取得できませんでした。ブラウザをリロードしてください。') } }.bind(this)).fail(function(error){ - if (error.response.status === 401) { + if (error.status === 401) { localStorage.setItem('refreshToken', '') } }) diff --git a/plugins/bc-admin-third/webroot/img/admin/logo_large.png b/plugins/bc-admin-third/webroot/img/admin/logo_large.png index fa3f4f2ff8..7e84608a0a 100644 Binary files a/plugins/bc-admin-third/webroot/img/admin/logo_large.png and b/plugins/bc-admin-third/webroot/img/admin/logo_large.png differ diff --git a/plugins/bc-admin-third/webroot/js/admin/common.bundle.js b/plugins/bc-admin-third/webroot/js/admin/common.bundle.js index 888429a5c5..14bd0d65f8 100644 --- a/plugins/bc-admin-third/webroot/js/admin/common.bundle.js +++ b/plugins/bc-admin-third/webroot/js/admin/common.bundle.js @@ -58,7 +58,7 @@ * @since 5.0.0 * @license https://basercms.net/license/index.html MIT License */ -!function(e){e.bcJwt={accessToken:null,init:function(){var e=localStorage.getItem("refreshToken");e&&"null"!==e&&this.getToken(e)},login:function(t,n,r,o,a){e.ajax({url:e.bcUtil.apiBaseUrl+"baser-core/users/login.json",type:"post",data:{email:t,password:n,saved:void 0!==r&&r?1:""},dataType:"json"}).done(function(e){e&&(this.setToken(e.access_token,e.refresh_token),o&&o(e))}.bind(this)).fail((function(){a&&a()}))},getToken:function(t){t&&e.ajax({url:e.bcUtil.apiBaseUrl+"baser-core/users/refresh_token.json",type:"get",async:!1,headers:{Authorization:t,"Content-Type":"application/json"},dataType:"json"}).done(function(e){e?this.setToken(e.access_token,e.refresh_token):alert("APIトークンが取得できませんでした。ブラウザをリロードしてください。")}.bind(this)).fail((function(e){401===e.response.status&&localStorage.setItem("refreshToken","")}))},setToken:function(e,t){this.accessToken=e,localStorage.setItem("refreshToken",t)},logout:function(){this.removeToken()},removeToken:function(){localStorage.setItem("refreshToken",null),this.accessToken=null}}}(jQuery)},580:()=>{ +!function(e){e.bcJwt={accessToken:null,init:function(){var e=localStorage.getItem("refreshToken");e&&"null"!==e&&this.getToken(e)},login:function(t,n,r,o,a){e.ajax({url:e.bcUtil.apiBaseUrl+"baser-core/users/login.json",type:"post",data:{email:t,password:n,saved:void 0!==r&&r?1:""},dataType:"json"}).done(function(e){e&&(this.setToken(e.access_token,e.refresh_token),o&&o(e))}.bind(this)).fail((function(){a&&a()}))},getToken:function(t){t&&e.ajax({url:e.bcUtil.apiBaseUrl+"baser-core/users/refresh_token.json",type:"get",async:!1,headers:{Authorization:t,"Content-Type":"application/json"},dataType:"json"}).done(function(e){e?this.setToken(e.access_token,e.refresh_token):alert("APIトークンが取得できませんでした。ブラウザをリロードしてください。")}.bind(this)).fail((function(e){401===e.status&&localStorage.setItem("refreshToken","")}))},setToken:function(e,t){this.accessToken=e,localStorage.setItem("refreshToken",t)},logout:function(){this.removeToken()},removeToken:function(){localStorage.setItem("refreshToken",null),this.accessToken=null}}}(jQuery)},580:()=>{ /** * baserCMS : Based Website Development Project * Copyright (c) NPO baser foundation diff --git a/plugins/bc-admin-third/webroot/js/admin/common.bundle.js.map b/plugins/bc-admin-third/webroot/js/admin/common.bundle.js.map index 65069f304d..581d6d9c21 100644 --- a/plugins/bc-admin-third/webroot/js/admin/common.bundle.js.map +++ b/plugins/bc-admin-third/webroot/js/admin/common.bundle.js.map @@ -1 +1 @@ -{"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.response.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 +{"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->hidden('clicked') ?> -
- BcAdminForm->button(__d('baser', '再チェック'), ['class' => 'btn-orange button bca-btn bca-actions__item', 'id' => 'btncheckagain']) ?> - - BcAdminForm->button(__d('baser', '次のステップへ'), ['class' => 'button bca-btn bca-actions__item', 'id' => 'btnnext', 'style' => 'display:none', 'data-bca-btn-type' => 'save']) ?> - - BcAdminForm->button(__d('baser', '次のステップへ'), ['class' => 'button bca-btn bca-actions__item', 'id' => 'btnnext', 'data-bca-btn-type' => 'save']) ?> - -
-
+ 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;