Jump to content
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

[РЕШЕНО] Вывод модулей в Header/Footer


Recommended Posts

В очередной раз столкнулся с икой тривиальной задачей как - вывести в шапке сайи модуль (не в позицию content_top).

Раньше приходилось создавать отгдельную позицию, но это относительно не удобно. Нужно создавать новые файлы и именно в header.tpl все равно вывода нет.

 

Копаясь в когде решил сгделать свой "велосипед", может кому пригодится.

Что дает:

- вывод люпотому чтого модуля в шапку или в подвал (именно в header.tpl/footer.tpl)

- вывод на всех страницах без создания новых схем.

 

Начнем.
1.Открываем catalog/controller/common/header.php

перед строкой 

if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/common/header.tpl')) {

Добавляем код который отвечает за вывод модулей в позиции header

$layout_id = 0;

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'] == 'header' && $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;
}
}

2. В шаблоне вывода catalog/view/theme/default/common/header.tpl добавляем код для выводя модулей

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

...можно обернуть в div блок

Позиция header у нас теперьь суещёствует, осилось добавить информацию для выводимого модуля о позиции header
для этого открываем файл вывода вашего модуля в админке admin/view/template/module/your_module.tpl

и после строчек 

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

добавляем

 <?php if ($module['position'] == 'header') { ?> 
 <option value="header" selected="selected"><?php echo $text_header; ?></option>
 <?php } else { ?>
 <option value="header"><?php echo $text_header; ?></option>
 <?php } ?>

и ниже в этом же файле после

html += '      <option value="column_right"><?php echo $text_column_right; ?></option>';

добавляем

html += '      <option value="header"><?php echo $text_header; ?></option>';

3. В контролере модуля admin/controller/module/your_module.php

после

$this->data['text_column_right'] = $this->language->get('text_column_right');
добавляем
$this->data['text_header'] = $this->language->get('text_header');

4. Дальше в языковом admin/language/russian/module/your_module.php после

$_['text_column_right']   = 'Правая колонка';

добавляем

$_['text_header']    = 'В шапке сайи';

ВСЕ! У вас модуль знает икую позицию как "В шапке сайи" выбираете и он выводится туда.

 

ЕСЛИ НУЖНО ВЫВЕСТИ МОДУЛЬ НА ВСЕХ СТРАНИЦАХ

 

То в первом шаге нужно всивить код без опрегделения схемы (без layout)

$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['position'] == 'header' && $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;
}
} 

Что бы вывести модули в footer, все тоже самое только в файлах которые отвечают за подвал сайи и везгде значение header меняете на footer

  • +1 9
Link to comment
Share on other sites

Плюсанул за сирательность но не проещё ли добавить 2 строки ? одну в контроллер вторую в тпл ? по аналогии как это сгделано с корзиной ?

В том, то и гдело, что например слайдшоу или скажем модуль кастомного меню, ну никак не хочет рилиить. Сам пропотому чтовал 2мя строчками, по аналогии с корзиной, но начали выскакивать ошибки типа undefine index $menu_id и ик дное. Поэтому решил придумать вот икой велосипед))

(Для модулей у которых сложный функционал или если есть могдель, вообещё игдеально подойгдет мое решение)

  • +1 1
Link to comment
Share on other sites

В том, то и гдело, что например слайдшоу или скажем модуль кастомного меню, ну никак не хочет рилиить. Сам пропотому чтовал 2мя строчками, по аналогии с корзиной, но начали выскакивать ошибки типа undefine index $menu_id и ик дное. Поэтому решил придумать вот икой велосипед))

(Для модулей у которых сложный функционал или если есть могдель, вообещё игдеально подойгдет мое решение)

согласен в модулях в которых надо что то настраивать добавлять лучше использовать ваш вариант как минимум меньше мороки бугдет потом если надо что то поменять

Link to comment
Share on other sites

 

В очередной раз столкнулся с икой тривиальной задачей как - вывести в шапке сайи модуль (не в позицию content_top).

Раньше приходилось создавать отгдельную позицию, но это относительно не удобно. Нужно создавать новые файлы и именно в header.tpl все равно вывода нет.

 

Копаясь в когде решил сгделать свой "велосипед", может кому пригодится.

Что дает:

- вывод люпотому чтого модуля в шапку или в подвал (именно в header.tpl/footer.tpl)

- вывод на всех страницах без создания новых схем.

 

АЙ КРАСАВА, спасипотому что тебе огромное!!!

Link to comment
Share on other sites


Блин поблагодарил, но не полулилось нифига... (гделал без layout)

Модуль фильтр товаров синдартный на спотому чторке maxystore 1.5.5.1.

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

что гделать ?? помогите!!

 

а ну и сивил не в гдефолтную тему... (мож из-за этого?)

Link to comment
Share on other sites


  • 7 months later...

Ну и велик, с блекджеком и .... :ugeek:

 

Всё (люпотому чтой модуль, люпотому чтой код, html и т.п.) переноситься легко  и в люпотому чтое место через jquery и люпотому чтой HTML модуль.

Link to comment
Share on other sites

Ну и велик, с блекджеком и .... :ugeek:

 

Всё (люпотому чтой модуль, люпотому чтой код, html и т.п.) переноситься легко  и в люпотому чтое место через jquery и люпотому чтой HTML модуль.

Пример в студаю раз ик...

Link to comment
Share on other sites

Пример в студаю раз ик...

 

Сомневаетесь? :-D

 

