OpenCart Club

Разработка под Opencart

Добавляем новую позицию для вывода модулей opencart 3

Сначала добавить визуальную часть для вывода нашего нового места в админке на странице  Редактирование макета

Заходим в файл :admin\view\template\design\layout_form.twig

находим строчку:

[php]

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

[/php]

и перед ней добавляем код:

[php]

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

[/php]

После этого вы уже сможете добавлять модули в новое место для вывода. О заметил, что форма никак не называется. давайте добавим название нашему новому разделу.

Для этого в файл  — admin/language/ru-ru/design/layout.php

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

[php]

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

[/php]

[php]

$_['text_content_new']          = 'Новое место для вывода';

[/php]

Аналогично надо сделать и для других языков.

Так теперь займемся фронтом. Для начала создадим файл для вывода новой позиции для модулей:

Идем в папку — catalog\view\theme\default\template\common\ и создаем файл content_new.twig с содержимым:

[php]

{% for module in modules %}
{{ module }}
{% endfor %}

[/php]

Теперь создаем контроллер который будет отвечать за наполнение файла который мы создали перед этим.

Для этого идем в файл catalog\controller\common\ и создаем файл content_new.php с текстом :

[php]

<?php
class ControllerCommonContentNew 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('setting/module');

        $data['modules'] = array();

        $modules = $this->model_design_layout->getLayoutModules($layout_id, 'content_new');

        foreach ($modules as $module) {
            $part = explode('.', $module['code']);

            if (isset($part[0]) && $this->config->get('module_' . $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_setting_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/content_new', $data);
    }
}

[/php]

Осталось сказать странице что есть новая позиция для модулей.

Например мы хотим использовать нашу новую позицию на главной странице над позицией content_top.

Идем в файл — catalog/controller/common/home.php

находим строку

[php]

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

[/php]

и после нее вставляем

[php]

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

[/php]

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

Находим файл — catalog\view\theme\default\template\common\home.twig

в нем находим

[php]

{{ content_top }}

[/php]

и перед ней вставляем

[php]

{{ content_new }}

[/php]