OpenCart Modèle de charge à l'extérieur de Contrôleur
Je suis en train de travailler sur un OpenCart projet, qui nécessite beaucoup de personnalisation.
pour mon projet, je dois changer quelque chose dans le panier de la bibliothèque (system/library/cart.php).
Que je devrais l'appeler une fonction personnalisée qui est définie à l'intérieur du modèle de produit (catalog/model/catalog/product.php).
Dans un contrôleur, le chargement d'un Modèle et d'utiliser ses fonctions, c'est facile:
$this->load->model("catalog/product");
$this->model_catalog_product->customFunction();
Mais comment faites-vous pour charger un modèle à l'extérieur d'un contrôleur?
Vous ne pouvez pas créer une nouvelle instance du modèle, j'ai déjà essayé ça:
require_once("catalog/model/catalog/product.php");
$a_model = new ModelCatalogProduct();
De toute évidence, cela ne fonctionne pas parce que les modèles n'étaient pas destinés à être utilisés dans une telle voie.
J'ai aussi essayé d'utiliser l'opérateur de résolution de portée ( ModelCatalogProduct::customFunction())
Il ne fonctionne pas non plus.
J'ai pu passer toutes les informations nécessaires comme arguments, mais je préfère utiliser le modèle à l'intérieur de la charrette de la bibliothèque de la classe, de provoquer des changements serait mondial.
Est-il même possible de charger un modèle à l'extérieur d'un contrôleur dans OpenCart?
J'ai rejoint le projet quand il était d'environ 70%. Le calcul du prix est entièrement personnalisé et il est mis en œuvre que pour le front-end (Le site utilise AJAX pour obtenir les informations sur combien ça va coûter). Le problème, c'est que ces changements n'étaient pas mises en œuvre dans le backend. De sorte que le prix est calculée ok, mais lorsque l'utilisateur ajoute un produit au panier, il utilise la valeur par défaut openCart calcul du prix. J'ai du modifier le getProducts() la fonction de sorte que le prix sera ok.
La coutume de prix est calculé dans le modèle de produit. Alors maintenant, j'ai le choix de passer par tous les fichiers et de trouver où je dois changer le code, ou je ajouter environ 10 lignes pour le Panier de la bibliothèque et que ce serait fait. C'est pourquoi je vous demande.
OriginalL'auteur itd | 2012-11-22
Vous devez vous connecter pour publier un commentaire.
Si c'est la seule méthode que vous avez besoin de copier, vous serait mieux d'ajouter une méthode à la
Cart
classe elle-même. LeCart
classe travaillera avec le$this->db->query()
appels comme il l'a déjà$db
affecté à elle même si elle n'est pas un Contrôleur/ModèleModifier
Si vous désirez le faire, vous pourriez faire quelque chose de similaire à la suivante
J'ai mis une méthode que vous pouvez utiliser au-dessus. C'est un peu hackish, mais nous faisons tout ce dont vous avez besoin. Utilisez simplement
$model
au lieu de$this->model_catalog_product
J'ai essayé cela, mais ne fonctionne pas pour moi.
OriginalL'auteur Jay Gilford
Vous êtes en mesure de charger un modèle à l'extérieur d'un contrôlés.
Si Vous avez besoin de charger un modèle à l'intérieur d'un autre modèle, Vous pouvez le charger de la même façon à l'aide de
$this->load->model('my_module/my_model');
.Si Vous avez besoin de charger un modèle à l'intérieur du fichier de modèle ou d'autres personnalisé script PHP, regardez la
index.php
fichier où laRegistry
est instanciée - Vous besoin d'instancier la même manière. Si Votre code personnalisé pourrait ressembler à:De toute façon je recommande fortement de ne pas modifier/modifier les fichiers de bibliothèque de base, sauf si Vous êtes sûr qu'il n'y est pas d'autre façon de mettre en œuvre/faire ce que Vous avez besoin.
Comme Jay Gilford proposé je voudrais mettre en œuvre que la fonction ou l'appel à la
catalog/checkout/cart.php
, potentiellementconfirm
ousuccess
en fonction de la portée et de la fonctionnalité que Vous souhaitez mettre en œuvre.Cela a aidé, merci! Opencart 2.3.0.2
OriginalL'auteur shadyyx
Dans OpenCart parties de la couche du modèle dépendent les bibliothèques. Un exemple est que l'ID de la clientèle actuelle (frontend) ou de l'utilisateur courant (backend) est nécessaire.
De maintenir une structure claire et propre et de réduire la duplication de code, vous ne devez pas présenter une dépendance dans l'autre sens. Si un modèle dépend de la classe de l'utilisateur et la classe de l'utilisateur dépend du modèle que vous avez créé un cercle vicieux.
Je vous recommande de déplacer les fonctions dans la bibliothèque de la couche et de retirer leurs implémentations dans la couche du modèle. Afin de minimiser l'impact, vous pouvez placer l'appel de fonction dans le modèle.
bibliothèque/maclasse
admin/modèle/catalogue/monmodèle
OriginalL'auteur ckonig