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

мои мысли как не переписывать свой модуль для версии 2.0-2.2 под версию 2.3


Recommended Posts

суть проблемы: в версии 2.3 автор Opencart решил перенести папки /module в /extension. в связи с чем разработчикам модулей приходится под версию 2.3 не только создавать новый архив с новыми путями, но и переписывать код, который эти пути учитывает

но ведь хочется поддерживать 1 модуль, а не два, потому я решил подумать как можно сохранить один архив, но заставить модуль работать на всей ветке 2.x

покажу на примере своего модуля seogen, чье название будет встреться по тексту

 
в архив, либо отдельно нужно будет добавить два файла

admin\controller\extension\module\seogen\install.php
admin\controller\extension\module\seogen\uninstall.php 

первый с таким содержимым

<?php
class ControllerExtensionModuleSeogenInstall extends Controller {
    public function index() {
        $this->install();
    }
    private function install() {
        $this->load->model('extension/event');
        $this->model_extension_event->addEvent('seogen', 'admin/model/user/user_group/editUserGroup/after', 'module/seogen/eventSetPermissions_23');
        $this->session->data['success'] = $this->language->get('text_install_success');
    }
}

второй с таким

<?php

class ControllerExtensionModuleSeogenUninstall extends Controller {
    public function index() {
        $this->uninstall();
    }
    private function uninstall() {
        $this->load->model('extension/event');
        $this->model_extension_event->deleteEvent('seogen');
    }

}

в код вашего родного контроллера такой метод

    public function eventSetPermissions_23($route, $arr){
        if($this->validate()) {
            $this->load->model('user/user_group');
            $this->model_user_user_group->addPermission($this->user->getGroupId(), 'access', 'extension/module/seogen');
            $this->model_user_user_group->addPermission($this->user->getGroupId(), 'modify', 'extension/module/seogen');
        }
    }

 

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

Я проще сделал

Такой же файл в

\admin\controller\extension\module\

В нем


 

<?php
/* All rights reserved belong to the module, the module developers http://opencartadmin.com */
// http://opencartadmin.com © 2011-2017 All Rights Reserved
// Distribution, without the author's consent is prohibited
// Commercial license
if (!class_exists('ControllerExtensionModuleBlog')) {
    class ControllerExtensionModuleBlog extends Controller {
        private $error = array();
        public function index() {
                $this->control('module/blog');
                $this->controller_module_blog->index($this->registry);
        }
        public function uninstall() {
            if ($this->validate()) {
                $this->control('module/blog');
                $this->controller_module_blog->uninstall($this->registry);
            }
        }
        public function install() {
            if ($this->validate()) {
                $this->control('module/blog');
                $this->controller_module_blog->install($this->registry);
            }
        }
        protected function validate() {
            if (!$this->user->hasPermission('modify', 'extension/module/blog')) {
                $this->error['warning'] = $this->language->get('error_permission');
            }
            return !$this->error;
        }
        public function control($cont) {
            $file = DIR_APPLICATION . 'controller/' . $cont . '.php';
            $class = 'Controller' . preg_replace('/[^a-zA-Z0-9]/', '', $cont);
            if (file_exists($file)) {
                include_once($file);
                $this->registry->set('controller_' . str_replace('/', '_', $cont), new $class($this->registry));
            } else {
                trigger_error('Error: Could not load controller ' . $cont . '!');
                exit();
            }
        }
     }
}

И все

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

Идея использовать один контроллер для разных версий хорошая.

 

2.1:

