Перейти к содержанию

Рекомендуемые сообщения

В очередной раз столкнулся с такой тривиальной задачей как - вывести в шапке сайта модуль (не в позицию 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Плюсанул за старательность но не проще ли добавить 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.

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доработка для 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 и т.п.)

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

оСстор 1.5.4.1

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

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Во вьюхе:

<?php echo $recently_viewed; ?>

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще, возможно ли это?

Изменено пользователем muqpuctoqpejib

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.