Розробка сайту на PrestaShop
PrestaShop — open-source PHP-фреймворк, оптимізований для e-commerce. Поточна стабільна гілка 8.x заснована на компонентах Symfony, Doctrine ORM для деяких сутностей та власному legacy-ядрі ObjectModel для каталогу. Ця архітектурна подвійність — ключова характеристика, яку потрібно враховувати під час розробки.
Архітектура та стек
PrestaShop 8.x використовує:
- PHP 8.1–8.2, Symfony 4.4 (компоненти), частковий Symfony DI
- Smarty 3 для front-office шаблонів, Twig для back-office (Symfony)
-
MySQL/MariaDB — основна БД, активне використання
PREFIX_*таблиць - Doctrine ORM — тільки для нових сутностей в адмін-панелі
- ObjectModel — legacy Active Record для всіх товарів, категорій, замовлень
- Hook system — основний механізм розширюваності
Структура директорій:
/
├── classes/ # ObjectModel сутності (Product, Category, Order...)
├── controllers/ # Front-office контролери (FrontController)
├── modules/ # Сторонні та користувацькі модулі
├── themes/ # Front-office теми (Smarty)
├── src/ # Symfony-стиль код (PrestaShop\PrestaShop\...)
├── admin-dev/ # Back-office (Symfony + Twig)
└── override/ # Override ядра класів
Моделі даних та робота з каталогом
Вся робота з товарами йде через ObjectModel. Приклад отримання та збереження:
// Отримання товара з перекладами
$product = new Product($id, true, $langId, $shopId);
echo $product->name; // локалізований рядок
echo $product->price; // базова ціна без ПДВ
echo $product->getPrice(); // з урахуванням податків та знижок
// Масове отримання через статичні методи
$products = Product::getProducts(
$langId,
$page * $limit, // offset
$limit,
'id_product', // orderBy
'ASC',
$categoryId
);
Для користувацьких сутностей розширюйте ObjectModel:
class CustomAttribute extends ObjectModel
{
public $id_custom_attribute;
public $name;
public $value;
public $active;
public static $definition = [
'table' => 'custom_attribute',
'primary' => 'id_custom_attribute',
'multilang' => true,
'fields' => [
'active' => ['type' => self::TYPE_BOOL, 'validate' => 'isBool'],
'name' => ['type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'required' => true, 'size' => 128],
'value' => ['type' => self::TYPE_STRING, 'lang' => true, 'size' => 255],
],
];
}
Контролери та маршрутизація
Front-office маршрутизація в PrestaShop працює через dispatcher + FrontController. URL-правила задаються в dispatcher.php та таблиці meta:
// Користувацький front-office контролер
class CustomPageModuleFrontController extends ModuleFrontController
{
public $ssl = true;
public $display_column_left = false;
public function initContent()
{
parent::initContent();
$items = Db::getInstance()->executeS(
'SELECT * FROM `' . _DB_PREFIX_ . 'custom_items` WHERE `active` = 1'
);
$this->context->smarty->assign([
'items' => $items,
'pageTitle' => $this->trans('Custom Page', [], 'Modules.Custommodule.Shop'),
]);
$this->setTemplate('module:custommodule/views/templates/front/custom_page.tpl');
}
}
Хуки та архітектура модуля
Хуки — центральний механізм розширення. Правильна робота з ними визначає сумісність модуля з оновленнями ядра:
class CustomModule extends Module
{
public function __construct()
{
$this->name = 'custommodule';
$this->tab = 'front_office_features';
$this->version = '1.0.0';
$this->author = 'Company';
$this->need_instance = 0;
$this->ps_versions_compliancy = ['min' => '8.0.0', 'max' => _PS_VERSION_];
parent::__construct();
}
public function install(): bool
{
return parent::install()
&& $this->registerHook('actionProductAdd')
&& $this->registerHook('displayProductAdditionalInfo')
&& $this->installDb();
}
public function hookDisplayProductAdditionalInfo(array $params): string
{
$product = $params['product'];
$this->smarty->assign('custom_data', $this->getCustomData($product['id_product']));
return $this->display(__FILE__, 'views/templates/hook/product_info.tpl');
}
}
Продуктивність та кешування
PrestaShop підтримує кілька рівнів кешування:
- CCC (Combine, Compress, Cache) — об'єднання CSS/JS
- Smarty cache — кеш скомпільованих шаблонів
- Page cache — через модулі (PrestaShop PageCache, вбудований PS 8)
- Object cache — Redis/Memcached
// Конфігурація Redis в app/config/parameters.php
parameters:
cache_driver: 'redis'
cache_server: '127.0.0.1'
cache_port: 6379
cache_prefix: '_PRESTASHOP_'
// Програмне кешування в модулі
$cacheKey = 'module_data_' . $productId . '_' . $langId;
if (!Cache::isStored($cacheKey)) {
$data = $this->fetchExpensiveData($productId);
Cache::store($cacheKey, $data);
} else {
$data = Cache::retrieve($cacheKey);
}
Підтримка кількох магазинів
PrestaShop управляє кількома магазинами з однієї адмін-панелі. Контекст магазину впливає на всі запити:
// Прив'язка даних до конкретного shop
Shop::setContext(Shop::CONTEXT_SHOP, $shopId);
// Запис, залежний від shop
$product = new Product(null, false, null, $shopId);
$product->name[$langId] = 'Назва для магазину ' . $shopId;
$product->price = 999.00;
$product->id_shop_default = $shopId;
$product->save();
Типовий графік розробки
- Базовий магазин зі стандартною темою кастомізацією: 3–5 тижнів
- Магазин з користувацькою темою та модулями під бізнес-логіку: 6–10 тижнів
- Міграція з іншої платформи (WooCommerce, OpenCart): 4–8 тижнів
- Конфігурація мультимагазину з різними каталогами: +2–3 тижні до базової розробки







