ああ、Magentoの開発に関する記事が1つもあります。 私も言いたいことがあります。 誰もが興味を持っているのだろうか...
そのため、タスクはチェックボックス「ニュースを受信する」をチェックアウト手順の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>);
まとめ
結果は、タスクを実行する小さなモジュールです。