1

Codeigniter で複数レベルのサブカテゴリを操作する最もスマートなソリューションは何ですか? 旅行代理店向けに旅行オファーを掲載する Web サイトを作成したいと考えています。構造は次のようになります。

- 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」の前にそれらをリストする必要があります" 次のような行:

config/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 しかない場合は、おそらくそれほど問題にはならないでしょう。また、頻繁に変更されることもないので、簡単にキャッシュできます。より効率的なソリューションが必要な場合は、ネストされたセットモデルを調べてください。

更新(リンクされたフォーラムから質問を拡大しました)

特別な404_overrideキー (ページの下部) を使用して、すべての要求を特定のコントローラーのindexメソッドに送ることができます。 コントローラー内で 404 URL を処理する必要があることを忘れないでください。Products:

config/routes.php

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

元の回答を拡張してこれを行い、コントローラーに送信したくないものすべてProducts(基本的には他のすべてのコントローラーの名前) をホワイトリストに登録し、最後にキャッチオール ルートを設定して、他のものをProductsコントローラーに送信します。404 URL はまだ処理する必要があります。

config/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
于 2012-11-17T17:34:07.090 に答える