/var/log/life.log
Блог программиста из солнечной Бурятии

Загрузка модели каталога из админского контроллера в opencart

На самом деле такое сделать без грязных хаков нельзя. Но можно пойти другим путём. Эта необходимость возникает, если нет желания дублировать и поддерживать код, который должен и с админской стороны и с фронтэнда отрабатывать. В opencart же загрузка моделей зависит от контекста, в котором происходит исполнение и $this->load->model('checkout/order'); в одном случае загрузит модель, в другом выдаст ошибку. Чтобы не дублировать код его нужно вынести в библиотеку, которая при необходимости будет проксировать запросы к ядерным моделям, в зависимости от контекста.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
class MyLib {
    protected $registry;

    public function __construct($registry) {
        $this->registry = $registry;
    }

    public function __get($key) {
        return $this->registry->get($key);
    }

    public function __set($key, $value) {
        $this->registry->set($key, $value);
    }

    private function getType() {
        return basename(DIR_APPLICATION);
    }

    //пример проксирования
    private function getOrder($order_id){
        if($this->getType() == 'admin') {
            $this->load->model('sale/order');
            return $this->model_sale_order->getOrder($order_id);
        } else {
            $this->load->model('checkout/order');
            return $this->model_checkout_order->getOrder($order_id);
        }
    }

Минус такого метода - обе модели всё же придётся делать. Но только для загрузки и вызова методов библиотеки.

1
2
3
<?php
$this->load->library('mylib');
$mylib = new MyLib($this->registry);