Помощь Удаление ненужных категорий из верхнего меню сайта

KoNnY

Постоялец
Регистрация
14 Дек 2014
Сообщения
64
Реакции
7
Добрый день!
Помогите, пожалуйста, решить проблему с выводом в верхнем меню только указанных в админке категорий. Как известно, у категорий есть опция (чекбокс) показывать пункт в главном меню , но она работает только для родительских категорий. На рассматриваем сайте раздел каталога выглядит следующим образом:

Каталог
- Спальни
-- Коллекция 1
-- Коллекция 2
- Кабинеты
- Гостиные
- Прихожие

Из примера видно, что только раздел Каталог является родительским, все остальные - дочерними к нему. Это было сделано для того, чтобы на сайте была разводящая страница "Каталог". Поэтому предложения изменить структуру - не подходят...

Верхнее меню было переработано и в нем выводятся только дочерние категории: Спальни, Кабинеты, Гостиные, Прихожие и т.д. Так вот нужно ограничить вывод некоторых из них, так например убрать вывод "Гостиные".
Не хочется делать обработку по id категории, а хочется все же воспользоваться этим чекбоксом для указания выводить данную категорию в меню или нет. За это отвечает параметр $category['top'], если я не ошибаюсь.
Я сам пробовал выводить проверку, но у меня почему то значения 1 у всех категорий, хотя у не выбранных должно быть значение 0.
 
Если не ошибаюсь, то чекбокс показа в главном меню по логике админки работает только для главных родительских категорий. А у Вас все категории получились дочерними. Может стоит посмотреть код контроллера админки.
 
Если не ошибаюсь, то чекбокс показа в главном меню по логике админки работает только для главных родительских категорий. А у Вас все категории получились дочерними. Может стоит посмотреть код контроллера админки.
Все правильно, я как раз и написал об этом, что родительской категорией в моем примере выступает лишь "Каталог".

Если Вы имете ввиду контроллер админки category.php, то там лишь следующий код:
PHP:
 if (isset($this->request->post['top'])) {
            $this->data['top'] = $this->request->post['top'];
        } elseif (!empty($category_info)) {
            $this->data['top'] = $category_info['top'];
        } else {
            $this->data['top'] = 0;
        }
Обычная проверка: отмечен или нет данный чекбокс

Я же смотрел в контроллере каталога header.php, но, по правде говоря, так и не нашел где в нем идет проверка на значение данного чекбокса. Единственно там есть условие:
PHP:
foreach ($categories as $category) {
            if ($category['top']) {
                // Level 2
                $children_data = array();

                $children = $this->model_catalog_category->getCategories($category['category_id']);
вот оно меня смущает. Но и здесь не понятно, где проверяется: нужно отображать пункт в меню или нет...

В самом шаблоне header.tpl также никакого намека на отмеченный чекбокс...
 
Последнее редактирование:
Так Вы все нужное нашли в header.php. Просто добавьте проверку по значению 'top' и для Level 2 меню. Я так вижу из этого:
Код:
        $categories = $this->model_catalog_category->getCategories(0);

        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'])
                    );                     
                }

                // Level 1
получаем это
Код:
        $categories = $this->model_catalog_category->getCategories(0);

        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) {
                  if ($child['top']) {
                    $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
На тестовом шопе у меня работает
 
Последнее редактирование:
Большое Вам спасибо! Проверил у себя, работает!
А то я вместо "if ($child['top'])", все проверку делал с "if ($category['top'])

Полагаю Ваше решение многим кому пригодится. Я, например, давно думал над решением, как можно манипулировать показом пунктов меню из категорий.

Для тех у кого в теме есть 3 вложенность, то аналогично прописываем:
PHP:
$level3 = $this->model_catalog_category->getCategories($child['category_id']);
                        $l3_data = array();
                        foreach ($level3 as $l3) {
                            if ($l3['top']) {
                                $l3_data[] = array(
                                    'category_id' => $l3['category_id'],
                                    'name'        => $l3['name'],
                                    'href'        => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id']. '_' . $l3['category_id'])
        );
     }
}
 
Назад
Сверху