Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Первый контроллер

Контроллер — класс, который отвечает на запрос: получает адрес, готовит данные и возвращает страницу. Каждая страница магазина — контроллер. Файла маршрутов в 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/hellocatalog/controller/information/hello.phpindex()
index.php?route=product/productcatalog/controller/product/product.phpindex()
index.php?route=checkout/cartcatalog/controller/checkout/cart.phpindex()

Если метод в адресе не назван, вызывается 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() — движок отправит его в конце запроса.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.