Перейти к содержанию
alinalessioYandex

Четырех-уровневое верхнее меню.

Рекомендуемые сообщения

Пытаюсь в верхнем меню категорий вывести 4 уровня. Но не получается. Посмотрите, может подскажете в чем ошибка?

 

Контроллер header.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) {
                    $children_data2 = array();
                    $children2 = $this->model_catalog_category->getCategories($child['category_id']);

                    $children_data3 = array();
                    $children3 = $this->model_catalog_category->getCategories($child['category_id']);

                    foreach ($children2 as $child2) {

                        $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=' . $child['category_id'] . '_' . $child2['category_id']),'children' => $children_data3,
                        );
                    }

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

В шаблоне header.tpl

<nav id="menu" class="navbar">
        <div class="navbar-header"><span id="category" class="visible-xs"><?php echo $text_category; ?></span>
          <button type="button" class="btn btn-navbar navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse"><i class="fa fa-bars"></i></button>
        </div>
        <div class="collapse navbar-collapse navbar-ex1-collapse">
          <ul class="nav navbar-nav">
            <?php foreach ($categories as $category) { ?>
            <?php if ($category['children']) { ?>
            <li class="dropdown"><a href="<?php echo $category['href']; ?>" class="dropdown-toggle" data-toggle="dropdown"><?php echo $category['name']; ?></a>
              <div class="dropdown-menu">
                <div class="dropdown-inner">
                  <?php foreach (array_chunk($category['children'], ceil(count($category['children']) / $category['column'])) as $children) { ?>
                  <ul class="list-unstyled">
                    <?php foreach ($children as $child) { ?>
                      <li><a href="<?php echo $child['href']; ?>"><?php echo $child['name']; ?></a>
                          <?php     if ($child['children']) {?>
                               <div class="child"><ul class="list-unstyled">
                               <?php foreach ($child['children'] as $child) { ?>
                                  <li><a href="<?php echo $child['href']; ?>"><?php echo $child['name']; ?></a>
                                    <?php if ($child['children']) {?>
                                         <div class="child"><ul class="list-unstyled">
                                         <?php foreach ($child['children'] as $child) { ?>
                                            <li><a href="<?php echo $child['href']; ?>"><?php echo $child['name']; ?></a>
                                            </li>
                                        <?php } ?>
                                        </ul></div>
                                    <?php } ?>
                                  </li>
                              <?php } ?>
                              </ul></div>
                          <?php } ?>
                      </li>
                    <?php } ?>
                  </ul>
                  <?php } ?>
                </div>
                <a href="<?php echo $category['href']; ?>" class="see-all"><?php echo $text_all; ?> <?php echo $category['name']; ?></a> </div>
              </li>
              <?php } else { ?>
              <li><a href="<?php echo $category['href']; ?>"><?php echo $category['name']; ?></a></li>
              <?php } ?>
              <?php } ?>
              <li><a href="index.php?route=information/contact">Контакты</a></li>
            </ul>
          </div>
        </nav>

В итоге выводится три уровня меню. Четвертый не хочет. Что я не так сделал?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что даст такое меню в этой версии?Даже если всё это сделать,кликабельной ссылкой будет самая последняя категория.Разве нет?Остальные вроде как по клику будут открывать следующую....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сейчас выводится три уровня. При наведении на первый уровень у меня показываются все вложенные категории до третьего уровня. На любую можно кликнуть. Только четвертой не хватает.

 

Вот скан:
post-17307-0-29724600-1457554858_thumb.png

Изменено пользователем alinalessioYandex

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Вас вложенный foreach с именем, совпадающим с внешним foreach

 

Циклы {foreach} могут быть вложенными при условии, что их имена будут уникальными.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Вас вложенный foreach с именем, совпадающим с внешним foreach

 

Циклы {foreach} могут быть вложенными при условии, что их имена будут уникальными.

Не совсем понял, где именно совпадают?

foreach ($categories as $category) {

    ...

    foreach ($children as $child) {

        ...
   
        foreach ($children2 as $child2) {

Вложены друг в друга, но не повторяются. Или я не так понял?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты


<?php if ($child['children']) {?>

<div class="child"><ul class="list-unstyled">

<?php foreach ($child['children'] as $child) { ?>

<li><a href="<?php echo $child['href']; ?>"><?php echo $child['name']; ?></a>

<?php if ($child['children']) {?>

<div class="child"><ul class="list-unstyled">

<?php foreach ($child['children'] as $child) { ?>

<li><a href="<?php echo $child['href']; ?>"><?php echo $child['name']; ?></a>

</li>

<?php } ?>

</ul></div>

<?php } ?>

</li>

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не совсем понял, где именно совпадают?

foreach ($categories as $category) {

    ...

    foreach ($children as $child) {

        ...
   
        foreach ($children2 as $child2) {

Вложены друг в друга, но не повторяются. Или я не так понял?

 

Нужен еще один уровень вложенности

foreach ($children as $child) {

...

foreach ($children2 as $child2) {
...

foreach ($children3 as $child3) {

А у Вас только 

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

$children_data3 = array();
$children3 = $this->model_catalog_category->getCategories($child['category_id']); //т.е. $children2 == $children3

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Запутался. Перепробовал вложенность добавить, но не получается. Вы имеете ввиду, что у меня неправильно вложенность сейчас написана или у меня еще одного уровня нет? Уровней вложенности вроде 4, а зачем еще один?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это же Вы объявили массив $children_data3 и ничего с ним не делаете, он так и остается пустым

 

 

А неправильно вложенность написана в файле tpl.

 

<?php foreach ($child['children'] as $child) { ?>
<li><a href="<?php echo $child['href']; ?>"><?php echo $child['name']; ?></a>
<?php if ($child['children']) {?>
<div class="child"><ul class="list-unstyled">
<?php foreach ($child['children'] as $child) { ?>

 

Попробуйте сначала правильно сформировать выходной массив $data['categories'][] в header.php

Вывести его структуру можно командой 

print_r($data);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Код в контроллере будет выглядеть ПРИМЕРНО так:

 

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) 
 {
// Level 3
                    $children_data2 = array();
                    $children2 = $this->model_catalog_category->getCategories($child['category_id']);


   foreach ($children2 as $child2) 
     {
// Level 4
                        $children_data3 = array();
                        $children3 = $this->model_catalog_category->getCategories($child2['category_id']);


                        foreach ($children3 as $child3) 
     {
       $children_data3[] = array('name'  => $child3['name'] . ($this->config->get('config_product_count') ? ' (' . $product_total . ')' : ''),
                             'href'  => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child3['category_id'])); 
         }
       $children_data2[] = array('name'     => $child2['name'] . ($this->config->get('config_product_count') ? ' (' . $product_total . ')' : ''),
                         'href'     => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child2['category_id']),
 'children' => $children_data3); 
 }
   $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']),
'children' => $children_data2);
 } 


// Level 1
$this->data['categories'][] = array('name'     => $category['name'],
                               'children' => $children_data,
                               'active'   => in_array($category['category_id'], $parts),
                               'column'   => $category['column'] ? $category['column'] : 1,
                               'href'     => $this->url->link('product/category', 'path=' . $category['category_id']));
 }
 }
Изменено пользователем igon

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.