1

現在、ヘッダー メニューのメイン カテゴリ リンクを最初のサブカテゴリに直接リンクするためのヘルプを探しています。

言い換えると:

カテゴリ リンクをクリックすると、最初のサブカテゴリの ID を最後に追加したいと思います。

route=product/category&path=18_59 

それ以外の

route=product/category&path=18

誰かがそれを行う方法を提案していますか?

<div id="menu">
  <ul>
    <?php foreach ($categories as $category) { ?>
    <li><a href="<?php echo $category['href']; ?>"><?php echo $category['name']; ?></a>
      <?php if ($category['children']) { ?>
      <div>
        <?php for ($i = 0; $i < count($category['children']);) { ?>
        <ul>
          <?php $j = $i + ceil(count($category['children']) / $category['column']); ?>
          <?php for (; $i < $j; $i++) { ?>
          <?php if (isset($category['children'][$i])) { ?>
          <li><a href="<?php echo $category['children'][$i]['href']; ?>"><?php echo $category['children'][$i]['name']; ?></a></li>
          <?php } ?>
          <?php } ?>
        </ul>
        <?php } ?>
      </div>
      <?php } ?>
    </li>
    <?php } ?>
  </ul>
</div>
4

1 に答える 1

1

スタックオーバーフローへようこそ!

これは、メイン カテゴリの最初の子を取得することで実現できます。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% うまくいくと信じています。

于 2013-06-14T11:39:27.387 に答える