codeigniter类别 - >子类别 - > subsubcategory系统

时间:2010-02-04 11:55:47

标签: codeigniter

好吧,所以我对codeigniter很新,从现在学到的东西,我无法弄清楚如何创建动态category -> subcategory -> subsubcategory system。你可以给我一些指导方针......一些参考资料,任何指导我应该学习如何实现这一目标的东西?谢谢

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

3 个答案:

答案 0 :(得分:4)

我已经为PyroCMS中的页面管理器做了这个,但这不是一件容易的事。

每个页面都有自己的slug和parent_id,然后读取正确的页面,它遍历每个页面slug并加入子节点。它知道有多少孩子,所以如果有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

答案 1 :(得分:1)

你可以:

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

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

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

答案 2 :(得分:0)

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