Skip to content

Commit ea7494d

Browse files
committedFeb 1, 2025
bug #6771 Fix/6598 pretty urls and selected menu item (a-r-m-i-n)
This PR was squashed before being merged into the 4.x branch. Discussion ---------- Fix/6598 pretty urls and selected menu item This PR contains several commits: - First some improvments and updates for the DDEV environment - and it enables the use of pretty urls in example assets of DDEV environment - then it contains the first bugfix, regarding additional queryparams in MenuItemMatcher - and finally it solves an absolute vs. relative URL issue for Dashboard menu items This PR fixes #6598 Commits ------- 776a141 Fix/6598 pretty urls and selected menu item
2 parents 200beff + 776a141 commit ea7494d

File tree

8 files changed

+76
-13
lines changed

8 files changed

+76
-13
lines changed
 

‎.ddev/commands/web/run-tests

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#!/bin/bash
22

33
cd ../easyadminbundle
4-
composer install
4+
composer update
55
vendor/bin/simple-phpunit -v

‎.ddev/commands/web/setup

+17-6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
#!/bin/bash
22

33
# Installing Symfony Framework
4-
composer create-project symfony/skeleton:"7.1.*" -n
4+
composer create-project symfony/skeleton:"7.2.*" -n
55
mv -f ./skeleton/* ./
66
mv -f ./skeleton/.env ./
7+
mv -f ./skeleton/.env.dev ./
78
mv -f ./skeleton/.gitignore ./
89
rmdir ./skeleton
910

@@ -13,12 +14,22 @@ composer config extra.symfony.allow-contrib true
1314
composer require "easycorp/easyadmin-bundle": "*@dev" symfony/apache-pack -n
1415
composer require debug -n --dev
1516

16-
# Copy example entities, form and controllers
17+
# Create symlinks for example entities, form, controllers and config
18+
mkdir src/Controller/Admin
19+
ln -s ../../../../easyadminbundle/.ddev/example/Controller/Admin/BlogArticleCrudController.php src/Controller/Admin/BlogArticleCrudController.php
20+
ln -s ../../../../easyadminbundle/.ddev/example/Controller/Admin/CategoryCrudController.php src/Controller/Admin/CategoryCrudController.php
21+
ln -s ../../../../easyadminbundle/.ddev/example/Controller/Admin/DashboardController.php src/Controller/Admin/DashboardController.php
22+
ln -s ../../../easyadminbundle/.ddev/example/Entity/BlogArticle.php src/Entity/BlogArticle.php
23+
ln -s ../../../easyadminbundle/.ddev/example/Entity/Category.php src/Entity/Category.php
24+
ln -s ../../../easyadminbundle/.ddev/example/Entity/ContentBlock.php src/Entity/ContentBlock.php
1725
mkdir src/Form/
18-
cp -r ../easyadminbundle/.ddev/example/Entity/* src/Entity/
19-
cp -r ../easyadminbundle/.ddev/example/Controller/* src/Controller/
20-
cp -r ../easyadminbundle/.ddev/example/Form/* src/Form/
26+
ln -s ../../../easyadminbundle/.ddev/example/Form/ContentBlockType.php src/Form/ContentBlockType.php
27+
ln -s ../../../easyadminbundle/.ddev/example/config/routes/easyadmin.yaml config/routes/easyadmin.yaml
2128

2229
# Initialize DB
23-
echo 'DATABASE_URL="mysql://db:db@db:3306/db?serverVersion=10.4.0-MariaDB&charset=utf8mb4"' >> .env.local
30+
echo 'DATABASE_URL="mysql://db:db@db:3306/db?serverVersion=10.11.0-MariaDB&charset=utf8mb4"' >> .env.local
2431
./bin/console doc:sch:up --force
32+
33+
# Clear Cache
34+
sleep 2
35+
./bin/console c:c

‎.ddev/config.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ additional_hostnames: []
1111
additional_fqdns: []
1212
database:
1313
type: mariadb
14-
version: "10.4"
14+
version: "10.11"
1515
use_dns_when_possible: true
1616
composer_version: "2"
1717
web_environment: []

‎.ddev/example/Controller/Admin/BlogArticleCrudController.php

+11
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,17 @@
55
use App\Entity\BlogArticle;
66
use App\Entity\ContentBlock;
77
use App\Form\ContentBlockType;
8+
use EasyCorp\Bundle\EasyAdminBundle\Attribute\AdminCrud;
9+
use EasyCorp\Bundle\EasyAdminBundle\Config\Filters;
810
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
911
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
1012
use EasyCorp\Bundle\EasyAdminBundle\Field\CollectionField;
1113
use EasyCorp\Bundle\EasyAdminBundle\Field\FormField;
1214
use EasyCorp\Bundle\EasyAdminBundle\Field\TextareaField;
1315
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
16+
use EasyCorp\Bundle\EasyAdminBundle\Filter\EntityFilter;
1417

18+
#[AdminCrud(routePath: '/blog-article')]
1519
class BlogArticleCrudController extends AbstractCrudController
1620
{
1721
public static function getEntityFqcn(): string
@@ -36,4 +40,11 @@ public function configureFields(string $pageName): iterable
3640
})
3741
;
3842
}
43+
44+
public function configureFilters(Filters $filters): Filters
45+
{
46+
$filters->add(EntityFilter::new('category'));
47+
48+
return $filters;
49+
}
3950
}

‎.ddev/example/Controller/Admin/CategoryCrudController.php

+2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
namespace App\Controller\Admin;
44

55
use App\Entity\Category;
6+
use EasyCorp\Bundle\EasyAdminBundle\Attribute\AdminCrud;
67
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
78
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
89
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
910

11+
#[AdminCrud(routePath: '/category')]
1012
class CategoryCrudController extends AbstractCrudController
1113
{
1214
public static function getEntityFqcn(): string

‎.ddev/example/Controller/Admin/DashboardController.php

+2
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44

55
use App\Entity\BlogArticle;
66
use App\Entity\Category;
7+
use EasyCorp\Bundle\EasyAdminBundle\Attribute\AdminDashboard;
78
use EasyCorp\Bundle\EasyAdminBundle\Config\Dashboard;
89
use EasyCorp\Bundle\EasyAdminBundle\Config\MenuItem;
910
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractDashboardController;
1011
use Symfony\Component\HttpFoundation\Response;
1112
use Symfony\Component\Routing\Attribute\Route;
1213

14+
#[AdminDashboard]
1315
class DashboardController extends AbstractDashboardController
1416
{
1517
#[Route('/', name: 'admin')]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
easyadmin:
2+
resource: .
3+
type: easyadmin.routes

‎src/Menu/MenuItemMatcher.php

+39-5
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,10 @@ private function doMarkSelectedLegacyMenuItem(array $menuItems, Request $request
164164
*/
165165
private function doMarkSelectedPrettyUrlsMenuItem(array $menuItems, Request $request): array
166166
{
167-
// the menu-item matching is a 2-phase process:
167+
// the menu-item matching is a 3-phase process:
168168
// 1) traverse all menu items and try to find an exact match with the current URL
169169
// 2) if no exact match is found, traverse all menu items again and try to find a partial match
170+
// 3) if still no match is found, traverse all menu items one last time and ignore the query string parameters
170171
$currentUrlWithoutHost = $request->getPathInfo();
171172
$currentUrlQueryParams = $request->query->all();
172173
unset($currentUrlQueryParams['sort'], $currentUrlQueryParams['page'], $currentUrlQueryParams['query']);
@@ -187,7 +188,17 @@ private function doMarkSelectedPrettyUrlsMenuItem(array $menuItems, Request $req
187188
$menuItemDto->setSubItems($this->doMarkSelectedPrettyUrlsMenuItem($subItems, $request));
188189
}
189190

190-
if ($menuItemDto->getLinkUrl() === $normalizedCurrentUrl) {
191+
// Remove host part from menu item link URL
192+
$urlParts = parse_url($menuItemDto->getLinkUrl());
193+
$linkUrlWithoutHost = $urlParts['path'];
194+
if (\array_key_exists('query', $urlParts)) {
195+
$linkUrlWithoutHost .= '?'.$urlParts['query'];
196+
}
197+
if (\array_key_exists('fragment', $urlParts)) {
198+
$linkUrlWithoutHost .= '#'.$urlParts['fragment'];
199+
}
200+
201+
if ($linkUrlWithoutHost === $normalizedCurrentUrl) {
191202
$menuItemDto->setSelected(true);
192203

193204
return $menuItems;
@@ -208,6 +219,29 @@ private function doMarkSelectedPrettyUrlsMenuItem(array $menuItems, Request $req
208219
EA::CRUD_ACTION => Action::INDEX,
209220
]))->generateUrl();
210221

222+
if ($this->traverseMenuItemsAndCheckCurrentUrl($menuItems, $currentUrlWithIndexCrudAction, $request)) {
223+
return $menuItems;
224+
}
225+
226+
$currentUrlWithIndexCrudActionWithoutQueryParams = $this->adminUrlGenerator->unsetAll()->setAll([
227+
EA::DASHBOARD_CONTROLLER_FQCN => $request->attributes->get(EA::DASHBOARD_CONTROLLER_FQCN),
228+
EA::CRUD_CONTROLLER_FQCN => $crudControllerFqcn,
229+
EA::CRUD_ACTION => Action::INDEX,
230+
])->generateUrl();
231+
232+
$this->traverseMenuItemsAndCheckCurrentUrl($menuItems, $currentUrlWithIndexCrudActionWithoutQueryParams, $request);
233+
234+
return $menuItems;
235+
}
236+
237+
/**
238+
* @param MenuItemDto[] $menuItems
239+
*/
240+
private function traverseMenuItemsAndCheckCurrentUrl(
241+
array $menuItems,
242+
string $currentUrlToCheck,
243+
Request $request,
244+
): bool {
211245
foreach ($menuItems as $menuItemDto) {
212246
if ($menuItemDto->isMenuSection()) {
213247
continue;
@@ -218,14 +252,14 @@ private function doMarkSelectedPrettyUrlsMenuItem(array $menuItems, Request $req
218252
}
219253

220254
// compare the ending of the URL instead of a strict equality because link URLs can be absolute URLs
221-
if ('' !== $menuItemDto->getLinkUrl() && str_ends_with($currentUrlWithIndexCrudAction, $menuItemDto->getLinkUrl())) {
255+
if ('' !== $menuItemDto->getLinkUrl() && str_ends_with($currentUrlToCheck, $menuItemDto->getLinkUrl())) {
222256
$menuItemDto->setSelected(true);
223257

224-
return $menuItems;
258+
return true;
225259
}
226260
}
227261

228-
return $menuItems;
262+
return false;
229263
}
230264

231265
/**

0 commit comments

Comments
 (0)
Please sign in to comment.