そのため、タスクはチェックボックス「ニュースを受信する」をチェックアウト手順の1つに追加することです(チェックアウト-「レジを通過する」)。
すぐに、新しいモジュールを作成する必要があることが明らかになりました。 ここでは、設計ファイルの変更だけでは十分ではありません。 チェックアウトステップにフィールドを追加する方法は、 Desitex Checkoutnewsletterモジュール(請求先住所を指定する必要がある2番目のステップに「ニュースレターの購読」チェックボックスを追加する)およびBiebersdorf CustomerOrderComment (最後にコメントを追加するフィールドを追加する)ステップ-注文確認ページ)。
示されたモジュールを掘り下げて解決策を見つけるプロセスを省略します:)最後に、すべてが機能するためには、次のものが必要です。
- 目的のチェックアウトページを描画するデザインファイルを変更します-チェックマークを追加します。
- イベント「チェックアウトページの保存」イベントに何らかの方法でサブスクライブするには、
- 現在のセッションのチェックマーク状態を記憶する
- サイトが支払いのためにサイト(PayPal、AlliedWalletなど)にリダイレクトする前に、ユーザーがすでに注文したときに発生する「チェックアウト」イベントを処理します。 ここで、セッションから保存された値を抽出し、必要に応じてユーザーをニュースレターにサインアップする必要があります。
モジュール作成
まず、モジュールを作成します。 それを
Mage
名前空間に入れ、
NewsletterSubscribe
と呼びましょう。
まず、Magentoにモジュールがあることを伝える必要があります
Mage_NewsletterSubscribe.xml
app/etc/modules
フォルダーに
Mage_NewsletterSubscribe.xml
ファイルを作成します。
<?xml version = "1.0"?> <構成> <モジュール> <Mage_NewsletterSubscribe> <active> true </ active> <codePool>ローカル</ codePool> </ Mage_NewsletterSubscribe> </モジュール> </ config>
XMLによると、モジュールはアクティブであり、ローカルプールにあります。
次に、新しいモジュールが配置されるフォルダーを作成します
app/code/local/Mage/NewsletterSubscribe
、および
app/code/local/Mage/NewsletterSubscribe/etc
フォルダー内の
config.xml
構成ファイル:
<?xml version = "1.0"?> <構成> <グローバル> <ヘルパー> <ニュースレター購読> <class> Mage_NewsletterSubscribe_Helper </ class> </ newslettersubscribe> </ helpers> </ global> </ config>
ヘルパーがないと、モジュールは正常に機能しませんが、代わりにクラッシュします。 したがって、Magentoにはヘルパーは空ですが、
Helper
フォルダー内の
Data.php
ファイルを提供します。
<?php class Mage_NewsletterSubscribe_Helper_Data extends Mage_Core_Helper_Abstract { }
チェックアウトページの変更
目的のチェックアウトページを描画するファイルは、
app\design\frontend\default\sunnyD\template\checkout\onepage\payment\methods.phtml
。 チェックマークを追加します。
... <?php / * bofニュースレターチェックボックスの購読* /?> <dt>メーリングリストに参加</ dt> <dd> <input type = "checkbox" name = "NewsletterSubscribe" id = "NewsletterSubscribe" checked = "checked" /> <label for = "NewsletterSubscribe"> <?php echo Mage ::ヘルパー( 'newslettersubscribe')-> __( 'Century Supplementsニュースレターを受け取りたい')?</ label> </ dd> <?php / * eofニュースレターチェックボックスの購読* /?> ...
はい、支払い方法の選択ページにチェックマークが表示されます。 しかし、なぜ非アクティブなのですか? そして、ファイルの最後にあるJSコードによって非アクティブにされるため:
<script type = "text / javascript"> payment.init(); </ script>
なぜ必要なのか理解できませんでしたが、この場合、すべての<input>タグが非アクティブになります。 このコードを実行した後、チェックマークを有効にする必要があることがわかります。
<script type = "text / javascript"> payment.init(); </ script> <script type = "text / javascript"> $( 'NewsletterSubscribe')。disabled = false; </ script>
これでチェックマークがアクティブになりました。次に進みます。
イベント「チェックアウトページの保存」
私は、Checkoutnewsletterがどのようにそれを行うかを探りました。 モジュール構成ファイルには、チェックアウト全体、そのすべてのページに関連するアクションを明らかにインターセプトする行があります。
<?xml version = "1.0"?> <構成> ... <グローバル> <モデル> <チェックアウト> <書き換え> <type_onepage> Desitex_Checkoutnewsletter_Model_Checkout_Type_Onepage </ type_onepage> </ rewrite> </ checkout> ... </ config>
標準クラス
Mage_Checkout_Model_Type_Onepage
は、モジュールクラス
Desitex_Checkoutnewsletter_Model_Checkout_Type_Onepage
(元のクラス
Mage_Checkout_Model_Type_Onepage
を継承)に置き換えられました。 このクラスでは、1つのメソッドのみがオーバーライドされます。
<?php クラスDesitex_Checkoutnewsletter_Model_Checkout_Type_OnepageはMage_Checkout_Model_Type_Onepageを拡張します { パブリック関数saveBilling($データ、$ customerAddressId) { if(isset($ data ['is_subscribed'])&&!empty($ data ['is_subscribed'])){ $ this-> getCheckout()-> setCustomerIsSubscribed(1); } その他{ $ this-> getCheckout()-> setCustomerIsSubscribed(0); } 親を返す:: saveBilling($ data、$ customerAddressId); } }
明らかに、ユーザーが請求先住所入力ページに移動する([続行]ボタンをクリックすると)
saveBilling
アクションが発生します。 ここで、モジュールは、現在のセッション(またはチェックアウト...)で「ニュースを購読するかどうか」チェックボックスの値を保存します。 その後、標準クラスの元のメソッドを呼び出します。
このように動作します-クラスを作成し、それを標準クラスから継承し、フォームがページに保存されるときに発生するメソッドを1つだけ再定義します。 メソッドはチェックマークの値を保存します。 クラスを
Model/Onepage.php
ます。
<?php クラスMage_NewsletterSubscribe_Model_OnepageはMage_Checkout_Model_Type_Onepageを拡張します{ パブリック関数savePayment($データ){ if(isset($ _ POST ['NewsletterSubscribe'])){ $ this-> getCheckout()-> setNewsletterSubscribe((bool)$ _POST ['NewsletterSubscribe']); } その他{ $ this-> getCheckout()-> setNewsletterSubscribe(false); } 親を返す:: savePayment($データ); } }
ここで少しst迷が私を追い越しました。 チェックマークの値はフォームの値の1つですが、現在の場所からはこれらの変数にアクセスできません。 つまり すべてのGETおよびPOST変数を格納するMagento Requestオブジェクトへのアクセス。 引用、チェックアウトなど、さまざまな興味深いデータを持つさまざまな興味深いオブジェクトがありますが、フォームの値はありません。 カーネルコードの書き換えは非常に悪いと思って絶望しそうになりましたが、それがPhpであったことを思い出しました。つまり、変数$ _GETと$ _POSTはどこでも利用できるということです:)問題は解決しました。
では、Magentoを例に考えてみましょう。標準クラスの代わりに、Magentoが必要です。
etc/config.xml
編集:
<?xml version = "1.0"?> <構成> <グローバル> <モデル> <チェックアウト> <書き換え> <type_onepage> Mage_NewsletterSubscribe_Model_Onepage </ type_onepage> </ rewrite> </ checkout> </ models> ... </ config>
ここで準備ができました。 明らかに1つの制限があります-標準クラスをオーバーライドできるモジュールは1つだけです。
Checkoutnewsletter
モジュールからオーバーライドを削除するまで、私のメソッドは呼び出されませんでした。 つまり これは、任意の数のリスナーがサブスクライブできる通常のイベントではありません。 将来修正が難しい問題:(
注文イベント
前の「イベント」とは異なり、チェックアウトは「実際の」イベント
checkout_type_onepage_save_order
です。 サブスクライブするには、構成モジュール
etc/config.xml
を変更する必要があり
etc/config.xml
。
<?xml version = "1.0"?> <構成> <グローバル> ... <イベント> <checkout_type_onepage_save_order> <オブザーバー> <mage_newslettersubscribe_observer> <type>シングルトン</ type> <class>ニュースレター購読/オブザーバー</ class> <method> onOrderSave </ method> </ mage_newslettersubscribe_observer> </ observers> </ checkout_type_onepage_save_order> </ events> </ global> </ config>
ここでは、ユーザーが注文するときに呼び出すクラスのメソッド(
Mage_NewsletterSubscribe_Model_Observer::onOrderSave
)を示しました。 次に、このクラスとメソッドを作成します-ファイル
/Model/Observer.php
:
<?php class Mage_NewsletterSubscribe_Model_Observer extends Mage_Core_Helper_Abstract { パブリック関数onOrderSave($オブザーバー){ $ isCustomerSubscribed =(bool)Mage :: getSingleton( 'checkout / session')-> getNewsletterSubscribe(); if($ isCustomerSubscribed){ $ quote = $ observer-> getEvent()-> getQuote(); $ session = Mage :: getSingleton( 'コア/セッション'); { $ status = Mage :: getModel( 'newsletter / subscriber')-> subscribe($ quote-> getBillingAddress()-> getEmail()); if($ status == Mage_Newsletter_Model_Subscriber :: STATUS_NOT_ACTIVE){ $ session-> addSuccess(Mage :: helper( 'checkoutnewsletter')-> __( 'ニュースレター購読に関する確認要求が送信されました')); } } catch(Mage_Core_Exception $ e){ $ session-> addException($ e、Mage :: helper( 'checkoutnewsletter')-> __( 'ニュースレターのサブスクリプションに問題がありました:%s'、$ e-> getMessage())); } catch(例外$ e){ $ session-> addException($ e、Mage :: helper( 'checkoutnewsletter')-> __( 'ニュースレターのサブスクリプションに問題がありました')); } } $ thisを返します。 } }
私はこのコードをCheckoutnewsletterモジュールから取得しました。それが機能するように再編集しました。 幸いなことに、Magentoには、ユーザーがニュースを購読できるクラスがあります。 実際、
Mage::getModel('newsletter/subscriber')->subscribe(<user email>);
呼び出すだけ
Mage::getModel('newsletter/subscriber')->subscribe(<user email>);
まとめ
結果は、タスクを実行する小さなモジュールです。