1

我正在为我的项目使用 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

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

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

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

我有几个想法:

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

/products/watches/for-men/ /products/watches/for-men/rolex-abc-whatever-product

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

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

/产品/类别/什么

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

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

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

不会退回该产品。

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

4

1 回答 1

0

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

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

“制作一条通往产品控制器的简单路线 -> 方法 view(),并在该方法中遍历所有通过的段以及 /products/category/what-ever”

上面的想法更好,你可以有这样的路线,$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 结构...我建议您将产品/类别/子类别放在“/ products /" 在“列表视图”的 URL 中命名空间。并将产品放在“/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 并且只输入产品名称,它也更短且更具可读性。

于 2013-06-02T18:19:16.440 回答