OpenCart Club

Разработка под Opencart

Добавляем новую позицию для вывода модуля opencart 2.*

  В стандартном варианте Opencart имеет всего четыре положения модулей — шапка, левая колонка, правая колонка, низ сайта. Для большинства простых сайтов этого достаточно, но для более сложных конструкций этого мало. Надо сразу заметить, что объявление новых «расположений» для модулей не так просто, как в других CMS, например WordPress или Drupal. Opencart в этом плане менее гибкая система, но это решаемо, поэтому для тех, кому нужно добавить новые расположения для модулей, и будет эта статья.

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

Начнем добавление новой позиции.

  1. Создадим файл контроллера. Заходим в папку catalog/controller/common/ и создадим файл header_new.php. В файл вставляем следующий код:

[php]

 

<?php
class ControllerCommonHeaderNew extends Controller {
public function index() {
$this->load->model(‘design/layout’);

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’])) {
$this->load->model(‘catalog/category’);

$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’])) {
$this->load->model(‘catalog/product’);

$layout_id = $this->model_catalog_product->getProductLayoutId($this->request->get[‘product_id’]);
}

if ($route == ‘information/information’ && isset($this->request->get[‘information_id’])) {
$this->load->model(‘catalog/information’);

$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’);
}

$this->load->model(‘extension/module’);

$data[‘modules’] = array();

$modules = $this->model_design_layout->getLayoutModules($layout_id, ‘header_new’);

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);
}
}
}

if (file_exists(DIR_TEMPLATE . $this->config->get(‘config_template’) . ‘/template/common/header_new.tpl’)) {
return $this->load->view($this->config->get(‘config_template’) . ‘/template/common/header_new.tpl’, $data);
} else {
return $this->load->view(‘default/template/common/header_new.tpl’, $data);
}
}
}

[/php]

2. Создаем файл tpl для новой позиции.

В папке catalog/view/theme/default/template/common/ (вместо default, конечно же, заходим в папку вашего шаблона, для которого создается новая позиция) создаем файл header_new.tpl.

В файл вставляем код:

[php]

<?php if ($modules) { ?>

<aside id=”header-bottom” class=”col-sm-12 hidden-xs”>

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

<?php echo $module; ?>

<?php } ?>

</aside>

<?php } ?>

[/php]

Саму позицию мы уже зарегистрировали, теперь надо описать ее вывод в нужном месте шаблона. Это делается в несколько этапов.

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

Ищем строку:

[php]$data[‘cart’] = $this->load->controller(‘common/cart’);[/php]

и вставляем перед ней

$data[‘header_new’] = $this->load->controller(‘common/header_new’);

   4. Контроллер объявили, теперь редактируем tpl файл catalog/view/theme/default/template/common/header.tpl, в зависимости от того, где нам нужно вывести модули, вставляем следующий код до или после блока, я вставлю после, чтобы новая позиция была в самом низу шапки сайта, под меню:

опускаемся в самый низ файла ищем код :

[php] <?php } ?> [/php]

и после нее вставляем код:

[php] <?php echo $header_new; ?>[/php]

 Теперь нужно реализовать выбор вновь созданной позиции в административной части сайта.

    5.Открываем admin/view/template/design/layout_form.tpl

Находим код :

[php]

<option value=”column_right” selected=”selected”><?php echo $text_column_right; ?></option>

<?php } else { ?>

<option value=”column_right”><?php echo $text_column_right; ?></option>

<?php } ?>[/php]

И после него вставляем :

[php]

<?php if ($layout_module[‘position’] == ‘header_new’) { ?>

<option value=”header_new” selected=”selected”><?php echo $text_header_new; ?></option>

<?php } else { ?>

<option value=”header_new”><?php echo $text_header_new; ?></option>

<?php } ?>[/php]

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

[php]html += ‘    <option value=”column_right”><?php echo $text_column_right; ?></option>’;[/php]

После нее вставляем:

[php]html += ‘    <option value=”header_new”><?php echo $text_header_new; ?></option>’;[/php]

6. Прокидываем название нашей новой позиции.

Открываем файл admin/controller/design/layout.php

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

[php]$data[‘text_column_right’] = $this->language->get(‘text_column_right’);[/php]

После нее вставляем:

[php]$data[‘text_header_new’] = $this->language->get(‘text_header_new’);[/php]

7.  Добавляем название для раздела.

Делаем это в файле admin/language/russian/design/layout.php, где russian может иметь разное значение в зависимости от количества языков, вам надо сделать это изменение во всех языках, то-есть для английского языка надо внести изменения в файл  admin/language/english/design/layout.php и т.д. для всех языков которые установлены в вашем магазине.

