DARTHARTH

Добавление кастомной позиции в макет OpenCart 2.3

Из коробки в OpenCart 2.3 имеется малое количество позиций куда можно вставить свои модули или код. Благодаря статье с сайта logi.cc, можно добавить свою позицию в макете.

Для примера добавим кастомную шапку

Админ часть

В файле 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

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

<table id="module-content-top" class="table table-striped table-bordered table-hover">

Вставляем

<table id="module-header_content" class="table table-striped table-bordered table-hover">
	<thead>
		<tr>
			<td class="text-center"><?php echo $text_header_content; ?></td>
		</tr>
	</thead>
	<tbody>
		<?php foreach ($layout_modules as $layout_module) { ?>
			<?php if ($layout_module['position'] == 'header_content') { ?>
				<tr id="module-row<?php echo $module_row; ?>">
					<td class="text-left"><div class="input-group">
						<select name="layout_module[<?php echo $module_row; ?>][code]" class="form-control input-sm">
							<?php foreach ($extensions as $extension) { ?>
								<optgroup label="<?php echo $extension['name']; ?>">
									<?php if (!$extension['module']) { ?>
										<?php if ($extension['code'] == $layout_module['code']) { ?>
											<option value="<?php echo $extension['code']; ?>" selected="selected"><?php echo $extension['name']; ?></option>
											<?php } else { ?>
											<option value="<?php echo $extension['code']; ?>"><?php echo $extension['name']; ?></option>
										<?php } ?>
										<?php } else { ?>
										<?php foreach ($extension['module'] as $module) { ?>
											<?php if ($module['code'] == $layout_module['code']) { ?>
												<option value="<?php echo $module['code']; ?>" selected="selected"><?php echo $module['name']; ?></option>
												<?php } else { ?>
												<option value="<?php echo $module['code']; ?>"><?php echo $module['name']; ?></option>
											<?php } ?>
										<?php } ?>
									<?php } ?>
								</optgroup>
							<?php } ?>
						</select>
						<input type="hidden" name="layout_module[<?php echo $module_row; ?>][position]" value="<?php echo $layout_module['position']; ?>" />
						<input type="hidden" name="layout_module[<?php echo $module_row; ?>][sort_order]" value="<?php echo $layout_module['sort_order']; ?>" />
						<div class="input-group-btn"> <a href="<?php echo $layout_module['edit']; ?>" type="button" data-toggle="tooltip" title="<?php echo $button_edit; ?>" target="_blank" class="btn btn-primary btn-sm"><i class="fa fa-pencil"></i></a>
							<button type="button" onclick="$('#module-row<?php echo $module_row; ?>').remove();" data-toggle="tooltip" title="<?php echo $button_remove; ?>" class="btn btn-danger btn-sm"><i class="fa fa fa-minus-circle"></i></button>
						</div>
					</div></td>
				</tr>
				<?php $module_row++; ?>
			<?php } ?>
		<?php } ?>
	</tbody>
	<tfoot>
		<tr>
			<td class="text-left">
				<div class="input-group">
					<select class="form-control input-sm">
						<?php foreach ($extensions as $extension) { ?>
							<optgroup label="<?php echo $extension['name']; ?>">
								<?php if (!$extension['module']) { ?>
									<option value="<?php echo $extension['code']; ?>"><?php echo $extension['name']; ?></option>
									<?php } else { ?>
									<?php foreach ($extension['module'] as $module) { ?>
										<option value="<?php echo $module['code']; ?>"><?php echo $module['name']; ?></option>
									<?php } ?>
								<?php } ?>
							</optgroup>
						<?php } ?>
					</select>
					<div class="input-group-btn">
						<button type="button" onclick="addModule('header_content');" data-toggle="tooltip" title="<?php echo $button_module_add; ?>" class="btn btn-primary btn-sm"><i class="fa fa-plus-circle"></i></button>
					</div>
				</div>
			</td>
		</tr>
	</tfoot>
</table>						

и ниже, в скрипте, в двух строках, после #module-content-top, вставляем

	
#module-header_content,

Таким образом у нас в админке, в дизайне уже можно будет увидеть нашу новую позицию.

Фронтенд

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

В 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/manufacturer/info' && isset($this->request->get['manufacturer_id'])) {
            $this->load->model('catalog/manufacturer');
            $layout_id = $this->model_catalog_manufacturer->getManufacturerLayoutId($this->request->get['manufacturer_id']);
        }
        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 ($route == 'blog/category' && isset($this->request->get['blog_category_id'])) {
            $this->load->model('blog/category');           
            $layout_id = $this->model_blog_category->getCategoryLayoutId($this->request->get['blog_category_id']);
        }       
        if ($route == 'blog/article' && isset($this->request->get['article_id'])) {
            $this->load->model('blog/article');           
            $layout_id = $this->model_blog_article->getArticleLayoutId($this->request->get['article_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')) {
                $module_data = $this->load->controller('extension/module/' . $part[0]);
                if ($module_data) {
                    $data['modules'][] = $module_data;
                }
            }
            if (isset($part[1])) {
                $setting_info = $this->model_extension_module->getModule($part[1]);
                if ($setting_info && $setting_info['status']) {
                    $output = $this->load->controller('extension/module/' . $part[0], $setting_info);
                    if ($output) {
                        $data['modules'][] = $output;
                    }
                }
            }
        }
        return $this->load->view('common/header_content', $data);
    }
}?>

Создаем файл catalog/view/theme/*имя-вашей-темы*/template/common/header_content.tpl с содержимым

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

Открываем файл catalog/view/theme/*имя-вашей-темы*/template/common/header.tpl и в месте где нужно выводить позицию вставляем

<?php echo $header_content; ?>

Это примерный вариант, лично я с помощьб кастомной позиции сделал вывод слайдера ниже шапки, до начала основного контента. Для этого в целом нужно было только поменять расположение во фронте, а именно вместо header вносить код контроллеров и тпл в home.

Поделиться страницей в

1 мнение к “Добавление кастомной позиции в макет OpenCart 2.3

  1. Вы только что переопределили макет продукта по умолчанию продукта «iMac» с помощью нашего макета «CustomLayout»! Это означает, что всякий раз, когда кто-то посещает страницу сведений о продукте «iMac» в front­-end, для этой страницы будет активирован «CustomLayout». И, как мы обсуждали в предыдущем разделе, он отобразит модуль «Banner» в позиции «Column Right». Давайте проверим! Я считаю, что вы должны иметь базовое представление о том, как работают макеты в OpenCart. Макеты действительно полезны для переопределения макетов по умолчанию и назначения модулей на разные позиции в OpenCart.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Scroll Up