tags:

views:

323

answers:

1

Is it possible in CakePHP to have URL aliases in routes.php? Or by what other means can achieve something equivalent:

Lets assume I have some paginated views. Among the possible orderings there are particular ones I want to bind to a simple URL. E.g.:

How do I add parameters to a Router::connect()? Pseudo code:

Router::connect('/'.__('headlines',true),
        array(
        'controller' => 'posts',
        'action' => 'listView'
        'params' => 'page:1/sort:Post.created/direction:desc',
        )
);
+2  A: 

Note that the Router "translates" a URL into Controllers, Actions and Params, it doesn't "forward" URLs to other URLs. As such, write it like this:

Router::connect('/headlines',
    array(
        'controller' => 'posts',
        'action' => 'listView'
        'page' => 1,
        'sort' => 'Post.created',
        'direction' => 'desc'
    )
);

I don't think '/'.__('headlines', true) would work, since the app is not sufficiently set up at this point to translate anything, so you'd only always get the word in your default language back. Also, you couldn't switch the language anymore after this point, the first use of __() locks the language.

You would need to connect all URLs explictly. To save you some typing, you could do this:

$headlines = array('en' => 'headlines', 'de' => 'schlagzeilen', ...);
foreach ($headlines as $lang => $headline) {
    Router::connect("/$headline", array('controller' => ..., 'lang' => $lang));
}

That will create a $this->param['named']['lang'] variable, which you should use in the URL anyway.

deceze
Don't you have to include the used parameters in the matching URL?/headlines/:page/:sort etc.If I can't use __ here it doesn't matter anymore :( Thanks for pointing that out!
sibidiba
@sibidiba A URL does not have a 1:1 relation with what controller action will get invoked and what parameters will be passed to it. It's just that by default the match is straight-forward. The Router is the place where the URL -> invocation transition happens, and it's where you can influence it greatly. See updated answer...
deceze
But the alias itself works just fine :)
sibidiba
@sibidiba Do you mean `'/'.__()` works? In different languages and all?
deceze