Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/cakephp/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cakephp 带分页器和文章的嵌套类别的SEO路由_Cakephp_Tree_Routes_Slug_Cakephp 2.2 - Fatal编程技术网

Cakephp 带分页器和文章的嵌套类别的SEO路由

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显示文章列表 我想这是一个很常见的例子。但我现在必须如何定义路由器,才能获

具有嵌套类别(如/category/subcategory/n-subcategories/article)的人类可读URL。我使用的是CakePHP2.2.3,无法为路由问题找到合适的解决方案。使用两个表:

  • 文章(也可以是产品、帖子或…)
    • 只有一个正常的“单一”视图
    • 一篇文章属于一类
  • 类别
    • 嵌套(具有n个级别的树行为)
    • 一个类别可以有许多文章
    • 类别视图列出与此类别相关的所有文章
    • 类别视图使用paginator显示文章列表
我想这是一个很常见的例子。但我现在必须如何定义路由器,才能获得具有嵌套类别的URL路径,如下所示:

/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必须是唯一的,这样才能工作,但如果我将路由存储在数据库表中,这也是必要的。。。非常感谢。