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

Тема в разделе "Opencart", создана пользователем KoNnY, 16 фев 2015.

Информация :
Внимание форумчане! При создании тем, или выкладывании какой-либо информации проверьте в какой ветке форума вы находитесь! Не путайте Opencart и Opencart2. При несоблюдении данного условия выносится соответствующее наказание! И потом не говорите что вас НЕ ПРЕДУПРЕЖДАЛИ! По возможности используйте обменники mail, yandex, google, dropbox, rghost Дабы избежать просьб перезалить и проблем с рекламой!
Модераторы: ZiX
  1. KoNnY

    KoNnY Постоялец

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

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

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

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

    drozd22

    Регистр.:
    17 июн 2011
    Сообщения:
    362
    Симпатии:
    283
    Если не ошибаюсь, то чекбокс показа в главном меню по логике админки работает только для главных родительских категорий. А у Вас все категории получились дочерними. Может стоит посмотреть код контроллера админки.
     
  3. KoNnY

    KoNnY Постоялец

    Регистр.:
    14 дек 2014
    Сообщения:
    67
    Симпатии:
    5
    Все правильно, я как раз и написал об этом, что родительской категорией в моем примере выступает лишь "Каталог".

    Если Вы имете ввиду контроллер админки 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 также никакого намека на отмеченный чекбокс...
     
    Последнее редактирование: 16 фев 2015
  4. drozd22

    drozd22

    Регистр.:
    17 июн 2011
    Сообщения:
    362
    Симпатии:
    283
    Так Вы все нужное нашли в 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
    
    На тестовом шопе у меня работает
     
    Последнее редактирование: 16 фев 2015
    KoNnY нравится это.
  5. KoNnY

    KoNnY Постоялец

    Регистр.:
    14 дек 2014
    Сообщения:
    67
    Симпатии:
    5
    Большое Вам спасибо! Проверил у себя, работает!
    А то я вместо "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'])
            );
         }
    }