Вывести название подкатегории со списком товаров

F

Feetrus9836

Шопмейкер
#1
Вывести название подкатегории со списком товаров этой подкатегории в родительской категории
подскажите как сделать?

я сделал так, работает, но думаю это неправильно
товаров примерно 100 шт
и много запросов к базе получается
PHP:
$data['categories'] = array();
      $results = $this->model_catalog_category->getCategories($category_id);
      foreach ($results as $result) {
        $filter_data = array(
          'filter_category_id'  => $result['category_id'],
          'filter_sub_category' => true
        );

        $data['products_sub'] = array();
          $filter_data = array(
            'filter_category_id' => $result['category_id'],
            'filter_filter'      => $filter,
          );
          $results_products = $this->model_catalog_product->getProducts($filter_data);
          foreach ($results_products as $resultproducts) {
            if ($this->customer->isLogged() || !$this->config->get('config_customer_price')) {
              $price = $this->currency->format($this->tax->calculate($resultproducts['price'], $resultproducts['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);
            } else {
              $price = false;
            }
    
            if ((float)$resultproducts['special']) {
              $special = $this->currency->format($this->tax->calculate($resultproducts['special'], $resultproducts['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);
            } else {
              $special = false;
            }
            
            if ($resultproducts['weight'] > 0) {
              $weight = round($resultproducts['weight'], 2) . ' ' . $this->weight->getUnit($resultproducts['weight_class_id']);
              } else {
                $weight = '';
              }

            $data['products_sub'][] = array(
              'product_id'  => $resultproducts['product_id'],
              'name'        => $resultproducts['name'],
              'price'       => $price,
              'special'     => $special,
              'quantity'         => $resultproducts['quantity'],
              'minimum'     => $resultproducts['minimum'] > 0 ? $resultproducts['minimum'] : 1,
              'location'      => $resultproducts['location'],
              'weight'     => $weight,
            );
          }
        
        $data['categories'][] = array(
          'category_id'  => $result['category_id'], /*!!!*/
          'name' => $result['name'] . ($this->config->get('config_product_count') ? ' (' . $this->model_catalog_product->getTotalProducts($filter_data) . ')' : ''),
          'href' => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '_' . $result['category_id'] . $url),
          'products_sub' => $data['products_sub']
        );
      }
 
Останнє редагування:
OP
F

Feetrus9836

Шопмейкер
Thread Starter #2
Subcategory1
Product1 Product2 Product3 .......

Subcategory2
Product1 Product2 Product3 .......

Subcategory3
Product1 Product2 Product3 .......
 
Baco

Baco

architect
#3
доброго часу, я б ось так накидав код:

PHP:
        $data['categories'] = array();
        $results = $this->model_catalog_category->getCategories($category_id);
        foreach ($results as $result) {
            $filter_data = array(
                'filter_category_id'    => $result['category_id'],
                //'limit'                    => 100, // якщо потрібно, тут виставити ліміт на вибірку товарів
                'filter_sub_category'    => true
            );
            // отримуємо массив товарів з кешу по ідентифікаторам: language_id\store_id\customer_group_id\category_id
            $product_data = $this->cache->get('product.subcat.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $this->config->get('config_customer_group_id') . '.' . (int)$result['category_id']);
            // якщо немає, то формуємо
            if (!$product_data) {
                $results_products = $this->model_catalog_product->getProducts($filter_data);
                foreach ($results_products as $resultproducts) {
                    if ($this->customer->isLogged() || !$this->config->get('config_customer_price')) {
                        $price = $this->currency->format($this->tax->calculate($resultproducts['price'], $resultproducts['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);
                    } else {
                        $price = false;
                    }
            
                    if ((float)$resultproducts['special']) {
                        $special = $this->currency->format($this->tax->calculate($resultproducts['special'], $resultproducts['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);
                    } else {
                        $special = false;
                    }
                    
                    if ($resultproducts['weight'] > 0) {
                        $weight = round($resultproducts['weight'], 2) . ' ' . $this->weight->getUnit($resultproducts['weight_class_id']);
                    } else {
                        $weight = '';
                    }

                    $product_data[] = array(
                        'product_id'    => $resultproducts['product_id'],
                        'name'            => $resultproducts['name'],
                        'price'           => $price,
                        'special'         => $special,
                        'quantity'        => $resultproducts['quantity'],
                        'minimum'         => $resultproducts['minimum'] > 0 ? $resultproducts['minimum'] : 1,
                        'location'      => $resultproducts['location'],
                        'weight'         => $weight,
                    );
                }
                // записуємо в кеш, щоб наступного разу лишні запити до бази не формувати
                $this->cache->set('product.subcat.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $this->config->get('config_customer_group_id') . '.' . (int)$result['category_id'], $product_data);
            }
            // загальний массив категорій з даними по товарам (з кешу)
            $data['categories'][] = array(
                'category_id'    => $result['category_id'],
                'name'            => $result['name'] . ($this->config->get('config_product_count') ? ' (' . $this->model_catalog_product->getTotalProducts($filter_data) . ')' : ''),
                'href'            => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '_' . $result['category_id'] . $url),
                'products_sub'    => $product_data
            );
        }
 
OP
F

Feetrus9836

Шопмейкер
Thread Starter #5
Baco
не будет ли проблем с отображением новых товаров? не будет ли кешироватся результаты
 
Baco

Baco

architect
#7
так, проблема буде, та можна при додаванні товару у методі "addProduct" чи при оновленні, додати у файлі: \admin\model\catalog\product.php ось такий рядок, після:
PHP:
foreach ($data['product_category'] as $category_id) {
ось таку очистку кешу:
PHP:
$this->cache->delete('product.subcat.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $this->config->get('config_customer_group_id') . '.' . (int)$category_id);
звісно, як відписав @SlaSoft це для сервера буде невідчутно, якщо це кількасот товарів...
 
Останнє редагування:
Зверху