スタックオーバーフローへようこそ!
これは、メイン カテゴリの最初の子を取得することで実現できます。2 つのオプションがあります。
よりきれいなもの。これには、catalog/controller/common/header.php
およびモデルの変更が必要になりますcatalog/model/catalog/category.php
。ステップバイステップで進みましょう。まず、新しい必要な関数をカテゴリ モデルに追加します。
public function getCategoryFirstChildId($category_id) {
$query = $this->db->query('SELECT category_id FROM '. DB_PREFIX .'category WHERE parent_id = '. (int)$category_id .' ORDER BY category_id ASC LIMIT 1');
return $query->row['category_id'];
}
parent_id
この関数は、パラメータとして指定されたすべてのカテゴリを取得し、$category_id
昇順で並べ替えcategory_id
(任意の並べ替えに変更できます)、最初のカテゴリのみを返します。
それでは、コントローラーに行きましょう - カテゴリーがロードされる部分を編集します:
foreach ($categories as $category) {
if ($category['top']) {
// Level 2
$children_data = array();
$children = $this->model_catalog_category->getCategories($category['category_id']);
foreach ($children as $child) {
$data = array(
'filter_category_id' => $child['category_id'],
'filter_sub_category' => true
);
$product_total = $this->model_catalog_product->getTotalProducts($data);
$children_data[] = array(
'name' => $child['name'] . ($this->config->get('config_product_count') ? ' (' . $product_total . ')' : ''),
'href' => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id'])
);
}
/*NEW =>*/ $first_child_id = $this->model_catalog_category->getCategoryFirstChildId($category['category_id']);
// Level 1
$this->data['categories'][] = array(
'name' => $category['name'],
'children' => $children_data,
'column' => $category['column'] ? $category['column'] : 1,
'href' => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $first_child_id)
// >>> >>> >>> >>> >>> >>> >>> ^^^^^^^^^^^^^^^^^^^^^^^^
);
}
}
これでいいはずです。ただし、これはよりクリーンな方法であり、カテゴリごとにもう 1 つの DB クエリが必要になるため、多数のカテゴリが処理されている場合、サイトの速度が (わずかではありますが) 遅くなる可能性があることに注意してください。
簡単な方法- ヘッダー コントローラー内でのみ変更を行う必要があります (モデルに新しい関数は追加されません)。
foreach ($categories as $category) {
if ($category['top']) {
// Level 2
$children_data = array();
/*NEW =>*/ $first_child_id = 0;
/*NEW =>*/ $first_child = true;
$children = $this->model_catalog_category->getCategories($category['category_id']);
foreach ($children as $child) {
/*NEW =>*/ if($first_child) {
/*NEW =>*/ $first_child = false;
/*NEW =>*/ $first_child_id = $child['category_id'];
/*NEW =>*/ }
$data = array(
'filter_category_id' => $child['category_id'],
'filter_sub_category' => true
);
$product_total = $this->model_catalog_product->getTotalProducts($data);
$children_data[] = array(
'name' => $child['name'] . ($this->config->get('config_product_count') ? ' (' . $product_total . ')' : ''),
'href' => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id'])
);
}
// Level 1
$this->data['categories'][] = array(
'name' => $category['name'],
'children' => $children_data,
'column' => $category['column'] ? $category['column'] : 1,
'href' => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $first_child_id)
// >>> >>> >>> >>> >>> >>> >>> ^^^^^^^^^^^^^^^^^^^^^^^^
);
}
}
より簡単な方法も非常にうまく機能し、少し速くなりますが、それが指す最初のカテゴリは、昇順でソートするsort_order
ときに常に最初に来るカテゴリになります.変更される可能性があるときはいつでも、メインカテゴリは別の子を指します.カテゴリー...
私はどちらの方法もテストしていませんが、100% うまくいくと信じています。