cakephp default controller/action routing with pagination breaks with named parameters - cakephp

I have default routing rule set:
Router::connect('/', array('controller' => 'photos', 'action' => 'index'));
when i go to
http://url.com/photos/index/page:1/limit:10/direction:desc/
everything works fine but it breaks when i go to
http://url.com/page:1/limit:10/direction:desc/

First, you need to tell your route to parse after the /:
Router::connect('/*', array('controller' => 'photos', 'action' => 'index'));
Then, connect the named parameters:
Router::connectNamed(false, array('defaults' => true));
You can also set them within your route, if you prefer. More information on connecting named parameters here: http://book.cakephp.org/2.0/en/development/routing.html#controlling-named-parameters

Related

CakePHP routing to controller and page

Is it possible to identify a controller and pagename in the same url
Router::connect('/:controller/');
Router::connect('/:pagename/', array('controller' => 'home','action'=>'index'));
www.example.com/controller
so that the controller goes to the :controller/index
www.example.com/pagename
so that the page goes to home/index
Its really confusing what really you wants. If a url ends with :controller like www.example.com/posts its generally map index action. Now if the url ends with pagename, means action, like www.example.com/mypage, you can map that as-
Router::connect('/mypage', array('controller' => 'homes', 'action' => 'index'));
So when a user browse www.example.com/mypage, it will map to HomesController and index action.
Try following code for pagename:
Router::connect('/:slug', array('controller' => 'home', 'action' => 'index'));
UPDATE 1
If you want to treat www.example.com/user as same as www.example.com/users then you need to add following, because CakePHP controller name is plural as per CakePHP naming convention:
Router::connect('/user/:action/*', array('controller' => 'users'));
UPDATE 2
Router::connect(':slug') overwrite all of default routing. So you need to use custom routing class as like as :
App::uses('SlugRoute', 'Routing/Route');
Router::connect(
'/:slug',
array('controller' => 'home', 'action' => 'index'),
array('routeClass' => 'SlugRoute')
);

Routing all but certain parameters in CakePHP

I'm trying to set up a routing definition in my project which will allow users to have profiles accessible by simply using their username as the only parameter in the url, like www.example.com/username as opposed to www.example.com/user/view/username
I've set up a catch all route to go to an action which checks if the user exists, as the last route in the config file, and it works, but it over rides all of the basic routing that cake does. Meaning that I would have to define a route for every controller I want to provide access to just to make sure I never make it to the catchall. My routes:
Router::connect('/events/edit/*', array('controller' => 'events', 'action' => 'edit'));
Router::connect('/events/view/*', array('controller' => 'events', 'action' => 'view'));
Router::connect('/events/add', array('controller' => 'events', 'action' => 'add'));
Router::connect('/events/*', array('controller' => 'events', 'action' => 'index'));
Router::connect('/*', array('controller' => 'users', 'action' => 'view'));
So, this will allow me to access my events page, but any other pages get sent to the second router, expectedly.
What I'd like is to have is a route that does the basic cake function of /controller/action/param if the controller exists, but have it fall through to the last route which goes to the user/view page otherwise.
My question is, for what I'm trying to accomplish, am I doing this the right way? If I need to define a route for every controller I want access to, I will, but I have to think there's a better way to accomplish this.
Thanks
According to the my understanding of your question, I think You can proceed like this.
App::uses('UserRoute','Lib');
Router::connect('/:user_name', array('controller' => 'users', 'action' => 'view'),
array('routeClass'=>'UserRoute', 'pass' => array('user_name')));
and in your app/lib create a file UserRoute.php like this
<?php
App::uses('Lib', 'CakeRoute');
class UserRoute extends CakeRoute {
function parse($url) {
$params = parent::parse($url);
if (empty($params)) {
return false;
}
App::import('Model', 'User');
$User = new User();
$user_count = $User->find('count',array(
'conditions' => array('User.username' => $params['user_name']),
'recursive' => -1
));
if ($user_count) {
return $params;
}
return false;
}
}
Hope this will help you..

CakePHP Routing: Changing pretty URLs site-wide

