16

私は、多くのカスタマイズが必要な OpenCart プロジェクトに取り組んでいます。私のプロジェクトでは、カート ライブラリ (system/library/cart.php) で何かを変更する必要があります。

製品モデル (catalog/model/catalog/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 のコントローラの外部にモデルをロードすることさえ可能ですか?

4

4 に答える 4

21

コピーする必要があるメソッドが 1 つだけの場合は、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);
}
于 2012-11-22T13:03:44.480 に答える
7

コントロール外のモデルをロードできます。

モデルを別のモデル内にロードする必要がある場合は、 を使用してまったく同じ方法でロードできます$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ですconfirmsuccess

于 2012-11-22T16:22:42.767 に答える
0

OpenCartでは、モデルレイヤーの一部がライブラリに依存しています。一例として、現在の顧客(フロントエンド)または現在のユーザー(バックエンド)のIDが必要です。

構造を明確かつクリーンに保ち、コードの重複を減らすために、他の方向に依存関係を導入しないでください。モデルがクラスユーザーに依存していて、クラスユーザーがモデルに依存している場合は、悪循環を作成しました。

関数をライブラリレイヤーに移動し、モデルレイヤーの実装を削除することをお勧めします。影響を最小限に抑えるために、モデル内で関数呼び出しをラップできます。

ライブラリ/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();
}
于 2013-01-18T15:29:34.573 に答える