Jump to content

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 8

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

  • +1 1

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

 

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

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

 

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

Что дает:

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

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

 

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

Share this post


Link to post
Share on other sites

Хотя не , все вывелось, но тока на странице категорий и товаров, но не всех (как  было задумано...)

очень надо на всех!!!

Share this post


Link to post
Share on other sites

Доработка для 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';
		}

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

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

Share this post


Link to post
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

Share this post


Link to post
Share on other sites

 

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

 

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

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

 

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

 

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

оСстор 1.5.4.1

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

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

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

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

Опишите, пожалуйста. Буду премного благодарен :-)

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

Во вьюхе:

<?php echo $recently_viewed; ?>

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Вывод модуля в шапку сайта
Версия: 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

Share this post


Link to post
Share on other sites

Вроде всё понятно... И в тоже время не очень... Скажите, есть ли видео урок? Скиньте ссылочку, пожалуйста...

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×

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.