Let's say I want a page to have a pretty URL:
Config/routes.php
Router::connect('/profile', array('controller' => 'users', 'action' => 'profile'));
If I want to send visitors to that page, I can use the URL like:
$this->redirect('/profile');
$this->Html->link('Your Profile', '/profile');
But let's say I change my mind and I now want the URL to be:
/account
How can I change the entire site without changing every instance of /profile to /account?
Alternatively...
Another way to ask my question would be how can I properly code all URLs using Cake array syntax (which I prefer to do rather than hardcode anything):
$this->redirect(array('controller' => 'users', 'action' => 'profile'));
$this->Html->link('Your Profile', array('controller' => 'users', 'action' => 'profile'));
And then ensure that any time that controller/action combination is called, it sends people to the URL:
/profile
And have this rule in one place that can be changed. Something like:
Router::connect(array('controller' => 'users', 'action' => 'profile'), '/profile');
// Later change to
Router::connect(array('controller' => 'users', 'action' => 'profile'), '/account');
Is there any way to do that, and also allow further request parameters to be passed along to be added to the URL?
Have a look at the routing documentation: http://book.cakephp.org/2.0/en/development/routing.html
In your app/routes.php add:
Router::connect('/profile', array('controller' => 'users', 'action' => 'profile'));
Now you can create your links like this:
echo $this->Html->link('Link to profile', array('controller' => 'users', 'action' => 'profile'));
Or if you want to allow additional parameters:
// When somebody comes along without parameters ...
Router::connect('/profile', array('controller' => 'users', 'action' => 'profile'));
// When somebody parses parameters
Router::connect('/profile/*', array('controller' => 'users', 'action' => 'profile'));
And then you will be able to do something like:
$userId = 12;
echo $this->Html->link('Link to other profile', array('controller' => 'users', 'action' => 'profile', $userId));
The $userId will then be available in the controller via:
echo $this->request->params['pass'][0];
// output: 12
This way you can easily change the url's of your website without having to change every single view/redirect or what so ever. Please bare in mind that you should not change your controller names! Because that will mess up a lot. Choose wisely ;-)
http://book.cakephp.org/2.0/en/development/routing.html
http://book.cakephp.org/2.0/en/core-libraries/helpers/html.html

Cake PHP route controller/action to other controller/action

How can I make cakePHP go to ef_users/logout when I click the users/logout link?
Thanks in advance
EDIT
This doesn't seem to work
Router::connect('/users/:action/*', array('controller' => 'ef_users', 'action' => 'logout'));
A couple of options:
Make the link point to the correct place in the first place
Use routing: http://book.cakephp.org/view/945/Routes-Configuration
Redirect the user with $this->redirect( url ): http://book.cakephp.org/view/982/redirect
If in doubt, just use as precise route as possible and put it near the top of the list
Router::connect('/users/logout', array('controller' => 'ef_users', 'action' => 'logout'));
You might also consider using logoutRedirect which will still log the user out using the standard CakePHP logout function then redirect the user to your ef_users logout action.
$this->Auth->logoutRedirect = array('controller' => 'ef_users', 'action' => 'logout');
More information at: http://book.cakephp.org/view/1271/logoutRedirect

How can I redirect the default home page to another page in CakePHP?

I need to redirect the default CakePHP home page / or (/pages/home) to /users/dashboard page
I tried
Router::connect('/', array('controller' => 'users', 'action' => 'dashboard'));
and
Router::connect('/pages/home', array('controller' => 'users', 'action' => 'dashboard'));
But both are not working
You should be able to do this by simply replacing this part of app/config/routes.php:
/**
* Here, we are connecting '/' (base path) to controller called 'Pages',
* its action called 'display', and we pass a param to select the view file
* to use (in this case, /app/views/pages/home.ctp)...
*/
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
.. with something like this:
/**
* Here, we are connecting '/' (base path) to controller called 'Users' and
* its action called 'dashboard' (ie. /users/dashboard)...
*/
Router::connect('/', array('controller' => 'users', 'action' => 'dashboard'));
I sense a slight misunderstanding of the topic when you try to map from '/pages/home' to your dashboard. '/pages/home' only seems like the home page because there exists a route for that. If you want to change the homepage, you need to change the existing Router::connect('/', ...) rule. If you create a new rule for '/', underneath, it won't be executed as CakePHP will match the first route it finds.
your first attempt
Router::connect('/', array('controller' => 'users', 'action' => 'dashboard'));
Is the correct way to do it. If you are still having problems then there must be another issue.
What error do you see?

Resources