Opencart - как разместить модуль (HTML-инфоблок) в любом месте на странице

Иногда очень хочется воспользоваться встроенным в Opencart-2 (OcStore-2) модулем "HTML Содержимое",
причем вставить его не в стандартные позиции:
column_left / column_right / content_top / content_bottom

а в свою собственную позицию.

В данном случае, автору понадобилось вставить текстовую информацию на странице карточки товара сразу под кнопкой "Купить".

модуль в своей собственной позиции

Этот инфоблок будет выводиться на страницах всех товаров.

 

Шаг-1.
Создадим в админке этот самый инфоблок с нужной информацией.
Заходим в Модули, нажимаем на кнопку редактирования модуля "HTML Содержимое" и заполняем поля НазваниеМодуля, Заголовок (можно не заполнять), Описание -> сюда пишем нашу информацию или вставляем HTML-код,
и в самом низу меняем статус на Включено

ы

 

Добавляем наш модуль в схему Продукт

 1

 

Теперь, если зайти на страницу карточки товара, то мы увидим содержимое нашего модуля в верхней части страницы

здесь

 

Чтобы вывести модуль в нашей собственной позиции на странице, нужно дать название этой позиции. Мы назвали ее content_infoblock
И в этом месте может возникнуть проблема с количеством символов в названии (спасибо нашему читателю Алексею за подсказку).
Дело в том, что в базе данных по умолчанию установлено ограничение для количества символов = 14 в поле `position` таблицы `oc_layout_module`
Поэтому, нужно либо придумать название модуля не более 14 символов, либо изменить значение для этого поля, например VARCHAR(255). Это можно сделать легко в PhpMyAdmin

Итак, определившись с названием модуля, пропишем его в выпадающем списке в админке.
Для этого открываем файл

/admin/view/template/design/layout_form.tpl

и находим часть кода

<?php if ($layout_module['position'] == 'content_top') { ?>
<option value="content_top" selected="selected"><?php echo $text_content_top; ?></option>
<?php } else { ?>
<option value="content_top"><?php echo $text_content_top; ?></option>
<?php } ?>

 

ниже добавляем название нашей позиции

<?php if ($layout_module['position'] == 'content_infoblock') { ?>
<option value="content_infoblock" selected="selected">Инфоблок</option>
<?php } else { ?>
<option value="content_infoblock">Инфоблок</option>
<?php } ?>

 

 Далее находим строку

html += '    <option value="column_right"><?php echo $text_column_right; ?></option>';

 

и ниже вставляем

html += '    <option value="content_infoblock">Новая позиция</option>';

 

Теперь идем в админку в Схемы, входим в редактор страницы "Продукт" и для модуля "HTML Содержимое > Инфоблок ДоставкаОплата"
выбираем позицию "Инфоблок"

выбираем позицию модуля

 

Теперь обновив на сайте страницу карточки товара наш инфоблок исчезнет. Потому что страница ничего не знает о новой позиции. Переходим к шагу 2.

Шаг-2.
Подготовим данные для вывода на странице товара нашего инфоблока.
Данные для страницы карточки товара готовятся в контроллере

/catalog/controller/product/product.php

 Открываем его и, почти в самом конце, сразу после строки

 $data['header'] = $this->load->controller('common/header');
Внимание! Эта строка встречается в скрипте 2 раза.

вставляем код после первого вхождения указанной строки:

 // Получаем данные для модуля Инфоблок
$this->load->model('design/layout');
if (isset($this->request->get['route'])) {
$route = (string)$this->request->get['route'];
} else {
$route = 'common/home';
}

$layout_id = $this->model_design_layout->getLayout($route);

$data['modules'] = array();
$modules = $this->model_design_layout->getLayoutModules($layout_id, 'content_infoblock');

foreach ($modules as $module) {
$part = explode('.', $module['code']);
 
if (isset($part[0]) && $this->config->get($part[0] . '_status')) {
$data['modules'][] = $this->load->controller('module/' . $part[0]);
}
 
if (isset($part[1])) {
$setting_info = $this->model_extension_module->getModule($part[1]);

if ($setting_info && $setting_info['status']) {
$data['modules'][] = $this->load->controller('module/' . $part[0], $setting_info);
        }
    }
}

// Конец Инфоблок

 Ниже этого кода должно быть

......
} else {
......

 Этот блок кода является универсальным и может использоваться для вывода любого модуля в нашей собственной позиции content_infoblock на ЛЮБОЙ странице.
Например, если нам потребуется прикрутить наш инфоблок (или любой другой модуль!) на страницу Категория, то мы вставим этот кусок кода в контроллер Категории

/catalog/controller/product/category.php

И таких позиций мы можем создавать сколько угодно, с уникальными именами разумеется.

Итак, данные мы получили. Остался последний шаг - вывести их на морде в нужной позиции. Делаем шаг-3.

 

Шаг-3.
Открываем шаблон страницы продукта

/catalog/view/theme/default/template/product/product.tpl

Находим кнопку "Купить" (примерно 313 строка)

<div class="form-group">
  <label class="control-label" for="input-quantity"><?php echo $entry_qty; ?></label>
  <input type="text" name="quantity" value="<?php echo $minimum; ?>" size="2" id="input-quantity" class="form-control" />
  <input type="hidden" name="product_id" value="<?php echo $product_id; ?>" />
  <br />
  <button type="button" id="button-cart" data-loading-text="<?php echo $text_loading; ?>" class="btn btn-primary btn-lg btn-block"><?php echo $button_cart; ?></button>
</div>

 

 и ниже добавляем код вывода нашего инфоблока(ов)

<?php foreach ($modules as $module) { echo $module; } ?>

 

 Любуемся на результат нашего труда:

модуль сидит в нашей позиции

 

Модуль выводится циклом, потому что мы можем создать несколько разных модулей и указать им нашу позицию, по аналогии со стандартными позициями. Все модули с нашей позицией выведутся на странице один за другим. В данном примере массив состоит из одного элемента-модуля.