CakePHP Routing help - php

I have the following link: <?php echo $this->Html->link($post['Portfolio']['title'],
array('controller' => 'portfolio', 'action' => 'view', Tiny::toTiny($post['Portfolio']['id']), Inflector::slug($post['Portfolio']['title'])),
array('title' => $post['Portfolio']['title'])); ?>
which creates urls like http://driz.co.uk/portfolio/view/3z/Paperview_Magazine
BUT I want to remove the view part of the url via the routing system. So far I have implemented this:
Router::connect('/portfolio/id:/slug:', array('controller' => 'portfolio', 'action' => 'view', 'id', 'slug'));
But it doesn't work. Can anyone help?

You should try this:
Router::connect('/portfolio/*', array('controller' => 'portfolio', 'action' => 'view'));

Related

CakePHP Routing - URL With Parameters Only

I have two function "product" and "view" in cakephp. If any one type domainname.com/item1 then call "product" function and if domainname.com/item1/item2 then call "view" function .
item1 and item2 is dynamic content.
Router::connect('/:category', array('controller' => 'Posts', 'action' => 'product'));
Router::connect('/:category/:title', array('controller' => 'Posts', 'action' => 'view'));
I use this code in routes.php
Problem is this if I enter domainname.com/item1 then it is call view function.
please suggest me how to use url rewriting in cakephp .
try to add /posts and specifie the order like this:
Router::connect('/posts/:category/:title',
array('controller' => 'Posts', 'action' => 'view'),
array(
// order matters since this will simply map ":category" to $category in your action
'pass' => array('category', 'title')
)
);
You can take a look to the doc http://book.cakephp.org/2.0/fr/development/routing.html
try this
Router::connect('/:category/:product',
array('controller' => 'posts', 'action' => 'view'),
array('pass' =>
array('product')
));
Router::connect('/:product', array('controller' => 'posts', 'action' => 'product'));

Can i hide controller and view name cake php 2?

I am using cake php and due to some reason i want to hide controller and action name from the url . current url us like
http://192.168.1.31/home/this_is_test
where home is controller name and this_is_test is slug which is dynamic . i want the url like
http://192.168.1.31/this_is_test.
my routes.php is
Router::connect('/', array('controller' => 'home', 'action' => 'index'));
Router::connect('/dashboard', array('controller' => 'dashboard', 'action' => 'index'));
Router::connect('/login', array('controller' => 'users', 'action' => 'login'));
Router::connect('/admin/login', array('controller' => 'users', 'action' => 'login', 'admin' => true));
Router::connect('/contents/*', array('controller' => 'contents', 'action' => 'view'));
Router::connect('/home/*', array('controller' => 'Home', 'action' => 'index'));
I have read a couple of solution after googling . also tried this in routes.php . but no luck
Router::connect(
'/:query',
array('controller' => 'Home', 'action' => 'index',1),
array('query' => '[a-zA-Z]+')
);
anybody have idea about this if it is possible??
Your solution
For static text try this:
Router::connect('/this_is_test', array(
'controller' => 'home',
'action' => 'this_is_test OR any_other action name'
));
If it's dynamic
Router::connect('/:id',
array('controller' => 'home', 'action' => 'index'),
array(
'pass' => array('id'),
array('id' => '[A-Za-z]')
)
);
References: Cakephp2.x Route
I hope I knew what you really want to achieve. You can place the Route in the last position. Here is the reference .
Other option would be to use alias for your controller. So you call your controller some thing else and set a new name for your controller then call it in you Route.
If this doesn't work then you would need to write a bespoke Component in order to help you to do that.

CakePHP routing multilingual blog with canonical links