$this->response->redirect($this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL'));

2.3:

 

$this->response->redirect($this->url->link('extension/extension', 'token=' . $this->session->data['token'], 'SSL'));

 

нужно не забыть про эти строчки.

иначе получим сообщение "у вас нет прав..."  в случае нажатия на кнопку "сохранить" во 2.3 версии.

 

Ну и в хлебных крошках должны быть разные ссылки еще.  Иначе тоже самое сообщение "у вас нет прав..."  если кликнуть на хб. крошки "модули".

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

sitecreator, да, все ссылки разумеется нужно переделать как на примере

            if (version_compare(VERSION, "2.3", ">=")) {
                $this->response->redirect($this->url->link('extension/extension', 'token=' . $this->session->data['token'] . '&type=module', true));
            } else {
                $this->response->redirect($this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL'));
            }

 

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

25 минут назад, freelancer сказал:

sitecreator, да, все ссылки разумеется нужно переделать как на примере

 

я у себя, правда, не стал полагаться на константу

VERSION

 

Посчитал, что это не 100% надежно.

Я решил просто проверить если существуют права у пользователя к

extension/extension

то это 2.3+

если нет таких прав, то это, соответственно, версия ниже.  Поскольку в более ранних версиях не существовало extension/extension прав.

Но с другой стороны, у пользователя могут быть права только к модулю, а к extension/extension  может и не быть прав на 2.3 версии.  Ну тогда ему и нужды нет возвращаться в список модулей.

Он в любом случае получит "доступ запрещен" на 2.3, хоть к extension/extension обратится, хоть к extension/module. Потому и решил, что способ вроде как универсальный.

 

Ну и про кнопочки нужно тоже не забыть (кнопочка возврата и др. если есть)

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

  • 3 years later...
В 20.07.2017 в 13:38, markimax сказал:

Я проще сделал

Такой же файл в

\admin\controller\extension\module\

В нем


 


<?php
/* All rights reserved belong to the module, the module developers http://opencartadmin.com */
// http://opencartadmin.com © 2011-2017 All Rights Reserved
// Distribution, without the author's consent is prohibited
// Commercial license
if (!class_exists('ControllerExtensionModuleBlog')) {
    class ControllerExtensionModuleBlog extends Controller {
        private $error = array();
        public function index() {
                $this->control('module/blog');
                $this->controller_module_blog->index($this->registry);
        }
        public function uninstall() {
            if ($this->validate()) {
                $this->control('module/blog');
                $this->controller_module_blog->uninstall($this->registry);
            }
        }
        public function install() {
            if ($this->validate()) {
                $this->control('module/blog');
                $this->controller_module_blog->install($this->registry);
            }
        }
        protected function validate() {
            if (!$this->user->hasPermission('modify', 'extension/module/blog')) {
                $this->error['warning'] = $this->language->get('error_permission');
            }
            return !$this->error;
        }
        public function control($cont) {
            $file = DIR_APPLICATION . 'controller/' . $cont . '.php';
            $class = 'Controller' . preg_replace('/[^a-zA-Z0-9]/', '', $cont);
            if (file_exists($file)) {
                include_once($file);
                $this->registry->set('controller_' . str_replace('/', '_', $cont), new $class($this->registry));
            } else {
                trigger_error('Error: Could not load controller ' . $cont . '!');
                exit();
            }
        }
     }
}

И все

 

Как Вы смотрите на такую реализацию?

<?php
class ControllerModuleNoticeupSeo extends Controller
{
    function __call($name, $arguments)
    {
        $this->control('extension/module/noticeup_seo');
        if (method_exists(ControllerExtensionModuleNoticeupSeo::class, $name)) {
            $this->controller_extension_module_noticeup_seo->{$name}($this->registry);
        }
    }

    public function control($cont) {
        $file = DIR_APPLICATION . 'controller/' . $cont . '.php';
        $class = 'Controller' . preg_replace('/[^a-zA-Z0-9]/', '', $cont);

        if (file_exists($file)) {
            include_once($file);

            $this->registry->set('controller_' . str_replace('/', '_', $cont), new $class($this->registry));
        } else {
            trigger_error('Error: Could not load controller ' . $cont . '!');
            exit();
        }
    }
}

 

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

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

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

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

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

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

Вхід

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

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

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

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

Important Information

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