I am using cakephp in one of my projects and my client wants the site URLs to end with .html and not the usual friendly urls. I was wondering if its possible in cakephp to d
Its quite Simple,Open file app/config/routes.php and just add
Router::parseExtensions('html', 'rss');
Above the line
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
Now you can access even your controller methods with .html extensions .
I hope it helps .
Had to solve this without using Routes. Kept the default route entry for pages:
Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));
and in the display action removed the .html extension and rendered the respective view:
preg_replace('/\.html$/','',$view);
$this->render(null,'default',$view);
While calling the pages added 'ext' to be .html
According to this page you can do something like this
Router::connect('/(.*).html', array('controller' => 'pages', 'action' => 'display'));
but as you are talking about extensions, that may have other consequences.
That is well documented in the cookbook.
UPDATE: http://book.cakephp.org/2.0/en/development/routing.html#file-extensions
To handle different file extensions with your routes, you need one extra line in your routes config file:
Router::parseExtensions('html', 'rss');
If you want to create a URL such as /page/title-of-page.html you would create your route as illustrated below:
Router::connect(
'/page/:title',
array('controller' => 'pages', 'action' => 'view'),
array(
'pass' => array('title')
)
);
Then to create links which map back to the routes simply use:
$this->Html->link(
'Link title',
array('controller' => 'pages', 'action' => 'view',
'title' => 'super-article', 'ext' => 'html')
);
One of the parameters you can send to Router::url() (which is called by other methods like HtmlHelper::link() and Controller::redirect()) is 'ext'. Try setting this to 'html'. E.g:
echo $this->Html->link('Products', array('controller' => 'products', 'action' => 'index', 'ext' => 'html'));
or
$this->redirect(array('controller' => 'products', 'action' => 'index', 'ext' => 'html'));
If it works, try figuring out a way you can override Router::url() to add it in by default.
As Routes Configuration - File extensions documentation section says, you could use:
Router::parseExtensions('html', 'rss');
This will tell the router to remove any matching file extensions, and then parse what remains.