← Повернутись до блогу

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) в підпапці з назвою мови.
  • Мов може бути кілька, кожна окрема мова зберігається в окремій підпапці.

Вміст підпапок складається з:

  1. Мовного масиву, який доступний на будь-якій сторінці (в будь-якому route) (зазвичай це файл з назвою мови, наприклад en.php)
  2. Папок окремих сторінок — для окремих сторінок, найчастіше, використовується окремий текст, папки називаються аналогічно route, файли — аналогічно назвам контролерів, які підключають мову з конкретної папки;
  3. Іконки мови (має те ж назву, що й мовний масив, з розширенням 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»

Приклад (порядок додавання свого рядка):

  1. Додаємо файл перекладу в мовний файл catalog/language/ru-ru/header.php

    $_[‘text_hello_world’] = ‘Привіт світ!’;

  2. Додаємо виведення в контролері catalog/controller/common/header.php

    \(data['hello_world'] = \)this->language->get(‘hello_world’);

  3. Виводимо рядок в catalog/view/theme/назва теми/common/header.tpl

  4. Не забувайте оновити кеш модифікаторів

Також у контролері доступні загальні мовні змінні, для отримання яких немає необхідності в їх підключенні (не потрібно використовувати метод 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 для початківців розробників.

2018–2025 (c) Списуй але не один в один