Opencart - как разместить модуль (HTML-инфоблок) в любом месте на странице
- Подробности
- Категория: Opencart (OCstore)
- Обновлено 18.12.2018
Иногда очень хочется воспользоваться встроенным в Opencart-2 (OcStore-2) модулем "HTML Содержимое",
причем вставить его не в стандартные позиции:
column_left / column_right / content_top / content_bottom
а в свою собственную позицию.
В данном случае, автору понадобилось вставить текстовую информацию на странице карточки товара сразу под кнопкой "Купить".
Этот инфоблок будет выводиться на страницах всех товаров.
Шаг-1.
Создадим в админке этот самый инфоблок с нужной информацией.
Заходим в Модули, нажимаем на кнопку редактирования модуля "HTML Содержимое" и заполняем поля НазваниеМодуля, Заголовок (можно не заполнять), Описание -> сюда пишем нашу информацию или вставляем HTML-код,
и в самом низу меняем статус на Включено
Добавляем наш модуль в схему Продукт
Теперь, если зайти на страницу карточки товара, то мы увидим содержимое нашего модуля в верхней части страницы
Чтобы вывести модуль в нашей собственной позиции на странице, нужно дать название этой позиции. Мы назвали ее 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; } ?>
Любуемся на результат нашего труда:
Модуль выводится циклом, потому что мы можем создать несколько разных модулей и указать им нашу позицию, по аналогии со стандартными позициями. Все модули с нашей позицией выведутся на странице один за другим. В данном примере массив состоит из одного элемента-модуля.