diff --git a/plugins/baser-core/src/Controller/Admin/PreviewController.php b/plugins/baser-core/src/Controller/Admin/PreviewController.php index d069ee1918..112a7dc5f7 100644 --- a/plugins/baser-core/src/Controller/Admin/PreviewController.php +++ b/plugins/baser-core/src/Controller/Admin/PreviewController.php @@ -90,10 +90,27 @@ public function view() * @noTodo * @unitTest */ - private function _createPreviewRequest($request) + private function _createPreviewRequest(ServerRequest $request): ServerRequest { $query = $request->getQueryParams(); $url = $this->encodePath($query['url']); + $base = trim((string)$request->getAttribute('base'), '/'); + if ($base) { + $base = '/' . $base; + $parseUrl = parse_url($url); + $path = $parseUrl['path'] ?? '/'; + if ($path === $base || str_starts_with($path, $base . '/')) { + $path = substr($path, strlen($base)); + if ($path === '') { + $path = '/'; + } + $url = $parseUrl['scheme'] . '://' . $parseUrl['host'] . + (isset($parseUrl['port']) ? ':' . $parseUrl['port'] : '') . $path; + if (!empty($parseUrl['query'])) { + $url .= '?' . $parseUrl['query']; + } + } + } unset($query['url']); $params = []; foreach($query as $key => $value) { @@ -109,6 +126,7 @@ private function _createPreviewRequest($request) 'webroot' => $request->getAttribute('webroot'), ] ); + /** @var ServerRequest $request */ //======================================================================== // 2022/12/02 by ryuring // メールフォームのフォームを生成する際、$this->>formProtector が存在しないとエラーとなる。 diff --git a/plugins/baser-core/tests/TestCase/Controller/Admin/PreviewControllerTest.php b/plugins/baser-core/tests/TestCase/Controller/Admin/PreviewControllerTest.php index bd46fdaede..63adb1a37b 100644 --- a/plugins/baser-core/tests/TestCase/Controller/Admin/PreviewControllerTest.php +++ b/plugins/baser-core/tests/TestCase/Controller/Admin/PreviewControllerTest.php @@ -11,6 +11,7 @@ namespace BaserCore\Test\TestCase\Controller\Admin; +use BcBlog\Test\Scenario\BlogContentScenario; use BaserCore\Service\PagesServiceInterface; use BaserCore\Test\Scenario\InitAppScenario; use BaserCore\Test\Scenario\SmallSetContentsScenario; @@ -100,7 +101,8 @@ public function testView() } /** - * test _createPreviewRequest + * プレビューURLからページ表示用のリクエストパラメータを生成できる + * * @return void */ public function test_createPreviewRequest() @@ -118,6 +120,68 @@ public function test_createPreviewRequest() $this->assertEquals('Pages', $result->getParam('controller')); } + /** + * サブフォルダ運用時でもトップページのプレビューURLを正しく解決できる + * + * /sub を取り除いた上で、PagesController の view に解決されることを確認する。 + * + * @return void + */ + public function test_createPreviewRequestWithSubfolderBase() + { + $this->loadFixtureScenario(InitAppScenario::class); + $this->loadFixtureScenario(SmallSetContentsScenario::class); + $this->loginAdmin($this->getRequest('/')); + + $request = $this->getRequest('/baser/admin/baser-core/preview/view') + ->withAttribute('base', '/sub') + ->withAttribute('webroot', '/sub/') + ->withQueryParams(['url' => 'https://localhost/sub/', 'preview' => 'default']); + $this->PreviewController->setRequest($request); + + $result = $this->execPrivateMethod( + $this->PreviewController, + '_createPreviewRequest', + [$request] + ); + + $this->assertEquals('view', $result->getParam('action')); + $this->assertEquals(1, $result->getParam('entityId')); + $this->assertEquals('Pages', $result->getParam('controller')); + } + + /** + * サブフォルダ運用時でもブログ記事URLを BlogController に解決できる + * + * /sub/news/archives/1 のようなURLが、BcBlog のブログ詳細ルートへ + * 正しくマッチすることを確認する。 + * + * @return void + */ + public function test_createPreviewRequestWithSubfolderBaseAndBlogUrl() + { + $this->loadFixtureScenario(InitAppScenario::class); + $this->loadFixtureScenario(SmallSetContentsScenario::class); + $this->loadFixtureScenario(BlogContentScenario::class, 10, 1, 1, 'news', '/news/'); + $this->loginAdmin($this->getRequest('/')); + + $request = $this->getRequest('/baser/admin/baser-core/preview/view') + ->withAttribute('base', '/sub') + ->withAttribute('webroot', '/sub/') + ->withQueryParams(['url' => 'https://localhost/sub/news/archives/1', 'preview' => 'publish']); + $this->PreviewController->setRequest($request); + + $result = $this->execPrivateMethod( + $this->PreviewController, + '_createPreviewRequest', + [$request] + ); + + $this->assertEquals('Blog', $result->getParam('controller')); + $this->assertEquals('archives', $result->getParam('action')); + $this->assertEquals('BcBlog', $result->getParam('plugin')); + } + /** * test encodePath */