Загрузка модели каталога из админского контроллера в opencart
На самом деле такое сделать без грязных хаков нельзя. Но можно пойти другим путём. Эта необходимость возникает, если нет желания дублировать и поддерживать код, который должен и с админской стороны и с фронтэнда отрабатывать. В opencart же загрузка моделей зависит от контекста, в котором происходит исполнение и $this->load->model(‘checkout/order’); в одном случае загрузит модель, в другом выдаст ошибку. Чтобы не дублировать код его нужно вынести в библиотеку, которая при необходимости будет проксировать запросы к ядерным моделям, в зависимости от контекста.
<?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);
}
}
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);
}
}
Минус такого метода — обе модели всё же придётся делать. Но только для загрузки и вызова методов библиотеки.
<?php
$this->load->library('mylib');
$mylib = new MyLib($this->registry);
$this->load->library('mylib');
$mylib = new MyLib($this->registry);