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

[Решено] Почему foreach (opencart) выдаёт только последний результат?

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

Всех приветствую. Подскажите, пожалуйста, что делаю не так. Пытаюсь вывести меню следующего вида:
-Категория 1
---производитель 2
---производитель 6
-Категория 2
---производитель 3
---производитель 5
---производитель 2
-Категория 3
---производитель 1

т.е. под категорией должны появиться производители, содержащиеся в ней. 
И почти всё получается, кроме одного - во всех категориях выводятся производители, принадлежащие последней категории. 

В контроллере это выглядит так:

$categories = $this->model_catalog_category->getCategories(0);

    foreach ($categories as $category) {
      if ($category['top']) {
        

                // Level 2
        $children_data = array(); //1

        $children = $this->model_catalog_category->getCategories($category['category_id']); //2

        foreach ($children as $child) { //3
          $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'])
        );
                
                
                //manufacturers menu
                
                $manufacturers = $this->model_catalog_category->getManufacturers($category['category_id']); //2
                
                $data['manufacturers'] = array(); //1
                foreach ($manufacturers as $manufacturer)  { //3
                       $data['manufacturers'][] = array (
                       'manufacturer_id' => $manufacturer['manufacturer_id'],
                       'thumb' => $manufacturer['image'],
                       'name' => $manufacturer['name'],
                       'href' => $this->url->link('product/category', 'path=' . $category['category_id'] . '&manufacturer_id=' . $manufacturer['manufacturer_id'])
                        );
                }
                 
                
      }
    }



В view так:
 

<?php foreach ($categories as $category) { ?>
            <b><a href="<?php echo $category['href']; ?>"><?php echo $category['name']; ?></a></b> <br> 
            <?php foreach ($manufacturers as $manufacturer) { ?>
                     ----    <a href="<?php echo $manufacturer['href'] ?>"><?php echo $manufacturer['name'] ?> (<?php echo $manufacturer['thumb'] ?>)</a> <br>
            <?php } ?>
        <?php } ?>



