【问题标题】:Codeigniter route products, categories and sub-categoriesCodeigniter 路由产品、类别和子类别
【发布时间】:2013-05-28 17:21:15
【问题描述】:

我正在为我的项目使用 Codeigniter。 我需要得到这样的 URL 结构:

主产品页面

example.com/language-prefix/products/

按类别选择产品

example.com/language-prefix/products/category

按类别和子类别选择产品:

example.com/language-prefix/products/category/sub-category

在类别和子类别下选择特定产品:

example.com/language-prefix/products/category/sub-category/product-name

或仅在类别下

example.com/language-prefix/products/category/product-name

问题是 - 对此有什么好的解决方案?因为问题从这里开始:

example.com/language-prefix/products/category/what-ever

what-ever 可以是产品或子类别以及如何决定 - 应返回哪些数据和视图?

在我的数据库表结构中,产品和类别之间存在多对多关系。这意味着,可以将一种产品分配到多个类别。每个类别都有一个自引用的外键(父)。

也许我需要为产品添加类别获得一些限制?或者指定一个主要类别或什么?

我有几个想法:

  1. 例如,将类别/子类别和产品的每条路线保留在 DB 中:

/产品/手表/男士/ /products/watches/for-men/rolex-abc-whatever-product

等等,等等。但是这个,我感觉可能会很慢。

  1. 创建一个到产品控制器的简单路由 -> 方法 view(),并在该方法中遍历所有通过的段以及何时进行

/products/category/what-ever

然后先检查是否存在这样的产品,如果是,则返回product_view和数据,如果没有,检查是否有这样的子类别,如果有,则返回产品网格,如果没有则返回404。

我假设一个简单的解决方案是在 /products/ 之后保留所有类别和子类别并添加 category-id 之类的

example.com/language-prefix/products/1-watches

example.com/language-prefix/products/2-for-men

但我希望有更好的解决方案。

我也想不通:

example.com/language-prefix/products/category/sub-category/product-name

我需要返回名称为 product-name 的产品,并检查它是否属于这两个类别,例如 URL:

example.com/language-prefix/products/hello-kity/bla-bla/product-name

不会退回该产品。

有更好的/其他解决方案吗?

【问题讨论】:

  • 我只是不明白“我也无法弄清楚这个......”这行之后的最后一部分,请详细说明。你的意思是它不会退回该产品?
  • 从浏览器 url 隐藏语言前缀有什么想法吗?

标签: codeigniter routes


【解决方案1】:

“将类别/子类别和产品的每条路线保留在数据库中”

上面的想法在 CI 中不能很好地工作,你可能会破坏 CI 路由的工作方式。请记住,该路线将您指向控制器/功能。只有当你到达那里时,你才能开始调用数据库......所以这个想法会很奇怪,因为你必须先调用数据库来匹配路由。

“为产品控制器创建一个简单的路由 -> 方法 view(),并在该方法中遍历所有通过的段以及 /products/category/what-ever” p>

上面的想法更好,你可以有这样的路由 $route['[a-z]{2}/products/(:any)'] = "product/index/$1"; 这样http://www.example.com/sg/products/gems/rubyhttp://www.example.com/sg/products/gems/red/ruby 都会去产品控制器的索引函数

segment(4) 可以是作为子类别的“red”或作为产品的“ruby”。 segment(3) 永远是一个类别。 segment(5) 要么是空的,要么是一个产品。您现在必须简单地确定优先级的产品或子类别是否更好地在您的代码逻辑中处理它们永远不会发生冲突。即产品和类别/子类别名称不能重复。

public function test($category = NULL, $sub_category_or_product = NULL, $product = NULL)
{
    echo $category.'<br />'; // segment(3) is always your category
    if ($product)
    {
        echo $sub_category_or_product.'<br />'; // segment(4) is a sub-category
        echo $product.'<br />'; // segment(5) is a product
    }
    else
    {
        echo $sub_category_or_product.'<br />'; // it's a sub-category or product
        // call the db and test whether its a sub-category
        // then test if its a product... or the other way around
    }
}

因为这只是解决它的众多可能方法之一...... 但是,如果您不必坚持使用该 URL 结构... 我建议您将产品/类别/子类别放在“列表视图”的 URL 中的“/products/”命名空间下。并将产品放在“/p/something”命名空间下以查看详细信息

www.example.com/p/ruby // product details
www.example.com/products // product listing
www.example.com/products/gems // product listing
www.example.com/products/gems/red // product listing

例如参见:

http://www.beautylish.com/products
http://www.beautylish.com/p/mac-mineralize-skinfinish-natural

这样您就不必担心类别/子类别名称与产品名称冲突

人们可能希望将猫和子猫放在产品 url 中以进行 seo ......但是如果你检查 beautylish 他们得到了非常好的 seo 而不会阻塞 url 并且只输入产品名称,它也更短并且更具可读性。

【讨论】:

  • 是的,SEO 是我的观点。但无论如何,你启发了我为产品详细信息创建了一种方法,为类别视图创建了另一种方法。但是为此我已经遇到了一种情况,我的客户想在两个不同的主要类别下添加两个具有相同名称的子类别。作为对此的临时解决方案,我在 URL 中添加了 category_id。所以现在可以访问类别,例如 > /products/45-clocks/ 和 > /products/34-clocks/ 从类别名称自动创建 Slugs。有什么好的做法吗?谢谢。
  • 你不需要把 id 放在 url 中(它丑陋的 imo)。子猫可以有相同的名字没有问题。因为您可以检查猫来区分子猫。我还有任何提示是建议也不需要 cat/subcat。只做产品/猫或产品/子猫,所以猫和子猫都只占1个部分……否则你可能只限制在两个级别吗?通过将其保持在一个段中,您可以在技术上拥有无限的水平。再次搜索引擎优化不会受到太大影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多