I have the following routes set up on my CakePHP site
Router::connect('/:language/blog', array('controller' => 'posts', 'action' => 'index'), array('language' => 'en', 'persist'=>array('language')));
Router::connect('/:language/blogue', array('controller' => 'posts', 'action' => 'index'), array('language' => 'fr', 'persist'=>array('language')));
Router::connect('/:language/blog/:post_id', array('controller' => 'posts', 'action' => 'view'), array('language' => 'en', 'persist'=>array('language', 'post_id')));
Router::connect('/:language/blog/:post_id/:slug', array('controller' => 'posts', 'action' => 'view'), array('language' => 'en', 'persist'=>array('language', 'post_id', 'slug')));
Router::connect('/:language/blogue/:post_id', array('controller' => 'posts', 'action' => 'view'), array('language' => 'fr', 'persist'=>array('language', 'post_id')));
Router::connect('/:language/blogue/:post_id/:slug', array('controller' => 'posts', 'action' => 'view'), array('language' => 'fr', 'persist'=>array('language', 'post_id', 'slug')));
Which gives me URLs like /en/blog or /fr/blogue Is there a way to remove the language from appearing in the URL and have it just display /blog or /blogue (but still persist the language param)?
If that's not possible I can probably live with keeping the language in the url however this next bit is really important. I have something like this in my <head>
echo '<link rel="canonical" href="'. Router::url($this->request->here true) .'">';
where I'd like to include a canonical URL for SEO. I'd like the canonical URL to be simply /blog/123 but it is always showing as whatever the current url is ie. /en/blog/123/article-slug or /fr/blogue/123/article-slug. Does anyone know how I can get the desired behavior? (side question: does removing the slug part from the canonical url defeat the purpose of using friendly URLs for SEO?)
I solved it by changing my routes to these
Router::connect('/blog', array('controller' => 'posts', 'action' => 'index', 'language'=>'en'), array('persist'=>array('language')));
Router::connect('/blog/:post_id', array('controller' => 'posts', 'action' => 'view', 'language'=>'en'), array('persist'=>array('language', 'post_id')));
Router::connect('/blog/:post_id/:slug', array('controller' => 'posts', 'action' => 'view', 'language'=>'en'), array('persist'=>array('language', 'post_id', 'slug')));
Router::connect('/blogue', array('controller' => 'posts', 'action' => 'index', 'language'=>'fr'), array('persist'=>array('language')));
Router::connect('/blogue/:post_id', array('controller' => 'posts', 'action' => 'view', 'language'=>'fr'), array('persist'=>array('language', 'post_id')));
Router::connect('/blogue/:post_id/:slug', array('controller' => 'posts', 'action' => 'view', 'language'=>'fr'), array('persist'=>array('language', 'post_id', 'slug')));
and in my Posts controller View action I added
$this->set('canonical', Router::url(array('controller'=>'posts', 'action'=>'view', 'post_id'=>$post['Post']['id'], 'language'=>'en')));
And in the <head> section of my layout file I added
if (!isset($canonical)) {
$canonical = $this->request->here;
}
if ($canonical !== false) {
echo '<link rel="canonical" href="'. Router::url($canonical, true) .'">';
}
What about just removing the :language and setting it for each?:
Router::connect('/blogue/:post_id/:slug',
array('controller' => 'posts', 'action' => 'view'),
array('language' => 'fr', 'persist'=>array('post_id', 'slug')));
Router::connect('/blog/:post_id/:slug',
array('controller' => 'posts', 'action' => 'view'),
array('language' => 'en', 'persist'=>array('post_id', 'slug')));

cakePHP route element directs to missing controller action?

I'm trying to setup the following routing in cakePHP 2.3:
domain/news/slug
I've followed the cookbook guidelines on routing and the route that gets created is correct. The problem I run into is that when selecting the link I get the 'Missing Method in NewsController' error message.
Here's what I've configured:
Router::connect(
'/news/:slug/',
array('controller' => 'news', 'action' => 'view'),
array(
'pass' => array('slug'),
'slug' => '[^_]+'
)
);
I'm passing in the slug with a regular expression (any string that does not include an underscore).
This is my link in the index page:
<?php echo $this->Html->link(
$news['News']['title'],
array(
'controller' => 'news',
'action' => 'view',
'slug' => $news['News']['slug']
)
); ?>
As mentioned, the URL is built correctly, and looks like this: /news/test-slug-news-story
But when I click on it I get the 'Missing Method in NewsController' error message
Is it obvious what I'm missing, cause I've looked at this too long to be able to see it.
Thanks, Paul
You can try this one:
<?php
// Routing code
Router::connect('/news/:slug/',
array(
'controller' => 'news',
'action' => 'view'
),
array(
'slug' => '[a-zA-Z0-9_-]+'
)
);
?>
<?php
// HTML Link code.
echo $this->Html->link(
$news['News']['title'],
array(
'controller' => 'news',
'action' => 'view',
'slug' => $news['News']['slug']
)
);
?>
If it is not working for you please let me know :)
Thanks
As mentioned above, I discovered that by having a backslash after 'slug' in the route setting, the controller interprets the ':slug/' as the controller action.
One of those 'doh' moments.
Code should look like this:
Router::connect(
'/news/:slug',
array('controller' => 'news', 'action' => 'view'),
array(
'pass' => array('slug'),
'slug' => '[a-zA-Z0-9_-]+'
)
);

Cakephp Nested Routes

I've got a controller called Items and another one called Categories. Items may belong to different Categories.
The routes that I have are
/items
/items/:item_id
/items/categories
/items/categories/:category_id
And this is my routes.php
Router::connect('/items', array('controller' => 'items', 'action' => 'index');
Router::connect('/items/:item_id', array('controller' => 'items', 'action' => 'view'), array('pass' => array('item_id')), array("item_id" => "[0-9]+"));
Router::connect('/items/categories', array('controller' => 'categories', 'action' => 'index'));
Router::connect('/items/categories/:category_id', array('controller' => 'categories', 'action' => 'view', array('pass' => array('category_id')), array("category_id" => "[0-9]+"));
The problem is that the third route fails as it routes to the Items controller which it shouldn't.
How can I fix this problem?
be careful on the order of your routes... cake will match to the first occurrence, so try using your routes like this:
Router::connect('/items', array('controller' => 'items', 'action' => 'index');
Router::connect('/items/categories', array('controller' => 'categories', 'action' => 'index'));
Router::connect('/items/categories/:category_id', array('controller' => 'categories', 'action' => 'view', array('pass' => array('category_id')), array("category_id" => "[0-9]+"));
Router::connect('/items/:item_id', array('controller' => 'items', 'action' => 'view'), array('pass' => array('item_id')), array("item_id" => "[0-9]+"));
good luck
in you config/routes.php
put a line
Router::connect('/items/categories', array('controller' => 'categories',
'action' => 'index'));
or something similar.
it will redirect all you /items/categories to the index action of categories controller.
for admin pages (actions that use admin prefix):
Router::connect('/items/categories', array('controller' => 'categories',
'action' => 'index','admin'=>true));

Categories