Модели ядра: товары, категории, картинки, цены
Запросы для товаров, категорий и картинок писать не нужно — в ядре для них уже есть модели. Ваш контроллер загружает модель ядра точно так же, как свою. В этом уроке на странице information/hello появляется список товаров.
Один товар
// catalog/controller/information/hello.php
$this->load->model('catalog/product');
$product = $this->model_catalog_product->getProduct(42);
$data['product_name'] = $product ? $product['name'] : '';getProduct() возвращает массив с полями товара на текущем языке или пустой массив, если такого товара нет или он выключен. Файл модели — catalog/model/catalog/product.php: откройте его, чтобы увидеть все методы.
Список товаров
$products = $this->model_catalog_product->getProducts(['start' => 0, 'limit' => 4]);Аргумент — массив фильтров. Самые нужные ключи:
| Ключ | Смысл |
|---|---|
filter_category_id | Только товары этой категории |
sort, order | Поле и направление сортировки |
start, limit | Какие строки вернуть |
Полный набор ключей зависит от выпуска — посмотрите метод в своей копии.
Картинки
У товара хранится путь к исходной картинке. Копию нужного размера делает модель tool/image:
$this->load->model('tool/image');
$thumb = $this->model_tool_image->resize($product['image'], 200, 200);resize() при первом вызове создаёт файл в image/cache/ и возвращает его полный адрес.
Цена с налогом и в валюте
Цены хранятся в основной валюте магазина и без налога. Два объекта реестра превращают число в текст для покупателя:
$price = $this->currency->format(
$this->tax->calculate($product['price'], $product['tax_class_id'], $this->config->get('config_tax')),
$this->session->data['currency']
);tax->calculate() прибавляет налог, если магазин показывает цены с налогом. currency->format() переводит сумму в валюту, выбранную покупателем, и добавляет её знак: $8.00 или 7.50€.
Всё вместе
$data['products'] = [];
foreach ($this->model_catalog_product->getProducts(['start' => 0, 'limit' => 4]) as $result) {
$data['products'][] = [
'name' => $result['name'],
'thumb' => $this->model_tool_image->resize($result['image'] ?: 'placeholder.png', 200, 200),
'price' => $this->currency->format(
$this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax')),
$this->session->data['currency']
),
'href' => $this->url->link('product/product', 'language=' . $this->config->get('config_language') . '&product_id=' . $result['product_id']),
];
}{% for product in products %}
<a href="{{ product.href }}"><img src="{{ product.thumb }}" alt="{{ product.name }}"> {{ product.name }}</a> — {{ product.price }}
{% endfor %}Откройте index.php?route=information/hello — страница покажет четыре товара с картинками, ценами и ссылками.
Категории
$this->load->model('catalog/category');
$categories = $this->model_catalog_category->getCategories(0);Аргумент — идентификатор родительской категории; 0 возвращает верхний уровень.
Частая ошибка
Цену из базы выводят как есть: {{ product.price }} показывает 8.0000 — без налога и не в той валюте. Любая цена, которую видит покупатель, проходит через $this->tax->calculate() и $this->currency->format().