Вывод модуля на витрине
Модуль — блок, который можно поставить на страницы витрины: баннер, список товаров, приветствие. Код блока — контроллер витрины в дополнении. Где блок появится, решают не в коде, а в панели — через макеты.
Файлы
extension/acme_hello/catalog/
├── controller/module/acme_hello.php
├── language/ru-ru/module/acme_hello.php
└── view/template/module/acme_hello.twigКонтроллер
В отличие от страницы, модуль не отправляет ответ — он возвращает строку с HTML:
// extension/acme_hello/catalog/controller/module/acme_hello.php
namespace Opencart\Catalog\Controller\Extension\AcmeHello\Module;
class AcmeHello extends \Opencart\System\Engine\Controller
{
public function index(): string
{
$this->load->language('extension/acme_hello/module/acme_hello');
$data['text'] = $this->config->get('module_acme_hello_text');
return $this->load->view('extension/acme_hello/module/acme_hello', $data);
}
}Текст — это настройка, сохранённая на странице настроек модуля.
Тексты и шаблон
// extension/acme_hello/catalog/language/ru-ru/module/acme_hello.php
$_['heading_title'] = 'Добро пожаловать';{# extension/acme_hello/catalog/view/template/module/acme_hello.twig #}
<div class="card mb-3">
<div class="card-header">{{ heading_title }}</div>
<div class="card-body">{{ text }}</div>
</div>В шаблоне модуля нет шапки и подвала — это фрагмент, который вставляется в страницу.
Макеты
Макет — именованный набор страниц с одинаковым расположением блоков: «Home», «Product», «Category», «Account». У каждого макета четыре места:
| Место | Где находится |
|---|---|
| Column Left | Левая колонка |
| Column Right | Правая колонка |
| Content Top | Над содержимым |
| Content Bottom | Под содержимым |
Размещение модуля
- На странице настроек модуля включите статус и введите текст приветствия.
- Откройте
Design → Layoutsи измените макет «Home». - В месте Content Top выберите в списке «Acme Hello», нажмите кнопку добавления и сохраните.
Откройте главную страницу http://shop.test/ — над содержимым стоит карточка с заголовком «Добро пожаловать» и вашим текстом.
Контроллер страницы вызывает common/content_top, тот находит модули текущего макета и вызывает у каждого метод index().
Какая страница к какому макету относится
Макет привязан к маршрутам: на странице редактирования макета есть список маршрутов, например product/product у макета «Product». Чтобы показать модуль на своей странице, создайте новый макет и укажите её маршрут.
Вызов модуля вручную
Модуль — обычный контроллер, поэтому страница может вызвать его напрямую:
$data['hello'] = $this->load->controller('extension/acme_hello/module/acme_hello');Частая ошибка
Модуль добавлен в макет, а на странице его нет. Ядро пропускает модули, у которых выключена настройка module_acme_hello_status. Откройте настройки модуля, включите переключатель и сохраните.