OpenCart для розробників
October 2018 // 9 хвилин на читання // 167 переглядів
Вступ
У статті описані базові принципи роботи OpenCart з моїми замітками щодо їх роботи. Не намагайтеся завчити вміст статті, це не інструкція. Мета цієї статті — дати базові знання для людей, які цікавляться цією системою управління сайтом (CMS).
Знаю, часто люди намагаються збирати сайти на ній самостійно, без базових знань програмування, але вам необхідно знати PHP і розуміти об’єктно-орієнтоване програмування для розуміння цієї статті.
Після її прочитання ви отримаєте достатньо теоретичних знань для того, щоб почати розробляти свої власні доповнення та шаблони для CMS OpenCart, а також комфортно себе почувати при розробці сайтів на ній.
Керівництво
Для розуміння роботи CMS OpenCart слід знати про таку схему розділення даних додатку, як MVC. З її опису я й почну цю статтю.
0. Розуміння MVC
MVC це схема розділення даних, при якій додаток розділяється на кілька частин, кожна з яких виконує свою роль у ньому. Ці частини називаються:
- Модель (Model),
- Представлення (View),
- Контролер (Controller).
Модель відповідає за дані в OpenCart в цих файлах зберігаються класи, методи яких додають/отримують/оновлюють/видаляють дані з бази даних, звернення до API тощо. Моделі відповідають за дані всієї системи.
Представлення відповідає за контент (html, який бачить користувач). В OpenCart 2.3 всі представлення мали розширення .tpl, починаючи з 3.0 версії — у представленнях використовується шаблонізатор twig.
Контролер в OpenCart служить для обробки дій користувача. У ньому формується виведення представлень з даними, які повертають моделі додатка. Також контролер обробляє форми користувачів, перевіряючи дані перед їх збереженням у базу даних.
Насправді OpenCart використовує схему розділення MVC-L, де L — Language (Мова). У мовних файлах зберігаються масиви з перекладами певних рядків.
Функціональність системи розділяється на користувацьку частину та на адмін частину, для кожної з яких у системі створена папка.
Для користувацької частини:
/catalog/controller
містить усі контролери
/catalog/model
містить усі моделі
/catalog/view
містить усі представлення
Для адмін частини:
/admin/controller
містить усі контролери
/admin/model
містить усі моделі
/admin/view
містить усі представлення
Докладніше про кожну з частин буде описано нижче.
1. Додаткові бібліотеки в OpenCart
Розуміння OpenCart слід починати з бібліотек.
- Бібліотеки необхідні для того, щоб позбутися дублювання коду в системі,
- Працювати з бібліотеками можна в будь-якому класі, який успадковується від класів Controller і Model,
- Усі системні бібліотеки можна знайти в папці “/system/library”,
- Для доступу до об’єктів використовується синтаксис:
$this->library_name
Для кращого розуміння наведу невеликий приклад:
Необхідно отримати доступ до товарів, які знаходяться в кошику, для цього ми використовуємо клас Cart, ініціалізація якого знаходиться тут:
system/library/cart/cart.phpОскільки використання об’єкта дозволяється в будь-якому класі, який успадковується від Controller або Model, то в будь-якому з таких класів можна викликати метод для отримання всіх товарів, які знаходяться в кошику
$this->cart->getProducts()
Нижче представлені основні файли бібліотек з описом того, за що вони відповідають:
system/library/cart/cart.php — Відповідає за товари в кошику. Має методи для додавання / видалення / оновлення / отримання даних про товари, які знаходяться в кошику;
system/library/cart/currency.php — Відповідає за роботу з ціною. OpenCart підтримує мультивалютність. Має методи для конвертації валюти і отримання інформації про поточну валюту.
system/library/cart/customer.php — Відповідає за користувачів. Має методи для авторизації / реєстрації користувачів, перевірки їх на вхід, отримання інформації про поточного користувача
system/library/cart/user.php — Відповідає за користувачів адмін панелі. Все те ж що і customer, тільки для тих користувачів, які мають доступ в адмін панель.
system/library/language.php — Відповідає за файли перекладів. Використовується практично в кожному контролері. Має методи для отримання рядків з масивів перекладів.
system/library/image.php — Відповідає за роботу з зображеннями. Вміє змінювати розмір, працювати з метаданими зображень.
system/library/mail.php — Відповідає за відправку листів.
2. Як працюють маршрути в OpenCart
В URL OpenCart є параметр route, за яким можна зрозуміти, який з контролерів обробляє поточну сторінку.
Найчастіше, параметр route має вигляд route=aaa/bbb, що означає той факт, що поточну сторінку обробив контролер bbb.php, який можна знайти в папці /controller/aaa. Якщо параметр route складається з трьох частин, то остання частина дасть зрозуміти назву методу, який обробив поточну сторінку (за замовчуванням цей метод називається index, і він не вказується в маршруті).
Наприклад:
Ви знаходитеся на сторінці route=aaa/bbb/ccc, що символізує про те, що метод, який обробив цю сторінку називається public function ccc(), знаходиться він у папці /controller/aaa/, у файлі bbb.php
3. Розуміння мов
- Усі мови зберігаються в папці
/catalog/language/(або/admin/language) в підпапці з назвою мови. - Мов може бути кілька, кожна окрема мова зберігається в окремій підпапці.
Вміст підпапок складається з:
- Мовного масиву, який доступний на будь-якій сторінці (в будь-якому route) (зазвичай це файл з назвою мови, наприклад en.php)
- Папок окремих сторінок — для окремих сторінок, найчастіше, використовується окремий текст, папки називаються аналогічно route, файли — аналогічно назвам контролерів, які підключають мову з конкретної папки;
- Іконки мови (має те ж назву, що й мовний масив, з розширенням png).
Пояснення:
Сторінка товару має маршрут product/product, тому текст для цієї сторінки буде знаходитися у файлі, /catalog/language/en/product/product.php (зверніть увагу, як ім’я файлу і підпапка відповідають маршруту, розуміючи маршрути буде набагато простіше працювати з OpenCart)
Ми розібралися з тим, де знаходяться мовні файли, залишилося зрозуміти як з ними працювати:
- Вся робота з мовними файлами відбувається в контролері.
- Для завантаження мови слід використовувати метод load() з класу language
$this->language->load('product/product'); - Після чого, для вилучення тексту з масиву за ключем можна використовувати метод get()
$var = $this->language->get('text_instock');
Значення змінної призначається в мовному файлі, про який ми говорили вище. У цьому файлі повинен зберігатися асоціативний масив $_, в якому повинен бути доступний текст з ключем _textinstock
Якщо відповідного ключа не буде в мовних файлах, функція get() поверне передану рядок (_textinstock).
Таким чином, якщо у файлі /catalog/language/en/product/product.php є рядок$_['text_instock'] = 'In Stock';
Це означає, що змінна $var з нашого прикладу має значення «In Stock», якщо ні — значення «_textinstock»
Приклад (порядок додавання свого рядка):
Додаємо файл перекладу в мовний файл catalog/language/ru-ru/header.php
$_[‘text_hello_world’] = ‘Привіт світ!’;
Додаємо виведення в контролері catalog/controller/common/header.php
\(data['hello_world'] = \)this->language->get(‘hello_world’);
Виводимо рядок в catalog/view/theme/назва теми/common/header.tpl
Не забувайте оновити кеш модифікаторів
Також у контролері доступні загальні мовні змінні, для отримання яких немає необхідності в їх підключенні (не потрібно використовувати метод load, завантаження відбувається автоматично).
4. Контролери
Контролери завантажуються на основі значення параметра route і працюють за досить прозорим принципом.
Усі контролери знаходяться в папці /catalog/controller/. За попереднім прикладом, сторінка товару, яка має route=product/product буде оброблятися контролером /catalog/controller/product/product.php (знову зверніть увагу на те, як ім’я файлу і підпапка відповідають параметру route)
Якщо ви відкриєте файл /catalog/controller/product/product.php, зверніть увагу на те, як він називається — ControllerProductProduct. Так, назва знову відповідає маршруту, за яким спрацьовує даний контролер. За замовчуванням у контролері спрацьовує метод index(). Інші методи можна також викликати з параметра route. Наприклад, route=product/product/doMyOwnMethod буде оброблений методом public doMyOwnMethod() класу ControllerProductProduct.
Усі public методи доступні для запуску параметром route, private і protected — ні.
4.1. Як працюють змінні в контролерах
Усі змінні в контролерах OpenCart, які необхідно передавати в представлення (view) слід поміщати в асоціативний масив $data.
У файлі представлень змінні з масиву будуть доступні за значенням ключа (для розуміння цього — почитайте як працює функція extract() в php)
Наприклад:
У контролері присвоїмо змінну:
$data['hello_world'] = 'hello world';Для виведення цієї змінної у файлі представлення — слід використовувати цю змінну:
$hello_worldВся функціональність змінних у такому випадку зберігається. Вони можуть містити в собі як рядкові значення, так і масиви.
5. Представлення
Представлення дуже сильно змінилися з моменту релізу OpenCart 3. Тут я опишу про те, як вони працювали OpenCart 2 і OpenCart 1.5
Представлення (view), як і контролери згруповані по папках на основі маршруту (хоча тут їх угруповання — не особливо важлива і несе більше естетичний сенс, оскільки вони можуть підключатися з будь-якого контролера).
Такі файли знаходяться всередині папок тем і мають розширення .tpl (.twig для OpenCart 3+)
Всередині цих файлів знаходиться html код, розбавлений виведенням php змінних (що формуються і передаються в масиві $data в контролері)
5.1 Як підключити виведення представлення (view) в контролері
Для того, щоб підключити view слід використовувати бібліотеку response спільно з бібліотекою load
\(this->response->setOutput(\)this->load->view(‘account/account’, $data));
Метод view бібліотеки load підключає файл представлення (у нього також передається масив з даними, які можна використовувати всередині)
Метод setOutput бібліотеки response — безпосередньо виводить вміст підготовлює дані виведення (у нашому випадку це html код).
5.2 Як працюють теми (шаблони) в OpenCart
Шаблон в OpenCart це файл, папка з файлами представлень, яка перевизначає стандартну тему OpenCart.
Список всіх шаблонів можна побачити в папці catalog/view/theme
За замовчуванням, OpenCart має один шаблон (default). Редагувати файли цього шаблону — так собі ідея. Справа в тому, що стандартний шаблон реалізує всі функціональності, які є в OpenCart. Відредагувавши стандартний шаблон частина функціональностей може бути втрачена.
Крім того — якщо в кастомному (який створюєте Ви) шаблоні не буде файлу view, який підключає контролер для виведення — цей файл буде взятий з default шаблону, таким чином Вам удасться уникнути помилок.
6. Моделі
Що стосується моделей в OpenCart — всі їх файли знаходяться в папках catalog/model (admin/model), але на відміну від контролерів, які групуються на основі маршруту — файли моделей групуються на основі функції, за яку вони відповідають
Підключити модель можна за допомогою коду
$this->load->model(‘folder/file’);
Код вище підключить модель до поточного контролера, а методи моделі стануть доступними в об’єкті
$this->model_folder_file
Викликати можна тільки публічні методи моделі.
Наприклад:
Завантажимо модель, яка відповідає за роботу з зображеннями:
$this->load->model(‘tool/image’);
Викличемо метод, який змінить розмір зображення до 300×200 і збереже його в кеш
$this->model_tool_image->resize(‘image.png’, 300, 200);
6.1 SQL запити в моделях OpenCart
Так, як модель відповідає за отримання даних — всі SQL запити слід прописувати саме в ній.
Я припускаю що у читача вже є уявлення про SQL запити, тому опишу особливості OpenCart в частині роботи з ними:
Всі SQL запити виконуються за допомогою бібліотеки db і її методу query
\(this->db->query(\)sql_query);
Всередині SQL запиту, найчастіше, можна побачити константу DB_PREFIX, яка містить префікс бази даних (префікс задається при установці)
Ось приклад запиту в OpenCart:
\(query = \)this->db->query(“SELECT DISTINCT * FROM ” . DB_PREFIX . “currency WHERE code = ‘” . \(this->db->escape(\)currency) . “’”);
Метод escape — це обгортка для функції mysql_real_escape_string(), яка екранує спеціальні символи в рядках
Після виконення запиту, змінна $query буде містити об’єкт SELECT запиту, в якому
$result->row містить дані першого рядка
$result->rows містить масив результатів рядка, що підходить для foreach
$result->num_rows поверне кількість результатів, які входять у вибірку
Після виконання запиту можна використовувати метод, який поверне ідентифікатор вставленого рядка (для INSERT) $this->db->getLastId()
7. Обгортки для змінних
У OpenCart є свої перевизначення для глобальних змінних, нижче я перерахую їх список. При розробці під OpenCart намагайтеся використовувати ці перевизначення.
| в php | в OpenCart |
|---|---|
| $_GET | $this->request->get |
| $_POST | $this->request->post |
| $_COOKIE | $this->request->cookie |
| $_FILES | $this->request->files |
| $_REQUEST | $this->request->request |
| $_SERVER | $this->request->server |
Висновок
На жаль, у цієї CMS немає належної документації для розробників, але її код досить зрозумілий. Я сподіваюся, що ця стаття стане хорошим початком вивчення CMS OpenCart для початківців розробників.