Добавляем новую позицию для модулей 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. Если все было сделано правильно, теперь можно зайти в админку в настройки модуля последних поступлений, и вы увидите, что кроме четырех стандартных позиций добавилась новая. Выбираем ее и смотрим на результаты:

добавляем новую позицию модулей opencart

добавляем новую позицию модулей opencart

Теперь останется лишь описать стили для отображения необходимых модулей на новой позиции. Для того, кто справился с добавлением новой позиции, думаю, это не составит труда :)

Частично инфомация взята и переведена из источника www.opencartnews.com

Возможно вам также будут интересны статьи:

Tags: 

Комментарии

Аватар пользователя Андрей

А было бы интересно знать как добавлять новую позицию в шапку сайта

Аватар пользователя Asterial

практически также как в футер, только редактировать файлы header.php и header.tpl вместо footer.php и footer.tpl

Аватар пользователя Андрей

А у меня ошибка Class 'Controllercommonheadernew' not found in D:\wamp\www\pod\vqmod\vqcache\vq2-system_engine_controller.php on line 42

Аватар пользователя Андрей

Огромное спасибо за статью, все получилось!!!

Аватар пользователя Ангор

Замечательная статья. Спасибо.Ждем еще каких-нибудь интересностей.

Аватар пользователя crsp

Молодцы, что собираете то что находтся на просторах :)
Только почему название у статьи - "Добавляем новую позицию для модулей Opencart 1.5.4.1" - позиции для других версий так же делаются)
Возможно другим была бы полезна эта информация так же)

Аватар пользователя Asterial

Потому что лично мной проверялось на версии 1.5.4.1. На версии 1.5.3 тоже должно работать, а вот про остальные не знаю, возможно, они все-таки могут чем-то отличаться, не хотелось бы вводить людей в замешательство. Но название немного подправлю :)

Аватар пользователя Михаил

У меня выдает ошибку при заходе на сайт, в админке все хорошо.
Fatal error: Class 'Controllercommonfooterbot' not found in U:\home\opencart\www\vqmod\vqcache\vq2-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

Подскажите, пожалуйста, как исправить?

Аватар пользователя Наталия

Извините, нет никаких ошибок, это я не тот файл подменила по невнимательности ;). Отличная статья! Мне пригодилась. Спасибо!

Аватар пользователя Asterial

Бывает :)

Аватар пользователя Татьяна

Спасибо, статья мне очень пригодилась.

Аватар пользователя airy

Добрый день, сделал новую позацию в шапке сайт по инструкции подобной вашей
(http://antiden.ru/dobavlenie-novogo-bloka-dlya-modulya-opencart/)
все получилось.
Могу добавить туда модуль из админки.
Но позиция по умолчанию кончено является шириной на всю страницу, и длинной по размеру содержимого, мне нужно чтобы это был прямоуголник заданных размеров в правой части шапки (туда вставятся контактные данные магазина с помощью HTML модуля), подозреваю что это правится в stylesheet.css моего шаблона ...
Подозреваю что по аналогии с

/* layout */
#container {
width: 250px;
float: right;
}

Аватар пользователя Asterial

Добрый день. Вам сначала надо добавить контейнер для модуля в файле шаблона 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();

Аватар пользователя Asterial

Должна быть. Посмотрите внимательно файл catalog/controller/common/footer.php , она там почти в самом конце. Если нету, значит, у вас какой-то другой опенкарт

Аватар пользователя svetik

а как прописать код в файл tpl? в php все без проблем

Аватар пользователя Asterial

а в tpl какие проблемы?

Аватар пользователя А

Сделал по Вашей инструкции, но только для хедера. Разместил все то же самое, но в файлах 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'); надо было на несколько строчек выше прописать

Аватар пользователя Алекс

эт точно, в 1.5.5.1.1 по другому не получалось у меня

Аватар пользователя Виталий

Добавил позицию для модуля Карусель, модуль не показывается, выводит Notice: Undefined variable: modules in /catalog/view/theme/default/template/common/header_big.tpl on line 1
В каком месте причину ошибки искать?
OpenCart 1.5.5.1.1

Аватар пользователя Asterial

У 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

Аватар пользователя Nellie

На OCStore 1.5.4.1 работает все без ошибок, спасибо большое!

Аватар пользователя Владимир

Здравствуйте, спасибо за вашу подсказку - очень помогло в свершении безумных планах заказчика) Подскажите пожалуйста - как добавить такую позицию в категорию товаров, именно в блок с фильтром. Просто у меня на версии 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 в строке где стоит первый из модулей.

Аватар пользователя Asterial

Проверьте, правильно ли вы добавили новую позицию, если добавляли. Появляется ли эта ошибка только в футере, или и в других позициях тоже? Жаль, что не скопировали полностью текст ошибки, было бы проще вам что-то подсказать.

Аватар пользователя Станислав

p.s. Opencart 1.5.5.1

Аватар пользователя Александр

Сделал в шапке - получилось но на месте карзины викынуло 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
Как исправить

Аватар пользователя Asterial

скорее всего не корректно вставили код новой позиции в контроллере шапки. Обратите внимание в файле 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/имя вашей позиции'
);

Аватар пользователя ftomivec

Спасибо, помогло )

Аватар пользователя Serg

OCStore 1.5.5.1.1
Сделал как описано в вашей инструкции, включая отличия описанные вами в комментариях для моей версии, но модуль, не появляется.
Создаю позицию над футером, называется bottom. Позицию добавляю в модуль bestseller. В админке выбираю ему новую позицию. Div, которым я обернул цикл в файле bottom.tpl, выводится на странице, а вот внутри него пусто... Может подскажите в чём может быть дело? Первый раз ковыряю Опенкарт))))
Заранее спасибо!

Аватар пользователя Serg

Всё, вопрос снят. Почему заработало сказать не могу. В очередной раз очистил кэш (хотя до этого чистил после любой правки), несколько раз туда сюда в настройках модуля сменил позицию, последний раз выставил свою и вуаля.

Аватар пользователя Samsung Tab

отлично помогло!!!!

Аватар пользователя Serega

Здравствуйте, подскажите как вывести в карточку товара

Редактируем файл catalog/controller/common/footer.php (обратите внимание — это обычный файл футера, а не footer_new.php, который мы создавали в начале статьи), ищем строку

$this->render();

в каком файле нужно внести изменения?

Аватар пользователя Serega

Здравствуйте, подскажите, а как вывести модуль в товаре?

Аватар пользователя Asterial

Если надо вывести модуль на странице какого-либо отдельного товара, то можно создать схему в разделе Дизайн в админке сайта (Система - Дизайн - Схемы): просто ввести какое-нибудь название, больше ничего не добавлять и сохранить ее. Потом в настройках модуля добавить эту схему и задать расположение. И затем при редактировании товара на вкладке Дизайн выбрать эту схему.
Если же надо вывести модуль сразу для всех товаров, тогда в настройках модуля надо выбрать схему Продукт.
Или вам надо именно новую позицию добавить?

Аватар пользователя Serega

нужно вывести в самом товаре с боку текст статический для всех товаров

Аватар пользователя Asterial

Если нужно вывести в одной из боковых колонок, то можно установить html модуль, например, этот http://goo.gl/r7a5Ew, написать в нем нужный текст и затем выбрать для него схему "Продукт", если этой схемы нет, то добавить ее через меню Система - Дизайн - Схемы. Ввести название Продукт и указать путь product/product
А если надо вывести в описании товара, там где выводится название товара, цена и т.д., то надо шаблон подредактировать.