Если аналогичным образом делаю для level 2- всё отлично работает. С производителями - никак =( 

Заранее благодарю за помощь.

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


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

Просто у ОК собственный интерпретатор php, где foreach работает иначе, чем в стандартной версии :-D

 

А если серьёзно, то прежде всего вот:

$data['manufacturers'] = array(); //1

Вы на каждой итерации цикла обнуляете содержимое массива manufacturers. В результате под конец работы цикла там остаётся только содержимое из последней итерации.

 

Ну и, в принципе, подход неправильный - у вас manufacturers никак не привязаны к категориям. Если б вы не обнуляли этот массив, то у вас бы для каждой категории выводился полный список производителей.

Этот массив должен быть внутри этого блока:

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

 

  • +1 1

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


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

Dotrox, спасибо за наводку, попробую. А производитель связан с категорией, там расширенная модель. 
Я, к сожалению, php знаю крайне поверхностно, поэтому из кусков собираю =( 

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


Ссылка на сообщение
Поделиться на другие сайты
14 минут назад, wotanweb сказал:

А производитель связан с категорией, там расширенная модель. 

Но при выводе он у вас сейчас ни с чем не связан: есть просто совершенно самостоятельный массив manufacturers, который в шаблоне будет общим для всех категорий.

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


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

Dotrox, спасибо за наводку!  Почти осилил. Теперь выводит только производителей. относящихся к нужной категории. Но одна беда - они, почему-то, дублируются. $data['manufacturers'] = array(); пробовал убирать - только хуже. Переносы тоже особого толку не дают...
Т.е. 

В чём тут беда?

 

view теперь Такой:

<?php foreach ($categories as $category) { ?>
            <b><a href="<?php echo $category['href']; ?>"><?php echo $category['name']; ?></a></b> <br> 
            
             <?php foreach ($category['manuf'] as $manufacturer) { ?>
              
                <?php foreach ($manufacturer as $manufact) { ?>
                ---<a href="<?php echo $manufacturer['href']; ?>"><?php echo $manufacturer['name']; ?></a> <br>
                <?php } ?>
             
              <?php } ?>
        <?php } ?>



Контроллер Такой:
 

$data['manufacturers'] = array();
                
                $manufacturers = $this->model_catalog_category->getManufacturers($category['category_id']); //2
            
                foreach ($manufacturers as $manufacturer)  { //3
                       $data['manufacturers'][] = array (
                       'manufacturer_id' => $manufacturer['manufacturer_id'],
                       'thumb' => $manufacturer['image'],
                       'name' => $manufacturer['name'],
                       'href' => $this->url->link('product/category', 'path=' . $category['category_id'] . '&manufacturer_id=' . $manufacturer['manufacturer_id'])
                        );
                }
                
                
                
        // Level 1
        $data['categories'][] = array(
                    'manuf'    => $data['manufacturers'],
          'name'     => $category['name'],
          'children' => $children_data,
          'column'   => $category['column'] ? $category['column'] : 1,
          'href'     => $this->url->link('product/category', 'path=' . $category['category_id'])
        );



 

 

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

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


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

странная связка категории и производителя

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


Ссылка на сообщение
Поделиться на другие сайты
26 минут назад, wotanweb сказал:

они, почему-то, дублируются

Я же об этом уже писал выше.

У вас неправильный подход, в принципе. И сейчас вы только ещё больше запутались.

 

$data['manufacturers'] вообще не нужен. Вот:

$category_manufacturers = [];

$manufacturers = $this->model_catalog_category->getManufacturers($category['category_id']); //2

if(!empty($manufacturers)){
  foreach ($manufacturers as $manufacturer)  { //3
    $category_manufacturers[] = array (
      'manufacturer_id' => $manufacturer['manufacturer_id'],
      'thumb' => $manufacturer['image'],
      'name' => $manufacturer['name'],
      'href' => $this->url->link('product/category', 'path=' . $category['category_id'] . '&manufacturer_id=' . $manufacturer['manufacturer_id'])
    );
  }
}

// Level 1
$data['categories'][] = array(
  'manufacturers'    => $category_manufacturers,
  'name'     => $category['name'],
  'children' => $children_data,
  'column'   => $category['column'] ? $category['column'] : 1,
  'href'     => $this->url->link('product/category', 'path=' . $category['category_id'])
);

 

А в шаблоне так:

<?php foreach ($categories as $category) { ?>
  <b><a href="<?php echo $category['href']; ?>"><?php echo $category['name']; ?></a></b> <br>
  <?php foreach ($category['manufacturers'] as $manufacturer) { ?>
    ---<a href="<?php echo $manufacturer['href']; ?>"><?php echo $manufacturer['name']; ?></a> <br>
  <?php } ?>
<?php } ?>

 

  • +1 1

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


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

Dotrox, спасибо Вам огромное! Выручили просто невероятно. 

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


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

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

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

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

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

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

Войти

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

Войти

  • Похожий контент

    • От splka
      Скачать/Купить дополнение


      Видео на странице товара для OCPro 2.3 Unishop
      За основу был взят vqmod_product_video_tab_1.5.4.1.zip 1.4 от stalker780.
      Код переделан под то, что имеется в наличии а именно Unishop+Opencart.Pro 2.3.0.2.5
      Как ставить - через установку модификаторов.
      После установки надо обновить кеш модификаторов.
      После этого в товаре появится вкладка - Видео(см. картинку)
      На youtube открываете нужное видео, под ним ищете "поделиться", выбираете "html код", выставляете размеры видео и копируете код из окошка.
      Должно получится что-то вроде:
      <iframe width="420" height="315" src="http://www.youtube.com/embed/gi3DHl1216U" frameborder="0" allowfullscreen></iframe> Примечание:
      Модуль создавался и проверялся на OpenCart 1.5.1.3 + vQmod 2.1.4 + default шаблон.
      был портирован и тестирован на связке OCPro 2.3, Unishop
      !!!Внимание!!! Каждый ролик должен быть внесен одной отдельной строкой.
      Иначе в закладке будет неправильно отображаться количество роликов.
      Модуль считает количество переносов "/n" в поле "youtube_code".
      В таком случае не важно в какой тег вы вставляете видео <iframe> <object> и пр.

      Модуль распространяется as is.
      Поддержку не оказываю.
      Если хотите отблагодарить - пишите в личку:)
      Добавил splka Добавлено 10.11.2018 Категория Модули Системные требования Сайт разработчика Старая цена Метод активации Без активации Ioncube Loader Нет OpenCart 2.3 ocStore 2.3 OpenCart.Pro, ocShop Opencart.pro 2.3  
    • От Bistore
      Добрый день помогите выбрать добить модуль личных количественных скидок на каждого пользователя отдельно в ограниченном виде!
      Получается
      1) Можно сравнить количество скидок на товар и количество купленных товаров пользователей(только авторизованные будут) сравнивая по айди товара и купленого товара минусовать количество скидок от купленного товара и выводить есть ли скидочный товар или же нет( или какое количество осталось).
       
      2) Я вывел sql  запросом уже в пользователе количество скидочных товаров минус количество купленного товара по айди ----- и теперь нужно по айди сравнить купленный товар и товар связать и по полю kolichestvo которое получилось в пользователе смотреть Kol=>0 ? или меньше и тд  
      Как лучше сделать?
      Как связать купленный товар(этим пользователем)  и товар на сайте?
      В файле который добавил в этот вопрос есть код корзины где осуществил все (jan - это количество скидок на товар) 
      cart.php
    • От shyn
      Скачать/Купить дополнение


      Basecart шаблон для OpenСart
      Описание
      Basecart - базовый, бесплатный шаблон для OpenCart 2.x и OpenCart 3.x со встроенными цветовыми схемами Bootswatch.
      Простота и лёгкость шаблона позволяют использовать его для разных типов интернет магазинов.
      Быстрая скорость загрузки страниц сделает магазин приятным в использовании для покупателей.
       
      Друзья, чтобы у Вас не возникло никаких проблем при использовании шаблона, внимательно читаем раздел Установка.
       
      Демо магазин
       
       
      Основные возможности
      - Простая установка
      - Адаптивный дизайн
      - 17 цветовых схем
      - 2 типа цвета шапки для каждой цветовой схемы
      - Шаблон построен с использованием Bootstrap 3
      - Удобное переключение цветовых схем
      - Хорошая отзывчивость и высокая скорость работы
       
       
      Совместимость
      - OpenCart 3.0.2.0
      - OpenCart 3.0.1.2
      - OpenCart 3.0.0.0
      - OpenCart 2.3.0.2
      - OpenCart 2.3.0.1
      - OpenCart 2.3.0.0
      - OpenCart 2.2.0.0
      - OpenCart 2.1.0.2
      - OpenCart 2.1.0.1
      - OpenCart 2.0.3.1
       
      Поддерживаются также соответствующие версии ocStore и OpenCart "Русская сборка"
       
       
      Изменения
      14.11.2018
      - Исправлено отображение списка подкатегорий (OpenCart 3)
       
      09.04.2018
      - Исправлено отображение опций товара в корзине (OpenCart 3)
      - Исправлен счетчик количества товаров (OpenCart 3)
       
      04.03.2018
      - Добавлена поддержка OpenCart 3.x
       
      10.01.2017
      - Незначительные улучшения
       
      02.01.2017
      - Изменен формат установки
       
      03.12.2016
      - Исправлен модуль управления темой (OpenCart 2.3.0.x)
       
      04.09.2016
      - Добавлена поддержка OpenCart 2.3.0.x
       
      16.06.2016
      - Добавлена поддержка OpenCart 2.2.0.0 и ocStore 2.1.0.2.1
       
      16.02.2016
      - Незначительные исправления
       
      10.01.2016
      - Исправлена ошибка с капчей на странице возврата товара (OpenCart 2.1.0.1)
       
      12.10.2015
      - Добавлена поддержка OpenCart 2.1.0.1
       
       
      Установка
      OpenCart 2
      1. Скачать zip архив.
      2. В архиве находятся файлы установщики, названия которых оканчиваются на *.ocmod.zip (Распаковка не требуется).
      3. Перед началом установки убедитесь, что в установленном OpenCart настроен доступ по FTP.
      Система -> Настройка -> [Редактировать] -> FTP
      Если OpenCart установлен локально или по каким-то причинам необходимо произвести установку шаблона без настройки FTP, скачайте и установите модуль QuickFix, который позволяет устанавливать дополнения без настроенного FTP доступа.
      4. Выбрать и установить файл темы для соответствующей версии OpenCart.
      Дополнения -> Установка дополнений -> [Загрузить]
      5. Обновить кеш модификаторов.
      Дополнения -> Менеджер дополнений -> [Сброс]/[Обновить]
      6. Выбрать установленную тему basecart из списка.
      Дополнения -> Дополнения -> Шаблоны -> [Редактировать] -> Папка шаблона -> basecart
      7. Сохранить
       
      OpenCart 3
      1. Скачать zip архив.
      2. В архиве находятся файлы установщики, названия которых оканчиваются на *.ocmod.zip (Распаковка не требуется).
      3. Выбрать и установить файл темы для соответствующей версии OpenCart.
      Модули/Расширения -> Установка расширений -> [Загрузить]
      4. Обновить кеш модификаторов.
      Модули/Расширения -> Модификаторы -> [Очистить]/[Обновить]
      5. Выбрать установленную тему basecart из списка.
      Модули/Расширения -> Модули/Расширения -> Темы -> [Редактировать] -> Директория темы -> basecart
      6. Сохранить
       
      Если, по каким-то причинам, шаблон был установлен путем простого копирования файлов, без использования установщика дополнений, нужно дополнительно установить модификатор шаблона (файл install.xml), найти его можно при распаковке архива, название которого оканчивается на *.ocmod.zip. Установка модификатора производится через: Дополнения -> Установка дополнений. Перед установкой install.xml необходимо переименовать в install.ocmod.xml. После установки - обновить кеш модификаторов.
       
      Переключение цветовых схем:
      OpenCart 2
      Дополнения -> Дополнения -> Модули -> Basecart -> [Установить] / [Редактировать]
       
      OpenCart 3
      Модули / Расширения -> Модули / Расширения -> Модули -> Basecart -> [Активировать] / [Редактировать]
      Добавил shyn Добавлено 21.07.2015 Категория Бесплатные шаблоны Системные требования Сайт разработчика http://themefiber.com Старая цена Метод активации Без активации Ioncube Loader Нет OpenCart 3.0
      2.3
      2.2
      2.1
      2.0 ocStore 3.0
      2.3
      2.2
      2.1 OpenCart.Pro, ocShop Opencart.pro 2.3
      Opencart.pro 2.1  
    • От shyn
      Описание
      Basecart - базовый, бесплатный шаблон для OpenCart 2.x и OpenCart 3.x со встроенными цветовыми схемами Bootswatch.
      Простота и лёгкость шаблона позволяют использовать его для разных типов интернет магазинов.
      Быстрая скорость загрузки страниц сделает магазин приятным в использовании для покупателей.
       
      Друзья, чтобы у Вас не возникло никаких проблем при использовании шаблона, внимательно читаем раздел Установка.
       
      Демо магазин
       
       
      Основные возможности
      - Простая установка
      - Адаптивный дизайн
      - 17 цветовых схем
      - 2 типа цвета шапки для каждой цветовой схемы
      - Шаблон построен с использованием Bootstrap 3
      - Удобное переключение цветовых схем
      - Хорошая отзывчивость и высокая скорость работы
       
       
      Совместимость
      - OpenCart 3.0.2.0
      - OpenCart 3.0.1.2
      - OpenCart 3.0.0.0
      - OpenCart 2.3.0.2
      - OpenCart 2.3.0.1
      - OpenCart 2.3.0.0
      - OpenCart 2.2.0.0
      - OpenCart 2.1.0.2
      - OpenCart 2.1.0.1
      - OpenCart 2.0.3.1
       
      Поддерживаются также соответствующие версии ocStore и OpenCart "Русская сборка"
       
       
      Изменения
      14.11.2018
      - Исправлено отображение списка подкатегорий (OpenCart 3)
       
      09.04.2018
      - Исправлено отображение опций товара в корзине (OpenCart 3)
      - Исправлен счетчик количества товаров (OpenCart 3)
       
      04.03.2018
      - Добавлена поддержка OpenCart 3.x
       
      10.01.2017
      - Незначительные улучшения
       
      02.01.2017
      - Изменен формат установки
       
      03.12.2016
      - Исправлен модуль управления темой (OpenCart 2.3.0.x)
       
      04.09.2016
      - Добавлена поддержка OpenCart 2.3.0.x
       
      16.06.2016
      - Добавлена поддержка OpenCart 2.2.0.0 и ocStore 2.1.0.2.1
       
      16.02.2016
      - Незначительные исправления
       
      10.01.2016
      - Исправлена ошибка с капчей на странице возврата товара (OpenCart 2.1.0.1)
       
      12.10.2015
      - Добавлена поддержка OpenCart 2.1.0.1
       
       
      Установка
      OpenCart 2
      1. Скачать zip архив.
      2. В архиве находятся файлы установщики, названия которых оканчиваются на *.ocmod.zip (Распаковка не требуется).
      3. Перед началом установки убедитесь, что в установленном OpenCart настроен доступ по FTP.
      Система -> Настройка -> [Редактировать] -> FTP
      Если OpenCart установлен локально или по каким-то причинам необходимо произвести установку шаблона без настройки FTP, скачайте и установите модуль QuickFix, который позволяет устанавливать дополнения без настроенного FTP доступа.
      4. Выбрать и установить файл темы для соответствующей версии OpenCart.
      Дополнения -> Установка дополнений -> [Загрузить]
      5. Обновить кеш модификаторов.
      Дополнения -> Менеджер дополнений -> [Сброс]/[Обновить]
      6. Выбрать установленную тему basecart из списка.
      Дополнения -> Дополнения -> Шаблоны -> [Редактировать] -> Папка шаблона -> basecart
      7. Сохранить
       
      OpenCart 3
      1. Скачать zip архив.
      2. В архиве находятся файлы установщики, названия которых оканчиваются на *.ocmod.zip (Распаковка не требуется).
      3. Выбрать и установить файл темы для соответствующей версии OpenCart.
      Модули/Расширения -> Установка расширений -> [Загрузить]
      4. Обновить кеш модификаторов.
      Модули/Расширения -> Модификаторы -> [Очистить]/[Обновить]
      5. Выбрать установленную тему basecart из списка.
      Модули/Расширения -> Модули/Расширения -> Темы -> [Редактировать] -> Директория темы -> basecart
      6. Сохранить
       
      Если, по каким-то причинам, шаблон был установлен путем простого копирования файлов, без использования установщика дополнений, нужно дополнительно установить модификатор шаблона (файл install.xml), найти его можно при распаковке архива, название которого оканчивается на *.ocmod.zip. Установка модификатора производится через: Дополнения -> Установка дополнений. Перед установкой install.xml необходимо переименовать в install.ocmod.xml. После установки - обновить кеш модификаторов.
       
      Переключение цветовых схем:
      OpenCart 2
      Дополнения -> Дополнения -> Модули -> Basecart -> [Установить] / [Редактировать]
       
      OpenCart 3
      Модули / Расширения -> Модули / Расширения -> Модули -> Basecart -> [Активировать] / [Редактировать]
    • От TCHProgrammer
      Здравствуйте! У меня вопрос следующего характера. В админке в карточке редактирования каждого товара есть вкладка "Данные". В ней есть поле SEO URL. Именно по ней определяется ссылка на товар в браузере. Я делаю выгрузку из 1с, читается xml-файл с товарами. Как мне программно задать SEO URL для каждого выгружаемого товара? 
      Заранее спасибо за ответы.
  • Последние посетители   0 пользователей онлайн

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

×

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

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