Далее находим строку (обратите внимание что в данном примере я навожу строку с файла русского перевода. Если у вас другой язык вы можете вставить строчку после любой другой строки главное что бы она была пере закрывающимся тегом ” ?>”):

[php]$_[‘text_column_right’]   = ‘Правая колонка’;[/php]

После нее вставляем:

[php]$_[‘text_header_new’]   = ‘Нижняя часть header’;[/php]

Вот и все.

Если вы сделали все верно то в административной части своего сайта в разделе:

для opencart до версии 2.1.0.2 – Система/Дизайн/Макеты 

для opencart версии 2.1.0.2 и выше Дизайн/Макеты 

зайдя в любой макет и добавив новый модуль в селекторе “Расположение”, вы сможете увидеть новую позицию которую мы добавили

 

Screenshot_2

18 Discussions on
“Добавляем новую позицию для вывода модуля opencart 2.*”
  • Здравствуйте! Сделал по вашей схеме позицию и добавил в нее слайдер. Все бы не чего, но при добавлении слайдер не перелистывается, картинки расползлись в колонку друг за другом. Что не так?

    • Добрый день.
      Если ваш модуль вывелся в том месте, где вы хотели, то вы сделали все правильно.
      Больше всего причина не работы слайдера заключается в том, что стили для слайдера прописаны с учетом разметки страницы при выводе слайдера в colom-top, например. А вы вывели его в header или footer, где попросту нету данной разметки. Попробуйте вставить вновь созданную позицию возле позиции, на которой слайдер отображается корректно, и проверьте его работоспособность.

  • сами то пробовали ?
    у вас ошибка сразу лезет на фронте line 142 лишние скобки и за ней уже все остальное, поправьте

    • Спасибо, что подсказали. Вот проверил и действительно нашел ошибки. Все поправил и внес изменения. На данный момент все атуально и работает.

  • Добрый день! Подскажите пожалуйста, если мне надо вывести слайдер вверху только на главной странице, то ваш метод подойдет?
    Я сегодня скачал модуль с позициями – на дефолтном шаблоне работает, а на недефолтном не работает. Второй день ломаю голову, не могу разобраться.
    А мне надо всего лишь отобразить мега-слайдер вверху страницы.

    • Добрый день.
      Все зависит, от того что вы считаете верхом?
      Если у вас не дефолтный шаблон то надо править модификатор. Наверное у вас изменена структура файлов, вот он и не отрабатывает.

  • Застопорился на шаге 5… в файле admin/view/template/design/layout_form.tpl нет такого кода в версии 2.3.0.2 что там нужно изменить?

    • Добрый день.
      Дело в том, что данная статья написана для opencart 2.1*
      В opencart 2.3*-3.0* все немножко не так реализовано. По этой причине не уверен, что способ описанный мной будет работать на этих версиях.
      Можете скопировать код с 148 по 213 строки.
      в нем заменить $text_content_top; на $text_header_new;
      и ‘content_top’ на ‘header_new’.
      После чего вставьте получившейся код сразу после 147 строки.

      • Добрый!
        На этом шаге есть еще замена строк которые также отсутствую или эта замена уже не нужна после описанного Вами решения?

  • Подскажите, а как можно добавить модуль в карточку товара? Это решение подойдет если использовать в produkt.php и produkt.tpl ?

  • Приветствую!

    Может кому пригодиться – решение проблемы при создании дополнительной области для вывода модулей (указанным выше способом).
    Мне надо было сделать 4 новых позиции (области). Две области добавил, а третью не получалось. Никаких ошибок не выводится, просто в админке не применяется созданная область и все.
    Все перепроверил и нашел – в базе данных название позиции сохраняется не полностью!!! Видимо есть ограничение на длину переменной!
    То есть область “column_extra” сохраняется, а, например, “column_extrasuper” – уже не сохраняется. В базу записывается “column_extrasu”. Переделал название области и все заработало.

  • Здравствуйте!
    В добавленной секции не работает слайдшоу. Не могу найти почему оно не подключается – ява-скрипт не подгружается. HTML-обертки вроде бы те же самые…
    Подскажите пожалуйста.
    В консоли ошибка: TypeError: $(…).owlCarousel is not a function

    • Добрый день. В каком месте сайта добавляете новую секцию? Возможно она выводиться на эеран быстрее чем подключается js скрипт с функцией owlCarousel, что и вызывает данную ошибку.

    • Добрый день.
      Пока не писал. Нету времени. Но там примерно так же будет все. Только со стороны админки в макетах надо будет посмотреть.
      Планирую разобраться с этим на днях. Опишу как разберусь.

  • Одного не понял. Статья начинается о том, как вывести моджуль в футере, в итоге всё пояснение о том, как создать его в хедере.)

Напишите

Ваш email никому не покажем