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

Я работаю над проектом OpenCart, который требует большой настройки. для моего проекта я должен что-то изменить в библиотеке корзины (system / library / cart.php).

Мне нужно было бы вызвать пользовательскую функцию, определенную внутри модели продукта (каталог / модель / каталог / product.php).

В контроллере загрузка модели и ее использование легко:

$this->load->model("catalog/product"); $this->model_catalog_product->customFunction(); 

Но как вы загружаете модель вне контроллера? Вы не можете создать новый экземпляр модели, я уже пробовал:

  require_once("catalog/model/catalog/product.php"); $a_model = new ModelCatalogProduct(); 

Это, очевидно, не работает, потому что модели не предназначены для использования таким образом.

Я также попытался использовать оператор разрешения области (ModelCatalogProduct :: customFunction ()). Он также не работает.

Я мог бы передать всю необходимую информацию в качестве аргументов, но я предпочел бы использовать модель внутри класса библиотеки корзины, потому что изменения были бы глобальными.

Можно ли даже загрузить модель вне контроллера в OpenCart?

Если это всего лишь один метод, который вам нужно скопировать, вам лучше всего добавить метод к самому классу Cart . Класс Cart будет работать с $this->db->query() поскольку он уже назначил ему $db хотя он не является контроллером / моделью

редактировать

Если вы хотите сделать это, вы можете сделать что-то похожее на следующее

 public function test() { global $loader, $registry; $loader->model('catalog/product'); $model = $registry->get('model_catalog_product'); $result = $model->getProduct(123); } 

Вы можете загрузить модель за пределы контролируемой.

Если вам нужно загрузить модель внутри другой модели, вы можете загрузить ее таким же образом, используя $this->load->model('my_module/my_model'); ,

Если вам нужно загрузить модель внутри файла шаблона или другого настраиваемого PHP-скрипта, посмотрите файл index.php котором установлен инсталлятор Registry Вам нужно будет установить его таким же образом. Таким образом, ваш пользовательский код может выглядеть так:

 $registry = new Registry(); $my_model = $registry->load->model('my_module/my_model'); $my_model->customFunction(); 

В любом случае я настоятельно рекомендую не изменять / изменять файлы основной библиотеки, если вы не уверены, что нет другого способа реализовать / сделать то, что вам нужно.

Как предложил Джей Гилфорд, я бы catalog/checkout/cart.php этой функцией или позвонил в catalog/checkout/cart.php , потенциально confirm или catalog/checkout/cart.php success зависимости от области и функциональности, которую вы хотели бы реализовать.

В OpenCart части слоя модели зависят от библиотек. Одним из примеров является то, что необходим идентификатор текущего клиента (frontend) или текущего пользователя (backend).

Чтобы структура была чистой и чистой, и чтобы уменьшить дублирование кода, вы не должны вводить зависимость в другом направлении. Если модель зависит от пользователя класса, а пользователь класса зависит от модели, вы создали порочный круг.

Я бы рекомендовал переместить функции в слой библиотеки и удалить их реализации на уровне модели. Чтобы свести к минимуму воздействие, вы можете обернуть вызов функции внутри модели.

библиотека / MyClass

 function getValue($id){ $sql = "select ..."; $query = $this->db->query($sql); return $query->rows; } 

администратор / модель / каталог / MyModel

 function getValue($id){ return $this->myClass->getValue(); }