Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Объекты ядра

Товары, категории, покупатели, корзины и заказы в ядре — такие же модели 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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.