Как сделать все подкатегории расширяемыми в выпадающем меню Opencart? - PullRequest
0 голосов
/ 11 марта 2019

У меня есть такие категории: категория> sub1> sub2 в выпадающем меню sub2 не расширяется.

Я должен щелкнуть sub1, чтобы увидеть sub2. Как это исправить?

Моя открытая версия 3.0.2

1 Ответ

0 голосов
/ 12 марта 2019

В OpenCart главное меню отображает только 2 уровня. верхний уровень и подуровень. второй подуровень не будет отображаться. вам нужно будет разработать это самостоятельно.

код логики меню можно найти в catalog/controller/common/menu.php

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) {
            $filter_data = array(
                'filter_category_id'  => $child['category_id'],
                'filter_sub_category' => true
            );

            $children_data[] = array(
                'name'  => $child['name'] . ($this->config->get('config_product_count') ? ' (' . $this->model_catalog_product->getTotalProducts($filter_data) . ')' : ''),
                'href'  => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id'])
            );
        }

        // Level 1
        $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'])
        );
    }
}

как видно только 2 уровня. Вы можете добавить код для расширения второго уровня аналогичным образом, включив его также как часть дочерних элементов в 1-й уровень.

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) {
            $filter_data = array(
                'filter_category_id'  => $child['category_id'],
                'filter_sub_category' => true
            );

            $children_data[] = array(
                'name'  => $child['name'] . ($this->config->get('config_product_count') ? ' (' . $this->model_catalog_product->getTotalProducts($filter_data) . ')' : ''),
                'href'  => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id'])
            );

            //level 3

            $children2 = $this->model_catalog_category->getCategories($child['category_id']);

            foreach ($children2 as $child2) {
                $filter_data = array(
                    'filter_category_id'  => $child2['category_id'],
                    'filter_sub_category' => true
                );
                 //adding everything to the second level
                $children_data[] = array(
                    'name'  => $child2['name'] . ($this->config->get('config_product_count') ? ' (' . $this->model_catalog_product->getTotalProducts($filter_data) . ')' : ''),
                    'href'  => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id'] . '_' .$child2['category_id'])
                );
            }
        }

        // Level 1
        $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'])
        );
    }
}

или вы можете добавить дочерние элементы на второй уровень в качестве третьего уровня, а затем в файле ветки добавить код для отображения дочерних элементов второго уровня.

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) {
            $filter_data = array(
                'filter_category_id'  => $child['category_id'],
                'filter_sub_category' => true
            );



            //level 3
            $children_data2 = array();

            $children2 = $this->model_catalog_category->getCategories($child['category_id']);

            foreach ($children2 as $child2) {
                $filter_data = array(
                    'filter_category_id'  => $child2['category_id'],
                    'filter_sub_category' => true
                );

                $children_data2[] = array(
                    'name'  => $child2['name'] . ($this->config->get('config_product_count') ? ' (' . $this->model_catalog_product->getTotalProducts($filter_data) . ')' : ''),
                    'href'  => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id'] . '_' .$child2['category_id'])
                );
            }

            $children_data[] = array(
                'name'  => $child['name'] . ($this->config->get('config_product_count') ? ' (' . $this->model_catalog_product->getTotalProducts($filter_data) . ')' : ''),
                'href'  => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id']),
                'children' => $children_data2
            );
        }

        // Level 1
        $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'])
        );
    }
}

и в файле ветки catalog/view/theme/default/template/common/menu.twig заменить этот код на line 16

<li><a href="{{ child.href }}">{{ child.name }}</a></li>

с этим

<li><a href="{{ child.href }}">{{ child.name }}</a>
    {% for child2 in child['children'] %}
         <li><a class="small" href="{{ child2.href }}"> > {{ child2.name }}</a></li>
    {% endfor %}
</li>
...