Добавляем новую позицию для модулей Opencart 1.5.x
Актуально для Opencart 1.5 до версии 1.5.4, тестировалось на версиях 1.5.3 и 1.5.4
В стандартном варианте Opencart имеет всего четыре положения модулей — шапка, левая колонка, правая колонка, низ сайта. Для большинства простых сайтов этого достаточно, но для более сложных конструкций этого мало. Надо сразу заметить, что объявление новых «регионов» для модулей не так просто, как в других CMS, например WordPress или Drupal. Opencart в этом плане менее гибкая система, но это решаемо, поэтому для тех, кому нужно добавить новые расположения для модулей, и будет эта статья.
Одним из самых часто используемых положений является расположение модулей непосредственно в подвале — футере сайта. Во-первых, футер выводится на всех страницах сайта, поэтому отображенная в нем информация будет доступна с любой страницы, во-вторых, в стандартной версии явно не хватает возможности редактировать то, что будет показано в футере.
Добавляем новую позицию модулей:
1. Создадим файл контроллера. Заходим в папку catalog/controller/common/ и создадим файл footer_new.php. В файл вставим следующий код:
<?php
class ControllerCommonFooterNew extends Controller {
public function index() {
$this->load->model('design/layout');
$this->load->model('catalog/category');
$this->load->model('catalog/product');
$this->load->model('catalog/information');
if (isset($this->request->get['route'])) {
$route = (string)$this->request->get['route'];
} else {
$route = 'common/home';
}
$layout_id = 0;
if ($route == 'product/category' && isset($this->request->get['path'])) {
$path = explode('_', (string)$this->request->get['path']);
$layout_id = $this->model_catalog_category->getCategoryLayoutId(end($path));
}
if ($route == 'product/product' && isset($this->request->get['product_id'])) {
$layout_id = $this->model_catalog_product->getProductLayoutId($this->request->get['product_id']);
}
if ($route == 'information/information' && isset($this->request->get['information_id'])) {
$layout_id = $this->model_catalog_information->getInformationLayoutId($this->request->get['information_id']);
}
if (!$layout_id) {
$layout_id = $this->model_design_layout->getLayout($route);
}
if (!$layout_id) {
$layout_id = $this->config->get('config_layout_id');
}
$module_data = array();
$this->load->model('setting/extension');
$extensions = $this->model_setting_extension->getExtensions('module');
foreach ($extensions as $extension) {
$modules = $this->config->get($extension['code'] . '_module');
if ($modules) {
foreach ($modules as $module) {
if ($module['layout_id'] == $layout_id && $module['position'] == 'footer_new' && $module['status']) {
$module_data[] = array(
'code' => $extension['code'],
'setting' => $module,
'sort_order' => $module['sort_order']
);
}
}
}
}
$sort_order = array();
foreach ($module_data as $key => $value) {
$sort_order[$key] = $value['sort_order'];
}
array_multisort($sort_order, SORT_ASC, $module_data);
$this->data['modules'] = array();
foreach ($module_data as $module) {
$module = $this->getChild('module/' . $module['code'], $module['setting']);
if ($module) {
$this->data['modules'][] = $module;
}
}
if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/common/footer_new.tpl')) {
$this->template = $this->config->get('config_template') . '/template/common/footer_new.tpl';
} else {
$this->template = 'default/template/common/footer_new.tpl';
}
$this->render();
}
}
?>
2. Сделаем TPL файл для новой позиции. В папке catalog/view/theme/default/template/common/ (вместо default, конечно же, заходим в папку вашего шаблона, для которого регистрируете новую позицию) создаем файл footer_new.tpl. В файл вставляем код:
<?php foreach ($modules as $module) { ?>
<?php echo $module; ?>
<?php } ?>
3. Саму позицию мы уже зарегистрировали, теперь надо описать ее вывод в нужном месте шаблона. Это делается в несколько этапов.
Редактируем файл catalog/controller/common/footer.php (обратите внимание — это обычный файл футера, а не footer_new.php, который мы создавали в начале статьи), ищем строку
$this->render();
и вставляем перед ней
$this->children = array(
'common/footer_new'
);
Контроллер объявили, теперь редактируем tpl файл catalog/view/theme/default/template/common/footer.tpl, в нем, как правило, один большой блок
<div id="footer"></div>, в зависимости от того, где нам нужно вывести модули, вставляем следующий код до или после блока, я вставлю после, чтобы новая позиция была в самом низу сайта:
<?php echo $footer_new; ?>
4. Новая позиция не добавляется в админку автоматически, поэтому придется дописывать ее каждому модулю вручную. Поэтому решите сразу, какие модули будут отображаться на новом месте, чтобы не выполнять лишнюю работу. Редактируем файл необходимого модуля, например, модуль последних поступлений admin/view/template/module/latest.tpl, ищем в нем подобный код:
<?php if ($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 ($module['position'] == 'footer_new') { ?>
<option value="footer_new" selected="selected">Footer New</option>
<?php } else { ?>
<option value="footer_new">Footer New</option>
<?php } ?>
Ниже в файле ищем строку:
html += ' <option value="content_top"><?php echo $text_content_top; ?></option>';
Добавляем над ней:
html += ' <option value="footer_new">Footer New</option>';
5. Если все было сделано правильно, теперь можно зайти в админку в настройки модуля последних поступлений, и вы увидите, что кроме четырех стандартных позиций добавилась новая. Выбираем ее и смотрим на результаты:
Теперь останется лишь описать стили для отображения необходимых модулей на новой позиции. Для того, кто справился с добавлением новой позиции, думаю, это не составит труда 🙂
Частично инфомация взята и переведена из источника www.opencartnews.com
Возможно вам также будут интересны статьи:
- Создание шаблона для Opencart 1.5.4. Базовые знания
- Интернет-магазин на Opencart. Обзор движка, инструкция по установке, плюсы и минусы
- Добавляем адрес и телефон в шапку сайта на Opencart 1.5.x
- Схемы в Opencart. Различная структура сайта для отдельных страниц
- Настройка эффектов слайдера и карусели в Opencart
Комментарии
А было бы интересно знать как добавлять новую позицию в шапку сайта
- Войдите, чтобы оставлять комментарии
практически также как в футер, только редактировать файлы header.php и header.tpl вместо footer.php и footer.tpl
- Войдите, чтобы оставлять комментарии
А у меня ошибка Class 'Controllercommonheadernew' not found in D:wampwwwpodvqmodvqcachevq2-system_engine_controller.php on line 42
- Войдите, чтобы оставлять комментарии
Замечательная статья. Спасибо.Ждем еще каких-нибудь интересностей.
- Войдите, чтобы оставлять комментарии
Молодцы, что собираете то что находтся на просторах 🙂
Только почему название у статьи — "Добавляем новую позицию для модулей Opencart 1.5.4.1" — позиции для других версий так же делаются)
Возможно другим была бы полезна эта информация так же)
- Войдите, чтобы оставлять комментарии
Потому что лично мной проверялось на версии 1.5.4.1. На версии 1.5.3 тоже должно работать, а вот про остальные не знаю, возможно, они все-таки могут чем-то отличаться, не хотелось бы вводить людей в замешательство. Но название немного подправлю 🙂
- Войдите, чтобы оставлять комментарии
У меня выдает ошибку при заходе на сайт, в админке все хорошо.
Fatal error: Class 'Controllercommonfooterbot' not found in U:homeopencartwwwvqmodvqcachevq2-system_engine_controller.php on line 42
Назвал позицию footer_bot
- Войдите, чтобы оставлять комментарии
А все разобрался с ошибкой, спасибо, незаметил что имя класса надо поменять тоже на ControllerCommonFooterBot))
- Войдите, чтобы оставлять комментарии
Добрый день! Все работает, но в админке вот такие ошибки появились (версия 1.5.4.1):
Notice: Undefined variable: text_information in /shop/admin/view/template/common/footer.tpl on line 3
Подскажите, пожалуйста, как исправить?
- Войдите, чтобы оставлять комментарии
Извините, нет никаких ошибок, это я не тот файл подменила по невнимательности ;). Отличная статья! Мне пригодилась. Спасибо!
- Войдите, чтобы оставлять комментарии
Добрый день, сделал новую позацию в шапке сайт по инструкции подобной вашей
(http://antiden.ru/dobavlenie-novogo-bloka-dlya-modulya-opencart/)
все получилось.
Могу добавить туда модуль из админки.
Но позиция по умолчанию кончено является шириной на всю страницу, и длинной по размеру содержимого, мне нужно чтобы это был прямоуголник заданных размеров в правой части шапки (туда вставятся контактные данные магазина с помощью HTML модуля), подозреваю что это правится в stylesheet.css моего шаблона …
Подозреваю что по аналогии с
/* layout */
#container {
width: 250px;
float: right;
}
- Войдите, чтобы оставлять комментарии
Добрый день. Вам сначала надо добавить контейнер для модуля в файле шаблона catalog/view/theme/default/template/common/footer_new.tpl (в моей статье файл называется footer_new.tpl, вы, может быть, назвали по-другому). Например, пусть контейнер будет называться <div class="header_contacts">. Тогда получится следующее:
В файле footer_new.tpl
<div class="header_contacts">
<?php foreach ($modules as $module) { ?>
<?php echo $module; ?>
<?php } ?>
</div>
В файле stylesheet.css
.header_contacts {
width: 250px;
}
Если необходимо, задайте новому блоку абсолютное позиционирование, чтобы вывести его в нужном месте шапки.
- Войдите, чтобы оставлять комментарии
ну капец! а если у меня нету такой строчки????
$this->render();
- Войдите, чтобы оставлять комментарии
Должна быть. Посмотрите внимательно файл catalog/controller/common/footer.php , она там почти в самом конце. Если нету, значит, у вас какой-то другой опенкарт
- Войдите, чтобы оставлять комментарии
Сделал по Вашей инструкции, но только для хедера. Разместил все то же самое, но в файлах header.php и header.tpl. Работать-то работает, но только вот теперь перестал выводится блок с корзиной в шапке сайта, а так же блок с языками. Пишет ошибку: Notice: Undefined variable: language in /home/public_html/catalog/view/theme/hyla/template/common/header.tpl on line 111 Notice: Undefined variable: currency in /home/public_html/catalog/view/theme/hyla/template/common/header.tpl on line 112 Notice: Undefined variable: cart in /home/public_html/catalog/view/theme/hyla/template/common/header.tpl on line 113
Не знаете, в чем может быть дело? Заранее большое спасибо за ответ!
- Войдите, чтобы оставлять комментарии
вопрос снят, разобрался. $this->children = array('common/footer_new'); надо было на несколько строчек выше прописать
- Войдите, чтобы оставлять комментарии
Добавил позицию для модуля Карусель, модуль не показывается, выводит Notice: Undefined variable: modules in /catalog/view/theme/default/template/common/header_big.tpl on line 1
В каком месте причину ошибки искать?
OpenCart 1.5.5.1.1
- Войдите, чтобы оставлять комментарии
У 1.5.5 немного другой код в файле контроллера. Чтобы правильно создать файл header_big.php скопируйте код из файла column_left.php и там переименуйте класс в первой строке на ControllerCommonHeaderBig, затем внесите следующие изменения в код — замените column_left на header_big:
Примерно 50 строка:
if ($module['layout_id'] == $layout_id && $module['position'] == 'header_big' && $module['status']) {
Примерно 79 строка:
if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/common/header_big.tpl')) {
$this->template = $this->config->get('config_template') . '/template/common/header_big.tpl';
} else {
$this->template = 'default/template/common/header_big.tpl';
}
В файл header_big.tpl вставьте следующий код:
<?php if ($modules) { ?>
<?php foreach ($modules as $module) { ?>
<?php echo $module; ?>
<?php } ?>
<?php } ?>
Так как эта статья написана для версии 1.5.4 могут быть отличия и в других файлах, в ближайшее время постараюсь написать статью для 1.5.5
- Войдите, чтобы оставлять комментарии
Здравствуйте, спасибо за вашу подсказку — очень помогло в свершении безумных планах заказчика) Подскажите пожалуйста — как добавить такую позицию в категорию товаров, именно в блок с фильтром. Просто у меня на версии 1.5.6 в catalog/controller/product/category.php нету строчки $this->render();, пытался ставить наугад — но ничего не вышло.
- Войдите, чтобы оставлять комментарии
Вывел так как сделано тут: http://antiden.ru/dobavlenie-novogo-bloka-dlya-modulya-opencart/.
- Войдите, чтобы оставлять комментарии
Большое Вам спасибо за статью! Все работает и на более старой версии ОС 1.5.1.3
- Войдите, чтобы оставлять комментарии
Подскажите, как вывести несколько модулей в нужные позиции, при добавлении второго рядом выдает ошибку Notice: Undefined variable… в footer.tpl в строке где стоит первый из модулей.
- Войдите, чтобы оставлять комментарии
Проверьте, правильно ли вы добавили новую позицию, если добавляли. Появляется ли эта ошибка только в футере, или и в других позициях тоже? Жаль, что не скопировали полностью текст ошибки, было бы проще вам что-то подсказать.
- Войдите, чтобы оставлять комментарии
Сделал в шапке — получилось но на месте карзины викынуло Notice: Undefined variable: cart in /sata1/home/users/selekcia/www/www.easystore.com.ua/catalog/view/theme/fortuna/template/common/header.tpl on line 317 NOTICE: UNDEFINED VARIABLE: LANGUAGE IN /SATA1/HOME/USERS/SELEKCIA/WWW/WWW.EASYSTORE.COM.UA/CATALOG/VIEW/THEME/FORTUNA/TEMPLATE/COMMON/HEADER.TPL ON LINE 319 NOTICE: UNDEFINED VARIABLE: CURRENCY IN /SATA1/HOME/USERS/SELEKCIA/WWW/WWW.EASYSTORE.COM.UA/CATALOG/VIEW/THEME/FORTUNA/TEMPLATE/COMMON/HEADER.TPL ON LINE 320
Как исправить
- Войдите, чтобы оставлять комментарии
скорее всего не корректно вставили код новой позиции в контроллере шапки. Обратите внимание в файле header.php изначально уже есть нужная строка, поэтому вставлять новую позицию надо не после $this->render();, а вот сюда:
$this->children = array(
'module/language',
'module/currency',
'module/cart'
);
после 'module/cart' ставите обязательно запятую, получается нечто вроде:
$this->children = array(
'module/language',
'module/currency',
'module/cart',
'common/имя вашей позиции'
);
- Войдите, чтобы оставлять комментарии
OCStore 1.5.5.1.1
Сделал как описано в вашей инструкции, включая отличия описанные вами в комментариях для моей версии, но модуль, не появляется.
Создаю позицию над футером, называется bottom. Позицию добавляю в модуль bestseller. В админке выбираю ему новую позицию. Div, которым я обернул цикл в файле bottom.tpl, выводится на странице, а вот внутри него пусто… Может подскажите в чём может быть дело? Первый раз ковыряю Опенкарт))))
Заранее спасибо!
- Войдите, чтобы оставлять комментарии
Всё, вопрос снят. Почему заработало сказать не могу. В очередной раз очистил кэш (хотя до этого чистил после любой правки), несколько раз туда сюда в настройках модуля сменил позицию, последний раз выставил свою и вуаля.
- Войдите, чтобы оставлять комментарии
Здравствуйте, подскажите как вывести в карточку товара
Редактируем файл catalog/controller/common/footer.php (обратите внимание — это обычный файл футера, а не footer_new.php, который мы создавали в начале статьи), ищем строку
$this->render();
в каком файле нужно внести изменения?
- Войдите, чтобы оставлять комментарии
Если надо вывести модуль на странице какого-либо отдельного товара, то можно создать схему в разделе Дизайн в админке сайта (Система — Дизайн — Схемы): просто ввести какое-нибудь название, больше ничего не добавлять и сохранить ее. Потом в настройках модуля добавить эту схему и задать расположение. И затем при редактировании товара на вкладке Дизайн выбрать эту схему.
Если же надо вывести модуль сразу для всех товаров, тогда в настройках модуля надо выбрать схему Продукт.
Или вам надо именно новую позицию добавить?
- Войдите, чтобы оставлять комментарии
нужно вывести в самом товаре с боку текст статический для всех товаров
- Войдите, чтобы оставлять комментарии
Если нужно вывести в одной из боковых колонок, то можно установить html модуль, например, этот http://goo.gl/r7a5Ew, написать в нем нужный текст и затем выбрать для него схему "Продукт", если этой схемы нет, то добавить ее через меню Система — Дизайн — Схемы. Ввести название Продукт и указать путь product/product
А если надо вывести в описании товара, там где выводится название товара, цена и т.д., то надо шаблон подредактировать.
- Войдите, чтобы оставлять комментарии
- Автоматическое монтирование fstab и systemd - 24.02.2021
- Как в Linux подключить новый диск, разметить и отформатировать разделы - 24.02.2021
- Как сменить режим работы PHP - 24.02.2021