Infinitus分類は、データ管理における一般的な分類方法であり、製品や記事分類などのマルチレベルおよびマルチサブカラスのシナリオに適しています。この記事では、ThinkPhp5フレームワークを通じて、完全なプロセスとインフィニタス分類コードを設計および実装する方法について説明します。
Infinitus分類により、分類が複数のサブカテゴリを持つことができ、各サブカテゴリは、レイヤーネック付き分類システムを形成するための独自のサブカテゴリを継続することもできます。この構造は、複雑な分類関係を管理および表示するのに柔軟で便利です。
Infinitus分類を実装するには、通常、次のフィールドを含む分類テーブルを作成する必要があります。
ThinkPhp5では、モデルクラスを使用して分類データを動作させます。次の例では、カテゴリモデルを定義し、直接サブクラスを取得し、すべてのサブクラスを再帰的に取得する方法を実装します。
namespace app\index\model;
use think\Model;
class Category extends Model
{
// テーブル名を指定します(デフォルトのルールが満たされていない場合)
protected $table = 'category';
// 現在の分類の直接サブカテゴリを取得します
public function childrenCategories()
{
return $this->hasMany('Category', 'parent_id', 'id')
->order('id', 'asc');
}
// すべてのサブカテゴリを再帰的に取得します,サブカテゴリを含むサブカテゴリ
public function allChildrenCategories()
{
return $this->childrenCategories()->with('allChildrenCategories');
}
}
上記の方法では、ThinkPHPの関連モデル関数を使用して、分類階層データを柔軟に取得します。
コントローラーは、モデルを介して分類情報をクエリして操作できます。サンプルコードは第1レベルの分類を取得し、トラバーサルはサブクラスを取得します。
$categories = Category::where('parent_id', 0)->select();
foreach ($categories as $category) {
$childrenCategories = $category->childrenCategories;
// ここでサブクラス化を処理できます
}
特定のカテゴリのすべてのサブカテゴリを取得する必要がある場合(マルチレベルのサブカテゴリを含む)、使用できます。
$allChildrenCategories = $category->allChildrenCategories;
この方法は、より多くの操作を実行し続けることができる連想モデルのコレクションを返します。
ビューでは、マルチレベルの分類データを表示するために、再帰関数を使用して階層的インデント表示を実装できます。
function renderCategories($categories, $indent = 0)
{
foreach ($categories as $category) {
echo str_repeat(' ', $indent);
echo $category->name . '<br/>';
renderCategories($category->childrenCategories, $indent + 1);
}
}
renderCategories($categories);
さらに、ThinkPHP5テンプレートエンジンは、 Volistタグを使用したカテゴリの再帰レンダリングをサポートしています。
<ul>
{volist name="categories" id="category"}
<li>{$category.name}</li>
{volist name="category.childrenCategories" id="child"}
<ul>
<li>{$child.name}</li>
{include file="category_tree" /}
</ul>
{/volist}
{/volist}
</ul>
この方法はシンプルでメンテナンスが簡単で、マルチレベルの分類の再帰的表示を実現します。
合理的なデータテーブル構造、モデル関係の定義、再帰表示により、ThinkPhp5は、複雑な分類ニーズを満たすために、無限の分類関数を効率的かつ柔軟に実装できます。この記事の紹介コードとサンプルコードが、プロジェクトにマルチレベルの分類を実装するのに役立ち、参照できることを願っています。