From 74463e0e9c7d7d5f2244ffdaf2c3e9e037982c35 Mon Sep 17 00:00:00 2001 From: sakaguchi Date: Fri, 19 Jun 2026 16:38:23 +0900 Subject: [PATCH] =?UTF-8?q?fix=20#4428=20=E3=80=90=E3=82=B7=E3=82=B9?= =?UTF-8?q?=E3=83=86=E3=83=A0=E3=80=91=E3=82=B5=E3=83=96=E3=83=95=E3=82=A9?= =?UTF-8?q?=E3=83=AB=E3=83=80=E3=81=AB=E8=A8=AD=E7=BD=AE=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=81=A8=E3=83=97=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC=E3=81=8C?= =?UTF-8?q?=E3=82=A8=E3=83=A9=E3=83=BC=E3=81=AB=E3=81=AA=E3=82=8B=E4=BB=B6?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controller/Admin/PreviewController.php | 20 +++++- .../Admin/PreviewControllerTest.php | 66 ++++++++++++++++++- 2 files changed, 84 insertions(+), 2 deletions(-) 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 */