Разработка сайта на PrestaShop
PrestaShop — PHP-фреймворк с открытым исходным кодом, оптимизированный под e-commerce. Текущая стабильная ветка 8.x основана на Symfony компонентах, Doctrine ORM для части сущностей и собственном легаси-ядре 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 — только для новых сущностей в admin
- ObjectModel — легаси 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],
],
];
}
Контроллеры и routing
Front-office routing в 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');
}
}
Хуки и архитектура модуля
Хуки — центральный паттерн расширения PrestaShop. Правильная работа с ними определяет, насколько модуль будет совместим с обновлениями ядра:
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);
}
Многомагазинность (Multishop)
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 недели к базовой разработке







