Codeigniter路线产品,类别和子类别

时间:2013-06-02 10:17:27

标签: codeigniter routes

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

主要产品页面

  

example.com/language-prefix/products /

按类别选择产品

  

example.com/language-prefix/products/category

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

  

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

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

  

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. 保留DB中类别/子类别和产品的每条路线,例如:
  2.   

    /产品/手表/换男人/   /产品/手表/换男人/劳力士-ABC-任何副产物

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

    1. 制作一条到产品控制器的简单路线 - >方法view(),并在方法中通过所有传递的段和
    2.   

      /产品/分类/什么有史以来

      然后首先检查是否存在这样的产品,如果是,则返回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

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

        

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

      不会退回该产品。

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

1 个答案:

答案 0 :(得分:0)

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

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

“创建一个到产品控制器的简单路径 - &gt;方法视图(),并在方法中通过所有传递的段,当涉及到/ 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都将转到产品控制器的索引功能

段(4)可以是作为子类别的“红色”或作为产品的“红宝石”。段(3)总是一个类别。段(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
    }
}

of cuz这只是解决问题的众多方法之一...... 但是,如果您不必坚持使用该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

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

人们可能想把猫和猫咪放在产品网址中进行搜索......但是如果你检查一下美丽的话,他们会得到非常好的seo而不会堵塞网址而只是简单地只放置产品名称,它也会更短,更具可读性。