この機能は、Opencart が構築された目的の範囲をはるかに超えていますが、PHP/CodeIgniter にある程度精通している場合は、ほとんど/すべての mod を実行できるはずです。SQL についても知っておくとよいでしょうが、まだ知らない場合はすぐに習得できます。
あなたの改造は、それぞれ独自の難易度の 2 つの部分で構成されていると思います。
OpenCart を使用して e コマース サイトをセットアップしており、サブスクリプションを提供したいと考えています。具体的には、3/6/12 か月のサブスクリプションです。定期請求には興味がありません (PayPal と Authorize.net 用のモジュールがあることは知っています)。ユーザーに一度前払いしてもらいたい。構成の観点から、これは 3 つの疑似製品に変換されますか? これは、製品の構成だけで、これまでのところ実現可能であると思います。3 つの商品、それぞれ 1 つの価格。
ここがトリッキーな部分です。ユーザーが支払った月ごとに、「請求サイクル」内で月に 1 回だけ製品を注文できます。したがって、ユーザーが 23/5 に 3 か月のサブスクリプションの料金を支払った場合:
he can get one product in the period 23/5-22/6,
one in 23/6-22/7, and
one in 23/7-22/8
これを行うには、サブスクリプションの長さごとに製品を追加し、各製品に適切なアカウント クレジットを発行し、このクレジットをサブスクリプションの長さで 1 か月あたり 1 つの製品を購入するのに最適な金額にすることだと思います。
これを行うには、ファイル catalog>model>checkout>order.php (または選択した任意のモデル) のデータベースの customer_transaction フィールドに資金を追加する関数を追加し、それを呼び出して、catalog>controller>checkout にデータを追加することをお勧めします。 >success.php.
顧客が適切なサブスクリプション製品を購入したことを確認し、その購入に対するクレジットがまだないことを確認するのが賢明だと思います.
1 か月に 1 つの製品しか取得しないようにするには、catalog>controller>checkout>checkout.php の先頭にスクリプトを記述して、頻繁に製品を取得しようとした場合にエラー メッセージにリダイレクトする必要があります。
ユーザーは、サブスクリプションを更新しない限り、1 か月に複数の製品を注文することはできません。さらに、cron ジョブを実行して、ユーザーが今月のサブスクリプションを利用したかどうかを確認し、「今月の製品を入手してください」のようなリマインダー メールを送信できたら最高です。
これをどこから始めればよいかさえわかりませんが、支払う意思がある場合は、投稿して助けを求めることができ、おそらくこの機能を手頃な価格で追加できます.
これは私の最初の OpenCart プロジェクトです。ドキュメンテーションに目を通し、Google で検索しました。ローカル インストールで遊んでみました。また、コア コードを変更せずに求めていることが実現可能かどうかを判断しようとしています。それを避けてください。ただし、他に方法がない場合、OpenCart が MVC(+L(anguage)) フレームワークであることは理解していますが、その機能をカスタマイズする方法に関する確かなドキュメントは見つかりませんでした。特定の要件のビットアンピースのみです。
繰り返しますが、これは Opencart の目的から大きく外れており、いくつかの変更が必要です。Opencart スクリプトの動作方法とカスタマイズ方法に関するドキュメントについては、いずれも見つかりませんでした。過去 2 か月間、私が得たものを学ぶのはかなり苦労しましたが、質問が短いものであれば、通常、途中で必要なときに人々に助けてもらうことができます。
よろしければ、私が考えていることを書き留めたいと思います。これでよろしいかどうかアドバイスください。
I would like to add one more entity (object/model) for storing the subscription, the user to which it belongs, start and end date and
利用されているかどうか。基本的に、サブスクリプションは通常の順序であり、そのように保存したいと思います。さらにいくつかのフィールドを永続化する必要があるだけです。
これらを属性として追加します。これは、Web サイト カタログ > 属性、カタログ > 属性グループ、および属性タブのカタログ > 製品のバック エンドの管理で行うことができます。
前述のとおり、次の 2 つのチェックを実行する必要があります。ユーザーは今月のサブスクリプションを利用しましたか? このため、ユーザーが請求日に達するたびに、cron ジョブでリセットできるフラグ「isUsed」フィールドを用意することを考えていました。(この例では 23/6、23/7)。または、請求サイクルごとに 1 つずつ、3 つのエントリを追加し、それに応じて更新することもできます。サブスクリプションの有効期限が切れていますか? サブスクリプションの有効期限を確認できました。
このcronジョブの実行方法はわかりませんが、データベースで属性名と値を検索して、値が範囲内にある場合はcronジョブを適用できます。
これがあなたの期待に役立つことを願っています!
アップデート
データベースにデータを挿入するには、admin/model/sale/customer.php の addTransaction () 関数のようなものを複製できます。
public function addTransaction($customer_id, $description = '', $amount = '', $order_id = 0) {
$customer_info = $this->getCustomer($customer_id);
if ($customer_info) {
$this->db->query("INSERT INTO " . DB_PREFIX . "customer_transaction
SET customer_id = '" . (int)$customer_id . "',
order_id = '" . (int)$order_id . "',
description = '" . $this->db->escape($description) . "',
amount = '" . (float)$amount . "',
date_added = NOW()");
}
これは admin/controller/sale/customer.php にあります
$this->load->model('sale/customer');
if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->user->hasPermission('modify', 'sale/customer')) {
$this->model_sale_customer->addTransaction($this->request->get['customer_id'],
$this->request->post['description'], $this->request->post['amount']);
$this->data['success'] = $this->language->get('text_success');
} else {
$this->data['success'] = '';
}