Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

[РЕШЕНО] Вывод модулей в 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
Надіслати
Поділитися на інших сайтах

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

Надіслати
Поділитися на інших сайтах

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

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

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

  • +1 1
Надіслати
Поділитися на інших сайтах

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

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

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

Надіслати
Поділитися на інших сайтах

 

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

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

 

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

Что дает:

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

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

 

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

Надіслати
Поділитися на інших сайтах


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

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

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

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

 

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

Надіслати
Поділитися на інших сайтах


  • 7 months later...

Доработка для ocStore 1.5.5.1

 

После сточки: 

$this->language->load('common/footer');

Добавить:

		if (isset($this->request->get['route'])) {
			$route = (string)$this->request->get['route'];
		} else {
			$route = 'common/home';
		}
Надіслати
Поділитися на інших сайтах

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

 

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

Надіслати
Поділитися на інших сайтах

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

 

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

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

Надіслати
Поділитися на інших сайтах

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

 

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

 

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

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

 

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

 

5522078196.png

  • +1 1
Надіслати
Поділитися на інших сайтах

 

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

 

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

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

 

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

 

 

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

Надіслати
Поділитися на інших сайтах

  • 1 month later...

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

Надіслати
Поділитися на інших сайтах


  • 3 months later...

оСстор 1.5.4.1

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

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

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

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

 

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

Надіслати
Поділитися на інших сайтах


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

У меня сработало вот так:
 

В контроллере:

$data['recently_viewed'] = $this->load->controller('module/recently_viewed', array(
       'limit' => 4,
       'width' => 80,
       'height' => 80
   ));
 

Во вьюхе:

<?php echo $recently_viewed; ?>

Надіслати
Поділитися на інших сайтах

  • 2 months later...

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

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

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

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

Надіслати
Поділитися на інших сайтах


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

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

Надіслати
Поділитися на інших сайтах


  • 5 weeks later...

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

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

Надіслати
Поділитися на інших сайтах


  • 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:

Змінено користувачем Yurasik
  • +1 1
Надіслати
Поділитися на інших сайтах


  • 2 weeks later...

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.