Объекты ядра
Товары, категории, покупатели, корзины и заказы в ядре — такие же модели ObjectModel, как AcmeReview. Их классы лежат в папке classes и доступны в модуле без подключения. Модуль читает через них данные магазина: название товара для отзыва, имя покупателя, состав заказа.
Товар
$product = new Product(1, false, $this->context->language->id);
$name = $product->name;Первый аргумент — номер товара, третий — номер языка. С номером языка в $product->name лежит строка, например «Футболка». Без него там окажется массив названий по всем языкам.
| Свойство | Что в нём |
|---|---|
name | Название |
description_short | Краткое описание |
reference | Артикул |
price | Цена без налога и скидок |
active | Включён ли товар |
id_category_default | Номер основной категории |
link_rewrite | Часть адреса страницы |
Цена
Цена для покупателя зависит от налога, скидок и группы покупателя, поэтому её не берут из свойства, а считают методом:
$price = Product::getPriceStatic(1);
$priceWithoutTax = Product::getPriceStatic(1, false);
$text = $this->context->getCurrentLocale()->formatPrice($price, $this->context->currency->iso_code);Первая строка возвращает число — цену с налогом и скидками. formatPrice() превращает число в строку вида «€29.00» по правилам текущего языка и валюты.
Ссылки и картинки
Адреса страниц строит объект $this->context->link:
$link = $this->context->link;
$productUrl = $link->getProductLink($product);
$cover = Product::getCover($product->id);
$imageUrl = $link->getImageLink($product->link_rewrite, $cover['id_image'], 'home_default');getCover() возвращает массив с номером главной картинки товара. Третий аргумент getImageLink() — имя размера картинки; набор размеров задаёт тема, в classic это small_default, home_default, large_default.
| Метод | Адрес |
|---|---|
getProductLink($product) | Страница товара |
getCategoryLink($category) | Страница категории |
getPageLink('cart') | Служебная страница: cart, order, my-account, index |
getModuleLink('acmehello', 'reviews') | Страница модуля — разобрана в следующей главе |
Категория
$category = new Category((int) $product->id_category_default, $this->context->language->id);
$categoryName = $category->name;
$products = $category->getProducts($this->context->language->id, 1, 10);getProducts() возвращает массив товаров категории: здесь первая страница по десять штук.
Покупатель
$customer = $this->context->customer;
if ($customer->isLogged()) {
$fullName = $customer->firstname . ' ' . $customer->lastname;
$email = $customer->email;
}На витрине текущий покупатель уже есть в контексте. isLogged() отличает вошедшего покупателя от гостя. По номеру покупателя загружают так же, как товар: new Customer($id).
Корзина
$cart = $this->context->cart;
$items = $cart->getProducts();
$total = $cart->getOrderTotal(true, Cart::BOTH);getProducts() возвращает массив строк корзины с ключами id_product, name, cart_quantity, total_wt. getOrderTotal() считает сумму: true — с налогом, Cart::BOTH — товары вместе с доставкой.
Заказ
$order = new Order($orderId);
$reference = $order->reference;
$paid = $order->total_paid;
$items = $order->getProducts();
$customer = new Customer((int) $order->id_customer);Заказ хранит номера связанных объектов: id_customer, id_cart, id_currency. Сам объект получают, создав его по этому номеру.
Применение в модуле
Название товара в блоке отзывов:
// modules/acmehello/acmehello.php
public function hookDisplayFooterProduct(array $params): string
{
$productId = (int) Tools::getValue('id_product');
$product = new Product($productId, false, $this->context->language->id);
$this->context->smarty->assign([
'productName' => $product->name,
'reviews' => $this->getReviews($productId),
]);
return $this->fetch('module:acmehello/views/templates/hook/product-reviews.tpl');
}В шаблоне теперь доступна переменная $productName — заголовок блока может выглядеть как «Отзывы о товаре Футболка».
Частая ошибка
Объект создают по номеру из запроса и сразу читают свойства: (new Product($id))->name. Если товара с таким номером нет, ошибки не будет — получится пустой объект и пустая страница. После загрузки проверяйте Validate::isLoadedObject($product) и для несуществующего товара возвращайте пустой блок или ошибку 404.