Modelo de carga OpenCart fuera del controlador

Estoy trabajando en un proyecto de OpenCart, que requiere mucha personalización. para mi proyecto, tengo que cambiar algo en la biblioteca del carrito (system / library / cart.php).

Tendría que llamar a una función personalizada que está definida dentro del modelo del producto (catálogo / modelo / catálogo / producto.php).

En un controlador, cargar un Modelo y usar sus funciones es fácil:

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

Pero, ¿cómo se carga un modelo fuera de un controlador? No puede crear una nueva instancia del modelo, ya lo intenté:

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

Obviamente, esto no funciona porque los modelos no estaban destinados a ser utilizados de esa manera.

También traté de usar el operador de resolución de scope (ModelCatalogProduct :: customFunction ()) Tampoco funciona.

Podría pasar toda la información requerida como argumentos, pero preferiría usar el modelo dentro de la clase de biblioteca de carrito, porque los cambios serían globales.

¿Es posible cargar un modelo fuera de un controlador en OpenCart?

Si es solo un método que necesita copiar, sería mejor agregar un método a la clase Cart . La clase Cart trabajará con las llamadas $this->db->query() ya que tiene $db asignado, aunque no es un Controlador / Modelo

Editar

Si desea hacer esto, podría hacer algo similar a lo siguiente

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

Puede cargar un modelo fuera de un control.

Si necesita cargar un modelo dentro de otro modelo, puede cargarlo de la misma manera usando $this->load->model('my_module/my_model'); .

Si necesita cargar un modelo dentro del archivo de plantilla u otro script PHP personalizado, mire el archivo index.php donde se instancia el Registry Debería instanciarlo de la misma manera. Entonces, su código personalizado podría verse así:

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

De todos modos, recomiendo no editar / cambiar los archivos de la biblioteca principal a menos que esté seguro de que no hay otra manera de implementar / hacer lo que necesita.

Como Jay Gilford me propuso, implementaría esa función o llamaría al catalog/checkout/cart.php , lo que podría confirm o tener success según el scope y la funcionalidad que catalog/checkout/cart.php implementar.

En OpenCart, las partes de la capa del modelo dependen de las bibliotecas. Un ejemplo es que se necesita la ID del cliente actual (frontend) o el usuario actual (backend).

Para mantener la estructura clara y limpia y reducir la duplicación de código, no debe introducir una dependencia en la otra dirección. Si un modelo depende del usuario de la clase y el usuario de la clase depende del modelo, usted creó un círculo vicioso.

Recomendaría mover las funciones a la capa de la biblioteca y eliminar sus implementaciones en la capa del modelo. Para minimizar el impacto, puede ajustar la llamada de función dentro del modelo.

biblioteca / myClass

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

admin / model / catalog / myModel

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