alienworkshop
@alienworkshop

Как вывести данные товаров со скидкой на главной странице Opencart?

На сайте есть боковая панель "Специальная цена", которая находится в header.tpl (catalog/view/theme/default/template/common/header.tpl). В ней нужно вывести данные только тех товаров, у которых есть скидка.
Пробую через <?php foreach ($products as $product) { ?> , пишет "Invalid argument supplied for foreach()". Походу массив $products в header.tpl не определён.
Как вывести данные товаров со скидкой в header.tpl ?
  • Вопрос задан
  • 3750 просмотров
Пригласить эксперта
Ответы на вопрос 3
@TheSameSon
Чтобы получить список товаров смотрите в catalog/model/catalog/product.php
Из коробки в опенкарте нет возможности получить товары только со скидкой, поэтому лучше ее добавить в метод getProducts(), иначе придется получать список всех товаров и фильтровать уже в контроллере - не хорошо.
Ну и как уже написали, переменные для header.tpl определяются в catalog/controller/common/header.php, поэтому там вы и подгружаете модель, получаете список товаров и упаковываете в массив $this->data
Ответ написан
@Yago
Смотрите в сторону
catalog/controller/common/header.php

Переменные для шаблона header определяются там.
Ответ написан
Комментировать
@Nikolays93
Web-разработчик
Может кому пригодится:(Актуально для 1 версии)
Между public function index() { и $this->response->setOutput($this->render()); в controller/ИМЯ_СТРАНИЦЫ.php
вставить:
// Загружаем модели
		$this->load->model('catalog/product');
		$this->load->model('tool/image');

		if (isset($this->request->get['page'])) {
			$page = $this->request->get['page'];
		} else {
			$page = 1;
		}
		
		if (isset($this->request->get['limit'])) {
			$limit = $this->request->get['limit'];
		} else {
			$limit = $this->config->get('config_catalog_limit');
		}

		$data = array(
			'sort'  => 'p.sort_order',
			'order' => 'ASC',
			'start' => ($page - 1) * $limit,
			'limit' => $limit // Количество на странице
			);

		$results = $this->model_catalog_product->getProductSpecials($data);

		$this->data['special_products'] = array();

		foreach ($results as $result) {
			// Получаем изображение
			if ($result['image']) {
				$image = $this->model_tool_image->resize($result['image'], $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height'));
			} else {
				$image = false;
			}
			// Получаем цену
			if (($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) {
				$price = $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax')));
			} else {
				$price = false;
			}
			// Получаем цену со скидкой
			if ((float)$result['special']) {
				$special = $this->currency->format($this->tax->calculate($result['special'], $result['tax_class_id'], $this->config->get('config_tax')));
			} else {
				$special = false;
			}	
			// Получаем налоги
			if ($this->config->get('config_tax')) {
				$tax = $this->currency->format((float)$result['special'] ? $result['special'] : $result['price']);
			} else {
				$tax = false;
			}				
			// Получаем рэйтинг
			if ($this->config->get('config_review_status')) {
				$rating = (int)$result['rating'];
			} else {
				$rating = false;
			}

			$this->data['special_products'][] = array(
				'product_id'  => $result['product_id'],
				'thumb'       => $image,
				'name'        => $result['name'],
				'description' => utf8_substr(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8')), 0, 300) . '..',
				'price'       => $price,
				'special'     => $special,
				'tax'         => $tax,
				'rating'      => $result['rating'],
				'reviews'     => sprintf($this->language->get('text_reviews'), (int)$result['reviews']),
				'href'        => $this->url->link('product/product', 'product_id=' . $result['product_id'])
			);
		}


Первые 2 строки кода желательно исключить если они уже указаны где то на странице.

На выводе что то вроде: ИМЯ_страницы.tpl
<ul class="jcarousel-skin">
                    <?php foreach ($special_products as $special_product):

                        $price = (!empty($special_product['special'])) ? '<div class="price">'.$special_product['special'].'</div>' : '';

                        if ($special_product['special'] && $special_product['price']){
                            $tag_price = '<div class="tag-price"><span class="price-new">'. $special_product['special'] .'</span><span class="price-old">'. $special_product['price'] .'</span></div>';
                        } else { $tag_price = ''; }
                        
                        $thumbnail = '';
                        if ($special_product['thumb']) {
                            $thumbnail = '<div class="image"><a href="'. $special_product['href'].'"><img src="'. $special_product['thumb'] .'" alt="'. $special_product['name'] .'" /></a></div>';
                        } else {
                            $thumbnail = '';
                        }
                        $name = '<div class="name"><a href="'.$special_product['href'].'">'. $special_product['name'].'</a></div>';

                        /*Item OUTPUT*/
                    echo '<li>'.$tag_price.$thumbnail.'<div class="about">'.$name.$price.'</div></li>';
                    
                    endforeach; ?>
                    </ul>

Код взял из своих сниппетов, если не понятен фронт юзайте var_dump($special_products);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы