Cakephp 带分页器和文章的嵌套类别的SEO路由
具有嵌套类别(如/category/subcategory/n-subcategories/article)的人类可读URL。我使用的是CakePHP2.2.3,无法为路由问题找到合适的解决方案。使用两个表:Cakephp 带分页器和文章的嵌套类别的SEO路由,cakephp,tree,routes,slug,cakephp-2.2,Cakephp,Tree,Routes,Slug,Cakephp 2.2,具有嵌套类别(如/category/subcategory/n-subcategories/article)的人类可读URL。我使用的是CakePHP2.2.3,无法为路由问题找到合适的解决方案。使用两个表: 文章(也可以是产品、帖子或…) 只有一个正常的“单一”视图 一篇文章属于一类 类别 嵌套(具有n个级别的树行为) 一个类别可以有许多文章 类别视图列出与此类别相关的所有文章 类别视图使用paginator显示文章列表 我想这是一个很常见的例子。但我现在必须如何定义路由器,才能获
- 文章(也可以是产品、帖子或…)
- 只有一个正常的“单一”视图
- 一篇文章属于一类
- 类别
- 嵌套(具有n个级别的树行为)
- 一个类别可以有许多文章
- 类别视图列出与此类别相关的所有文章
- 类别视图使用paginator显示文章列表
/categoryname1 (showing category view)
/categoryname1/articlename1 (showing article view)
/categoryname2/articlename2 (showing article view)
/categoryname2/subcategoryname1 (showing category view)
/categoryname2/subcategoryname2/articlename4 (showing article view)
/n-categoryname/././...n-subcategoryname (showing category view)
/n-categoryname/././...n-subcategoryname/n-articlename (article view)
Router::connect(
'/*',
array('controller' => 'outputs', 'action' => 'index')
);
我试图在routes.php中修复所有路由,但这不是很舒服,我认为应该有一个动态解决方案
我还尝试自动生成所有类别外的路由-和文章别名,并将它们保存在一个单独的“路由”数据库表中-这是可行的,但我认为没有必要定义数百条单一路由
我还试图定义路由器中修复的所有类别,如
Router::connect(
'/any-category-name',
array('controller' => 'categories', 'action' => 'view', 1)
);
然后是文章
Router::connect(
'/any-category-name/:slug',
array('controller' => 'articles', 'action' => 'view'),
array('pass' => array('slug'))
);
但是使用这种方法,所有文章都可以在所有类别中获得,这不是一个好的解决方案。我想用
Router::connect(
'/:slug', ...
但我不知道如何继续,因为可能有两个不同的控制器和两个不同的视图(我也不知道在这种情况下分页是否仍然有效,如果我还想在安装中使用更多的控制器/操作,会发生什么)
我认为在Cake中获得带有两个控制器(类别和文章)的嵌套URL应该不那么困难吧?!谢谢你的建议 我想你必须检查两件事: 1) 检查url中的类别数,然后
2) 检查最后一个参数是类别还是项目 在(动态)路线内处理这两项检查可能非常困难。我建议只为所有这些请求创建一条路由,并在控制器中检查1)和2) 路线可能是这样的:
/categoryname1 (showing category view)
/categoryname1/articlename1 (showing article view)
/categoryname2/articlename2 (showing article view)
/categoryname2/subcategoryname1 (showing category view)
/categoryname2/subcategoryname2/articlename4 (showing article view)
/n-categoryname/././...n-subcategoryname (showing category view)
/n-categoryname/././...n-subcategoryname/n-articlename (article view)
Router::connect(
'/*',
array('controller' => 'outputs', 'action' => 'index')
);
我调用了这个route OutputController的控制器,因为它将是处理所有这些URL的输出的控制器
class OutputController extends AppController
{
public $uses = array('Article', 'Category');
public function index()
{
// Get n parameters from url (1)
$args = func_get_args();
$last_arg = $args[count($args) - 1];
// Check if this is an article (2)
$article = $this->Article->find('first', array(
'conditions' => array('Article.slug' => $last_arg
));
if (!empty($article)) {
$this->set('article', $article);
$this->render('article');
}
// Check if this is an category (2)
$category = $this->Category->find('first', array(
'conditions' => array('Category.slug' => $last_arg
));
if (!empty($category)) {
$this->set('category', $category);
$this->render('category');
}
// Page not found
if (empty($article) and empty($category)) {
throw new NotFoundException();
}
}
// ...
要显示文章,请使用“Output/article.ctp”视图。对于类别,CakePHP呈现“Output/category.ctp”。此外,您还可以使用$args中的参数来获取(子)类别的所有必要数据。非常感谢,我不得不这样尝试,但这似乎是一个很好的解决方案。我认为Category Slug和Article Slug必须是唯一的,这样才能工作,但如果我将路由存储在数据库表中,这也是必要的。。。非常感谢。