Asterial Web Design — Создание сайтов » Добавляем новую позицию для модулей Opencart 1.5.x


 

Добавляем новую позицию для модулей Opencart 1.5.x

13.04 2013
Категория: 
 

Актуально для 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

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

Tags: 
 

Комментарии

 

Андрей (не проверено)

ср, 05/01/2013 — 18:09

 

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

  • Войдите, чтобы оставлять комментарии
 

Asterial

чт, 05/02/2013 — 01:01

 

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

  • Войдите, чтобы оставлять комментарии

 

Андрей (не проверено)

чт, 05/16/2013 — 12:46

 

А у меня ошибка Class 'Controllercommonheadernew' not found in D:wampwwwpodvqmodvqcachevq2-system_engine_controller.php on line 42

  • Войдите, чтобы оставлять комментарии

 

Андрей (не проверено)

чт, 05/16/2013 — 13:00

 

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

  • Войдите, чтобы оставлять комментарии

 

Ангор (не проверено)

чт, 05/30/2013 — 06:21

 

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

  • Войдите, чтобы оставлять комментарии

 

crsp (не проверено)

пт, 05/31/2013 — 23:16

 

Молодцы, что собираете то что находтся на просторах 🙂

Только почему название у статьи — "Добавляем новую позицию для модулей Opencart 1.5.4.1" — позиции для других версий так же делаются)

Возможно другим была бы полезна эта информация так же)

  • Войдите, чтобы оставлять комментарии
 

Asterial

сб, 06/01/2013 — 02:02

 

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

  • Войдите, чтобы оставлять комментарии

 

Михаил (не проверено)

пн, 06/03/2013 — 16:55

 

У меня выдает ошибку при заходе на сайт, в админке все хорошо.

Fatal error: Class 'Controllercommonfooterbot' not found in U:homeopencartwwwvqmodvqcachevq2-system_engine_controller.php on line 42

Назвал позицию footer_bot

  • Войдите, чтобы оставлять комментарии

 

Михаил (не проверено)

пн, 06/03/2013 — 17:03

 

А все разобрался с ошибкой, спасибо, незаметил что имя класса надо поменять тоже на ControllerCommonFooterBot))

  • Войдите, чтобы оставлять комментарии

 

Наталия (не проверено)

ср, 06/26/2013 — 23:29

 

Добрый день! Все работает, но в админке вот такие ошибки появились (версия 1.5.4.1):

Notice: Undefined variable: text_information in /shop/admin/view/template/common/footer.tpl on line 3

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

  • Войдите, чтобы оставлять комментарии

 

Наталия (не проверено)

чт, 06/27/2013 — 00:01

 

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

  • Войдите, чтобы оставлять комментарии
 

Asterial

чт, 06/27/2013 — 01:18

 

Бывает 🙂

  • Войдите, чтобы оставлять комментарии

 

Татьяна (не проверено)

вт, 08/20/2013 — 22:36

 

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

  • Войдите, чтобы оставлять комментарии

 

airy (не проверено)

пн, 09/09/2013 — 11:02

 

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

(http://antiden.ru/dobavlenie-novogo-bloka-dlya-modulya-opencart/)

все получилось.

Могу добавить туда модуль из админки.

Но позиция по умолчанию кончено является шириной на всю страницу, и длинной по размеру содержимого, мне нужно чтобы это был прямоуголник заданных размеров в правой части шапки (туда вставятся контактные данные магазина с помощью HTML модуля), подозреваю что это правится в stylesheet.css моего шаблона …

Подозреваю что по аналогии с

/* layout */

#container {

width: 250px;

float: right;

}

  • Войдите, чтобы оставлять комментарии
 

Asterial

пн, 09/09/2013 — 19:19

 

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

}

Если необходимо, задайте новому блоку абсолютное позиционирование, чтобы вывести его в нужном месте шапки.

  • Войдите, чтобы оставлять комментарии

 

Иван (не проверено)

пт, 10/04/2013 — 10:21

 

ну капец! а если у меня нету такой строчки????

$this->render();

  • Войдите, чтобы оставлять комментарии
 

Asterial

пт, 10/04/2013 — 15:04

 

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

  • Войдите, чтобы оставлять комментарии

 

svetik (не проверено)

чт, 10/10/2013 — 15:42

 

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

  • Войдите, чтобы оставлять комментарии
 

Asterial

чт, 10/10/2013 — 16:05

 

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

  • Войдите, чтобы оставлять комментарии

 