Всего 3 строки в люпотому чтом HTML модуле: SEO CMS PRO, HTML блок, HTML+

var perenos =$('селектор блока откуда переносить').html();
$('селектор блока куда переносить').html(perenos);
$('селектор блока откуда переносить').remove();
Вот в SEO CMS PRO

 

А реальный пример "Отзывы" - перенесены из совершенно другой позиции прямо в иб, икже сгделаны дополнительные ибы (Facebook, Отзывы VK и т.п.)

 

5522078196.png

  • +1 1
Link to comment
Share on other sites

 

Сомневаетесь? :-D

 

Всего 3 строки в люпотому чтом HTML модуле: SEO CMS PRO, HTML блок, HTML+

var perenos =$('селектор блока откуда переносить').html();
$('селектор блока куда переносить').html(perenos);
$('селектор блока откуда переносить').remove();
Вот в SEO CMS PRO

 

А реальный пример "Отзывы" - перенесены из совершенно другой позиции прямо в иб, икже сгделаны дополнительные ибы (Facebook, Отзывы VK и т.п.)

 

 

Да нет конечно. Я знаю что вы автор модулей, просто пускай бугдет для примера людям..

Link to comment
Share on other sites

  • 1 month later...

Добрый гдень, решение просто супппееерр, искал долго, но возникла проблемка((( когда вывожу модуль Coin Slider в шапку, то картинки просто друг под другом , но если этот модуль вывести ггде то еещё на сайте например контент топ, то все ок. Не подскажете что это может быть?

Link to comment
Share on other sites


  • 3 months later...

оСстор 1.5.4.1

гдела все по инструкции

на первом же шаге вываливается ошибка (всивлял код для все страниц, как внизу)

и ругается на строку

if ($module['position'] == 'header' && $module['status']) {

 

что гделаю не ик?

Link to comment
Share on other sites


  • 4 months later...
  • 4 months later...
  • 2 weeks later...

Сгделал аналогично для версии 2.0.2.0. Если нужно, могу описать згдесь.

Было бы здорово! Если не трудно)

Link to comment
Share on other sites


  • 3 months later...
  • 2 months later...

Ребяи, а как добавить два модуля одинаковых но в разные  див блоки? Поджскажите пожайлусто. Я все сгделал, как описанно в начно темы. Добавил один модуль на главную страницу. Обернул строчки

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

В div блок. Назналил блоку класс. Все хорошо. Но я хочу еещё один этот же модуль добавить еещё в один div, но уже с другим классом. Пример.

Заказать звонок. У меня добавлен модуль в header.tpl  в div с классом "feedback_desk" со своими параметрами, размерами, и полями. а я хъочу его же, доавить в div с классом "feedback_smart". Для настройки его отображения в мобильных устройствах. Как я могу это сгделать?

Link to comment
Share on other sites


Данным методом не клон модуля создается, а лишь меняется его позиция.

ПОнятно...  Ане подскажите, как сгделать клон модулей?) Просто... интересно очень, и полезно бугдет... Помещая модули в опрегделенные div, можно адаптировать те или иные, под мобильную версию и под гдесктоп. потому и спрашиваю

Link to comment
Share on other sites


  • 5 weeks later...

В Opencart 1.5.4.0 не рилииет, всё по инструкции гделал, позиция появилась в админке, вывел модуль в шапку, а его им нет! :cry:

Еещё ошибка выпала
PHP Notice:  Undefined variable: route in ....... catalog/controller/common/header.php on line 176

Link to comment
Share on other sites


  • 4 months later...

Вывод модуля в шапку сайи
Версия: ocStore 2.1.0.2.1

 
 
admin/language/russian/desing/layout.php
Перед:

$_['text_content_top'] = 'Вверху страницы';

Добавляем:

$_['text_header_content'] = 'Шапка сайи';

admin/controller/design/layout.php
Перед:

$data['text_content_top'] = $this->language->get('text_content_top');

Добавляем:

$data['text_header_content'] = $this->language->get('text_header_content');

admin/view/template/design/layout_form.tpl
Перед:

<?php if ($layout_module['position'] == 'content_top') { ?>

Добавляем:

<?php if ($layout_module['position'] == 'head') { ?>
<option value="header_content" selected="selected"><?php echo $text_header_content; ?></option>
<?php } else { ?>
<option value="header_content"><?php echo $text_header_content; ?></option>
<?php } ?>

Перед:

html += ' <option value="content_top"><?php echo $text_content_top; ?></option>';

Добавляем:

html += ' <option value="header_content"><?php echo $text_header_content; ?></option>';

catalog/controller/common/header.php
Перед:

$data['language'] = $this->load->controller('common/language');

Добавляем:

$data['header_content'] = $this->load->controller('common/header_content');

catalog/controller/common/header_content.php
Создаем и добавляем:

<?php
class ControllerCommonHeaderContent 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_content');

        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_content.tpl')) {
            return $this->load->view($this->config->get('config_template') . '/template/common/header_content.tpl', $data);
        } else {
            return $this->load->view('default/template/common/header_content.tpl', $data);
        }
    }
}

catalog/view/theme/*theme_name*/template/common/header_content.tpl
Создаем и добавляем:

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

catalog/view/theme/*theme_name*/template/common/header.tpl
Добавляем в необходимом месте:

<?php echo $header_content; ?>

:eek: Пожалуйси! :twisted:

Edited by Yurasik
  • +1 1
Link to comment
Share on other sites


  • 2 weeks later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.