cakephp3-bootstrap-helpers icon indicating copy to clipboard operation
cakephp3-bootstrap-helpers copied to clipboard

_normalize is wrong when a page is attached to default route

Open viniciusbig opened this issue 7 years ago • 1 comments

This is a (multiple allowed):

  • [x] bug

  • [ ] enhancement

  • [x] question

  • CakePHP Version: 3.5.14

  • Plugin Version/Branch: COMPOSER REQUIREMENTS (e.g. dev-master, dev-4.0.1-alpha, 3.1.*).

What you did

I have a route attached to a page called 'dashboard'

$routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'dashboard']);

So, using the Navbar help I've created a link like this:

$this->Navbar->link('Dashboard', ['controller' => 'Pages', 'action' => 'display', 'dashboard'])

And the generated link is '/' since its routed that way.

In another page, '/home', (pages/display/home) the link '/' is marked as 'active' and this is wrong.

How can I check the current page properly?

What happened

I got the root page active even on another page. Normalize functions seems not work properly when the URL is attached to '/' route.

What you expected to happen

Normalize should check the URL in routes and consider it.

viniciusbig avatar Jun 04 '18 19:06 viniciusbig

So, I'm running more tests here and there are more details I can add here:

I have this route

$routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'dashboard']);

so my mysite.dev/ is conected to my dashboard page

And I have added this link in my Navbar

$this->Navbar->link('Dashboard', ['controller' => 'Pages', 'action' => 'display', 'dashboard'])

When opening another page, ie: mysite.dev/about the compareUrls() will compare '/' (my dashboard page) with the current page '/about'

Then, the normalize() will come up with the wrong structure for the '/' url.

'pass' => [
	(int) 0 => 'about'
],
'controller' => 'Pages',
'action' => 'display',
'plugin' => null,
'_matchedRoute' => '/pages/*'

Note the pass parameter wrong. It should be dashboard and not the current page about.

I think the line

$url = Router::parseRequest(new ServerRequest($this->_removeRelative($url)));

is not parsing the root route right.

If I remove the route in my routes.php this thing doesn't happen and the normalized version for it is:

'pass' => [
	(int) 0 => 'dashboard'
],
'controller' => 'Pages',
'action' => 'display',
'plugin' => null,
'_matchedRoute' => '/pages/*'

Check the pass parameter changing.

viniciusbig avatar Jun 05 '18 11:06 viniciusbig