А (не проверено)

вт, 10/15/2013 — 23:33

 

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

Не знаете, в чем может быть дело? Заранее большое спасибо за ответ!

  • Войдите, чтобы оставлять комментарии

 

А (не проверено)

вт, 10/15/2013 — 23:57

 

вопрос снят, разобрался. $this->children = array('common/footer_new'); надо было на несколько строчек выше прописать

  • Войдите, чтобы оставлять комментарии
 

Алекс (не проверено)

вт, 12/03/2013 — 23:42

 

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

  • Войдите, чтобы оставлять комментарии

 

Виталий (не проверено)

вс, 10/20/2013 — 17:07

 

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

В каком месте причину ошибки искать?

OpenCart 1.5.5.1.1

  • Войдите, чтобы оставлять комментарии
 

Asterial

вт, 10/22/2013 — 10:11

 

У 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 (не проверено)

чт, 10/24/2013 — 13:36

 

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

  • Войдите, чтобы оставлять комментарии

 

Владимир (не проверено)

сб, 10/26/2013 — 11:37

 

Здравствуйте, спасибо за вашу подсказку — очень помогло в свершении безумных планах заказчика) Подскажите пожалуйста — как добавить такую позицию в категорию товаров, именно в блок с фильтром. Просто у меня на версии 1.5.6 в catalog/controller/product/category.php нету строчки $this->render();, пытался ставить наугад — но ничего не вышло.

  • Войдите, чтобы оставлять комментарии

 

Владимир (не проверено)

сб, 10/26/2013 — 11:44

 

Вывел так как сделано тут: http://antiden.ru/dobavlenie-novogo-bloka-dlya-modulya-opencart/.

  • Войдите, чтобы оставлять комментарии

 

Анна (не проверено)

пт, 11/08/2013 — 08:27

 

Большое Вам спасибо за статью! Все работает и на более старой версии ОС 1.5.1.3

  • Войдите, чтобы оставлять комментарии

 

Станислав (не проверено)

вс, 11/17/2013 — 16:20

 

Подскажите, как вывести несколько модулей в нужные позиции, при добавлении второго рядом выдает ошибку Notice: Undefined variable… в footer.tpl в строке где стоит первый из модулей.

  • Войдите, чтобы оставлять комментарии
 

Asterial

вт, 11/19/2013 — 13:22

 

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

  • Войдите, чтобы оставлять комментарии

 

Станислав (не проверено)

вс, 11/17/2013 — 16:21

 

p.s. Opencart 1.5.5.1

  • Войдите, чтобы оставлять комментарии

 

Александр (не проверено)

вт, 11/19/2013 — 12:58

 

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

вт, 11/19/2013 — 13:20

 

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

пт, 12/13/2013 — 13:09

 

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

  • Войдите, чтобы оставлять комментарии

 

Serg (не проверено)

пн, 01/20/2014 — 11:35

 

OCStore 1.5.5.1.1

Сделал как описано в вашей инструкции, включая отличия описанные вами в комментариях для моей версии, но модуль, не появляется.

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

Заранее спасибо!

  • Войдите, чтобы оставлять комментарии

 

Serg (не проверено)

пн, 01/20/2014 — 12:04

 

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

  • Войдите, чтобы оставлять комментарии

 

Samsung Tab (не проверено)

пн, 03/17/2014 — 01:13

 

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

  • Войдите, чтобы оставлять комментарии

 

Serega (не проверено)

пн, 04/07/2014 — 22:10

 

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

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

$this->render();

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

  • Войдите, чтобы оставлять комментарии

 

Serega (не проверено)

вт, 04/08/2014 — 00:51

 

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

  • Войдите, чтобы оставлять комментарии
 

Asterial

ср, 04/09/2014 — 15:15

 

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

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

Или вам надо именно новую позицию добавить?

  • Войдите, чтобы оставлять комментарии

 

Serega (не проверено)

вт, 04/29/2014 — 01:11

 

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

  • Войдите, чтобы оставлять комментарии
 

Asterial

вт, 04/29/2014 — 17:52

 

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

А если надо вывести в описании товара, там где выводится название товара, цена и т.д., то надо шаблон подредактировать.

  • Войдите, чтобы оставлять комментарии

http://asterial.ru/saytostroenie/dobavlyaem-novuyu-poziciyu-dlya-moduley-opencart-1541

Губарь Маргарита Александровна