2010-02-04 90 views
4

好吧,所以我很新codeigniter,从我所了解到现在我无法弄清楚如何创建一个动态category -> subcategory -> subsubcategory system。你可以给我一些指导方针吗...一些参考资料,任何指导我应该学会如何完成的内容?谢谢codeigniter类别 - >子类别 - > subsubcategory系统

我应该得到我的URL像这样www.site.com/category/subcategory/subsubcategory/etc...,你明白我的意思。

+0

您需要添加更多信息 - 你想把它当作eshop吗? CMS?或纯控制器? – 2010-02-04 11:57:55

+0

假设我想要一个文章系统 – kmunky 2010-02-04 11:58:59

回答

1

,你可以:

创建控制器category,重新路由一些URI来它和使用它的内部逻辑来解析它的参数来选择任何文章客户要求:

关于网址: http://codeigniter.com/user_guide/general/urls.html

关于URI路由: http://codeigniter.com/user_guide/general/routing.html

+0

“控制器类别”是什么意思?请问你能更具体吗?我该怎么做,你能举个例子吗?谢谢 – kmunky 2010-02-04 14:06:55

+0

好像你不知道什么是MVC。我建议你到谷歌MVC和阅读,然后去codeigniter,并阅读它的MVC的实施。 – 2010-02-04 17:42:08

+0

我知道控制器是什么(我知道如何使用CI,基本知识),我知道MVC的原理,我已经阅读了关于URL和路由的知识,但是你的建议仍然不会响。虽然我是MVC和CI的新手。 – kmunky 2010-02-04 19:24:47

4

我已经为PyroCMS中的页面管理器做了这个,但它不是简单的任务。

每个页面都有自己的slug和parent_id,然后阅读正确的页面,它循环浏览每个页面slu and并加入孩子。它知道有多少个孩子,所以如果有5个孩子,它会选择第5个自联表。

下面是代码示例:

public function get_by_path($segments = array()) 
{ 
// If the URI has been passed as a string, explode to create an array of segments 
if(is_string($segments)) 
    { 
    $segments = explode('/', $segments); 
    } 

// Work out how many segments there are 
    $total_segments = count($segments); 

// Which is the target alias (the final page in the tree) 
    $target_alias = 'p'.$total_segments; 

    // Start Query, Select (*) from Target Alias, from Pages 
    $this->db->select($target_alias.'.*'); 
    $this->db->from('pages p1'); 

    // Loop thorugh each Slug 
    $level = 1; 
    foreach($segments as $segment) 
    { 
     // Current is the current page, child is the next page to join on. 
     $current_alias = 'p'.$level; 
     $child_alias = 'p'.($level - 1); 

     // We dont want to join the first page again 
     if($level != 1) 
     { 
      $this->db->join('pages '.$current_alias, $current_alias.'.parent_id = '.$child_alias.'.id'); 
     } 

     // Add slug to where clause to keep us on the right tree 
     $this->db->where($current_alias . '.slug', $segment); 

     // Increment 
     ++$level; 
    } 

    // Can only be one result 
    $this->db->limit(1); 

    return $this->db->get()->row(); 
} 

这是一个有点坚果,但它完美。这可能非常慢,所以PyroCMS还维护一个查找表,其中包含id和页面URI以快速匹配。

你可以看到整个模型在这里:

http://github.com/philsturgeon/pyrocms/blob/master/application/modules/core/pages/models/pages_m.php

+0

感谢@Phil你的一段代码,我会尽力打破它。希望你能帮助我,如果我卡住了;)我不是新来的PHP,只是CI和MVC ...所以我希望我会得到它:) – kmunky 2010-02-09 22:23:51

0

我同意菲尔的想法,我也设想,你可以创建一个单独的模块(如果你使用的模块化扩展为例)来处理以通用的方式分类。然后你可以在任何其他项目中重用该模块。基本上,新模块可能能够处理类别和子类别(层次结构)。