Первый контроллер
Контроллер — класс, который отвечает на запрос: получает адрес, готовит данные и возвращает страницу. Каждая страница магазина — контроллер. Файла маршрутов в OpenCart нет: адрес сам указывает на файл контроллера.
Где лежит
Контроллеры витрины лежат в catalog/controller/ и разложены по папкам-темам: product, checkout, account, information.
catalog/controller/
├── common/ шапка, подвал, главная страница
├── product/ товар, категория, поиск
└── information/
└── hello.php новый файлНа время учёбы файл кладётся рядом с контроллерами ядра. Настоящий код оформляют как дополнение — в главе о дополнениях эта страница переедет в extension/acme_hello/.
Создание контроллера
Консольной команды нет. Создайте файл catalog/controller/information/hello.php вручную:
// catalog/controller/information/hello.php
namespace Opencart\Catalog\Controller\Information;
class Hello extends \Opencart\System\Engine\Controller
{
public function index(): void
{
$this->response->setOutput('Здравствуйте!');
}
}Откройте http://shop.test/index.php?route=information/hello — браузер покажет слово «Здравствуйте!» на пустой странице. В настоящем файле первой строкой стоит тег <?php.
Как маршрут связан с файлом
Параметр route — это путь к файлу внутри catalog/controller/ без расширения .php:
| Адрес | Файл | Метод |
|---|---|---|
index.php?route=information/hello | catalog/controller/information/hello.php | index() |
index.php?route=product/product | catalog/controller/product/product.php | index() |
index.php?route=checkout/cart | catalog/controller/checkout/cart.php | index() |
Если метод в адресе не назван, вызывается index().
Правила имён
| Что | Правило | Пример |
|---|---|---|
| Пространство имён | Opencart\Catalog\Controller\ и папка | Opencart\Catalog\Controller\Information |
| Класс | Имя файла с заглавной буквы | hello.php → Hello |
| Файл с подчёркиванием | Каждое слово с заглавной, без подчёркивания | review_list.php → ReviewList |
В панели пространство имён начинается с Opencart\Admin\Controller\.
Страница с оформлением магазина
Шапка и подвал магазина — тоже контроллеры. Их вызывают через $this->load->controller(), который возвращает готовый HTML:
public function index(): void
{
$header = $this->load->controller('common/header');
$footer = $this->load->controller('common/footer');
$this->response->setOutput($header . '<div class="container"><h1>Здравствуйте!</h1></div>' . $footer);
}Теперь по тому же адресу заголовок стоит между меню магазина и подвалом. HTML внутри PHP — только для первого примера: в уроке о шаблонах он переедет в файл Twig.
Частая ошибка
В контроллере пишут echo или останавливают выполнение через exit. Страница тогда приходит без заголовков и сжатия, а порядок вывода нарушается. Весь вывод идёт через $this->response->setOutput() — движок отправит его в конце запроса.