Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

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


Recommended Posts

Всех приветствую. Подскажите, пожалуйста, что делаю не так. Пытаюсь вывести меню следующего вида:
-Категория 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
Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.