Я работаю над проектом 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(); }