如何在Codeigniter中使用多个子类别?

时间:2012-11-17 14:14:08

标签: codeigniter nested categories

在Codeigniter中使用多个子类别的最聪明的解决方案是什么?我想为旅行社制作一个旅行网站,结构将如下所示:

- Cat1
- Cat2
--- Subcat1
--- Subcat2
------ Subcat1
--------- Subcat1
--------- Subcat2
------------ Subcat1
------------ Subcat2
--------------- offer1
--------------- offer2
--------------- offer3
--------------- offerN
------------ Subcat3
--------- SubcatN
------ Subcat2
------ SubcatN
--- Subcat3
--- SubcatN
- Cat3
--- offer1
--- offer2
--- offer3
--- offerN
- CatN

这是嵌套类别的示例。每个(子)类别应具有:主图片,描述和子类别列表或要约列表。

我有一个想法,使用名为Categories(ID,cat_name,parent)的表,如果父级为0,则它​​是顶级类别,如果父级是某个int,则该值是ID父类别......

但我不知道如何用控制器解决路由问题?我知道如何只使用2个级别(主要类别和子类别),但手动将它们添加到路线中。我不知道如何动态地这样做,以便将来可以通过管理面板添加更多类别和子类别。

我当然会有另一张桌子供我提供,我知道,我也没有问题。问题是控制器的结构如何?

对于我目前只有1级子类别且没有动态添加子类别选项的项目,这里是我在routes.php中的内容

$route[‘cat1’] = “category”;
$route[‘cat1/(:any)’] = “category/subcategory”;

$route[‘cat2’] = “category”;
$route[‘cat2/(:any)’] = “category/subcategory”;

$route[‘cat3’] = “category”;
$route[‘cat3/(:any)’] = “category/subcategory”;

$route[‘cat4’] = “category”;
$route[‘cat4/(:any)’] = “category/subcategory”;

$route[‘cat5’] = “category”;

换句话说,cat1,2,3,4,5是类别的真实姓名,并且:any表示所有子类别,当访问者键入example.com/pc_news时,它被重定向到名为category的控制器它是索引功能。如果他输入example.com/pc_news/hardware,那么他将被重定向到控制器类别的方法子类别。

如果我想添加更多类别和子类别,我将在路线上手动完成,但如果我想添加subsubcategory(example.com/pc_news/hardware/something),我不知道如何实现。

在我想做的新项目上,我会有类似的东西:

example.com/summer/turkey/airplane/alanya/hotels # and it will list all the offers
example.com/summer/turkey/airplane/alanya/apartments
example.com/summer/turkey/bus/kushadasi
example.com/winter/bus/france/hotels
example.com/winter/airplane/france/hotels

有人知道如何做到这一点吗?

1 个答案:

答案 0 :(得分:2)

至于路由,我只是使用路由配置将所有内容发送到一个方法,你可以实现你想要的任何逻辑,如果你仍然想要在该控制器内访问的方法,你必须在它之前列出它们“赶上任何”这样的行:

配置/ routes.php文件

$route['products/save/(.*)'] = 'products/save/$1';
$route['products/(.*)']      = 'products/index/$1';

完成此设置后,您将获得Products::index方法中的所有参数:

控制器/ products.php

class Products extends CI_Controller {
    public function index() {
        $args = func_get_args();
        // now $args holds the url segments 
        $categories = array();
        foreach ($args as $cat_name) {
           $categories[] = $this->db
               ->from('categories')
               ->where('cat_name', $cat_name)
               ->get()
               ->row();
        }
    }
}

至于存储类别,如果行中只有parent_id,则必须循环或使用一组连接来获取每个类别。如果你只有3-4级,它可能不是真正的问题,也可能不会经常改变,所以它可以很容易地缓存。如果您想要更有效的解决方案,请查看nested set模型。

更新(我已从链接的论坛扩展了问题)

您可以使用特殊的404_override键(位于页面底部)将每个请求转到特定控制器的index方法。 不要忘记您需要在Products控制器内处理404网址!

配置/ routes.php文件

$route['404_override'] = 'products';

原始答案可以扩展为执行此操作,将您不想发送给Products控制器的所有内容列入白名单(基本上是每个其他控制器的名称),并在最后使用全部路由发送其他的到Products控制器。 404网址仍然需要处理。

配置/ routes.php文件

// place any specific rules on top
$route['about'] = 'main/about';
// have whitelist existing controllers, make them go to their original place like it normaly would
$route['(controller1|controller2|controller3)(/?.*)'] = '$1$2';
$route['(:any)'] = 'products/index/$1'; // the last "catch all" row goes here