iDev247
iDev247

Reputation: 1901

CakePHP pages without controller in url

Is it possible to have pages route without the controller in the URL but still have other controllers work? Example:

Doing the following works for having the pages without /pages/ in the URL but if I try to access any other controller it doesn't work:

Is there a way to setup the Router so that it runs controller/action if it exists. If it does not it runs the pages controller/action?

Upvotes: 2

Views: 5230

Answers (3)

Jesse Lansner
Jesse Lansner

Reputation: 101

I actually solved this the opposite way from Dave's answer above, by adding a route for each controller, rather than each page. (I won't be adding new controllers very often, but I will be adding new content on a regular basis.)

// define an array of all controllers that I want to be able to view the index page of
$indexControllers = array('posts','events','users');

//create a route for each controller's index view
foreach ($indexControllers as $controller) {
    Router::connect(
        '/' . $controller,
        array(
            'controller' => $controller,
            'action' => 'index'
        )
    );
}

//create a route to remove 'view' from all page URLs
Router::connect(
    '/:title',
    array(
        'controller' => 'contents',
        'action' => 'view'
    ),
    array(
        'pass' => array('title'),
        'title' => '[a-z0-9_\-]*'
    )
);

Upvotes: 0

João Luís
João Luís

Reputation: 31

I know I'm late, but here's my tip for someone looking for this.

In routes.php

foreach(scandir('../View/Pages') as $path){
  if(pathinfo($path, PATHINFO_EXTENSION) == "ctp"){
    $name = pathinfo($path, PATHINFO_FILENAME);
    Router::connect('/'.$name, array('controller' => 'pages', 'action' => 'display', $name));
  }
}

This will create a route for every ctp file in the View/Pages folder.

Upvotes: 3

Dave
Dave

Reputation: 29121

I think the short answer is, no - it's not possible in the manner you're hoping*. Routing isn't really "logic" driven, so unless you can come up with a way to match the things you want in both respects you can't do "if controller exists, then _, else _" kind of thing.

*You could, however add each "page" as a row in your routes file. That would allow "about", "contact" ...etc to be accessed directly, while things that don't exactly match them are handled by the remaining routes.

Upvotes: 3

Related Questions