Magento、チェックアウトニュースレターの購読

ああ、Magentoの開発に関する記事が1つもあります。 私も言いたいことがあります。 誰もが興味を持っているのだろうか...



そのため、タスクはチェックボックス「ニュースを受信する」をチェックアウト手順の1つに追加することです(チェックアウト-「レジを通過する」)。







すぐに、新しいモジュールを作成する必要があることが明らかになりました。 ここでは、設計ファイルの変更だけでは十分ではありません。 チェックアウトステップにフィールドを追加する方法は、 Desitex Checkoutnewsletterモジュール(請求先住所を指定する必要がある2番目のステップに「ニュースレターの購読」チェックボックスを追加する)およびBiebersdorf CustomerOrderComment (最後にコメントを追加するフィールドを追加する)ステップ-注文確認ページ)。



示されたモジュールを掘り下げて解決策を見つけるプロセスを省略します:)最後に、すべてが機能するためには、次のものが必要です。



モジュール作成



まず、モジュールを作成します。 それを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>);







まとめ



結果は、タスクを実行する小さなモジュールです。



All Articles