1

在 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,那么他将被重定向到控制器类别的方法子类别。

如果我想添加更多类别和子类别,我将在路线上手动执行此操作,但如果我想添加子子类别(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

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

4

1 回答 1

2

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

配置/路由.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_idin 行,您将不得不循环或使用一堆连接来获取每个类别。如果您只有 3-4 个级别,它可能不是真正的问题,也可能不会经常更改,因此可以轻松缓存。如果您想要更有效的解决方案,请查看嵌套集模型。

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

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

配置/路由.php

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

可以扩展原始答案以执行此操作,将您不想发送到Products控制器的所有内容(基本上每个其他控制器的名称)列入白名单,并在最后有一条包罗万象的路线将其他人发送到Products控制器。404 url​​ 仍然需要处理。

配置/路由.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
于 2012-11-17T17:34:07.090 回答