CakePHP-Bootstrap / cakephp3-bootstrap-helpers

CakePHP 3.x Helpers for Bootstrap 3 and 4.
https://holt59.github.io/cakephp3-bootstrap-helpers/
MIT License
130 stars 79 forks source link

_normalize is wrong when a page is attached to default route #160

Open viniciusbig opened 6 years ago

viniciusbig commented 6 years ago

This is a (multiple allowed):

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 commented 6 years ago

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.