9

Magento のニュースレター購読モジュールには、デフォルトで 1 つのフィールド (メール) しかありません。フォームに追加のフィールド (国など) を追加した後、フォーム データを Magento バックエンドに表示し、事前設定された受信者に電子メールとして送信するにはどうすればよいですか? ありがとう。

4

4 に答える 4

33

Magento ニュースレター購読者用のカスタム フィールド (たとえば、subscriber_name ) を追加する場合は、次の手順を実行する必要があります。

  • newsletter_subscriberテーブルに新しい列を追加
  • ニュースレター テンプレートにテキスト入力を追加する
  • Newsletter_subscriber_save_beforeイベントのオブザーバーを作成する

オブザーバーでは、リクエストからカスタム フィールドの値を取得し、サブスクライバーのオブジェクトに割り当てることができます。

public function newsletterSubscriberSave(Varien_Event_Observer $observer)
{
    $subscriber = $observer->getEvent()->getSubscriber();
    $name = Mage::app()->getRequest()->getParam('subscriber_name');

    $subscriber->setSubscriberName($name);

    return $this;
}


更新

国フィールドの追加方法を詳しく説明した記事はこちら また、無料のモジュールを作成しました。GitHubで公開しています。

于 2011-06-21T13:05:30.827 に答える
23

この作業を行うには、次の点に注意する必要があります。

  1. データの新しい列を適切なデータベース テーブルに追加します
  2. Magento が新しいフィールドをデータベースに保存していることを確認してください
  3. 管理バックエンドでデータを提示する
  4. 新しいニュースレターの購読を取得したときにデータを記録する

これらすべてを行う方法は次のとおりです。

広告。1)

phpMyAdmin、MySQL コマンド ライン、またはお好みの DB 操作方法を使用して、新しい列「country」を varchar(100) として、newsletter_subscriber テーブルに追加します。

広告。2)

Magento は、Mage_Newsletter_Model_Subscriber オブジェクトのgetCountry()およびsetCountry()メソッドを介して、新しいフィールドへのアクセスを自動的に提供します。それがしない唯一のことは、システムのどこかでコードで変更された後、フィールドをDBに保存することです。保存するには、Mage_Newsletter_Model_Mysql4_Subscriber (app/code/core/Mage/Newsletter/Model/Mysql4/Subscriber.php) にある _prepareSave(Mage_Newsletter_Model_Subscriber $subscriber) 関数を変更する必要があります。最初にファイルのローカル コピーを作成し、コア ファイルを変更しないようにしてください。追加する必要があるものは次のとおりです。

protected function _prepareSave(Mage_Newsletter_Model_Subscriber $subscriber)
{
    $data = array();
    $data['customer_id'] = $subscriber->getCustomerId();
    $data['store_id'] = $subscriber->getStoreId()?$subscriber->getStoreId():0;
    $data['subscriber_status'] = $subscriber->getStatus();
    $data['subscriber_email']  = $subscriber->getEmail();
    $data['subscriber_confirm_code'] = $subscriber->getCode();

    //ADD A NEW FIELD START

    //note that the string index for the $data array
    //must match the name of the column created in step 1
    $data['country'] = $subscriber->getCountry();

    //ADD A NEW FIELD END
    (...)
}

広告。3)

ファイル app/code/core/Mage/Adminhtml/Block/Newsletter/Subscriber/Grid.phpを変更 (のローカル コピー)する必要があります。お探しのメソッドは _prepareColumns() です。そこには、$this->addColumn() への一連の呼び出しが表示されます。次のコードを使用して、「国」フィールドに対応する呼び出しを追加する必要があります。

$this->addColumn('country', array(
    'header'    => Mage::helper('newsletter')->__('Country'),
    //the index must match the name of the column created in step 1
    'index'     => 'country',
    'default'   =>    '----'
));

フィールドをグリッドの最後 (最後の列として) に表示する場合は、それを最後の呼び出しとして追加します。それ以外の場合は、既存の呼び出しの間で、管理者の最終的な場所に正確に絞り込みます。

広告。4)

これは、Magento ニュースレターのカスタマイズで行う必要のなかった部分であるため、ほとんど理論的なものになります。サブスクリプションは、app/code/core/Mage/Newsletter/controllers/SubscriberController.php にあるコントローラーで発生します。私が提案した変更を加えた newAction メソッドのコードは次のとおりです。

public function newAction()
{
    if ($this->getRequest()->isPost() && $this->getRequest()->getPost('email')) {
        $session   = Mage::getSingleton('core/session');
        $email     = (string) $this->getRequest()->getPost('email');

        try {
            if (!Zend_Validate::is($email, 'EmailAddress')) {
                Mage::throwException($this->__('Please enter a valid email address'));
            }

            $status = Mage::getModel('newsletter/subscriber')->subscribe($email);
            if ($status == Mage_Newsletter_Model_Subscriber::STATUS_NOT_ACTIVE) {
                $session->addSuccess($this->__('Confirmation request has been sent'));
            }
            else {
                $session->addSuccess($this->__('Thank you for your subscription'));
            }
                
                //ADD COUNTRY INFO START
                
                //at this point we may safly assume that subscription record was created
                //let's retrieve this record and add the additional data to it
                $subscriber = Mage::getModel('newsletter/subscriber')->loadByEmail($email);
                
                //assuming that the input's id is "country"
                $subscriber->setCountry((string) $this->getRequest()->getPost('country'));
                
                //don't forget to save the subscriber!
                $subscriber->save();
                
                //ADD COUNTRY INFO END
        }
        catch (Mage_Core_Exception $e) {
            $session->addException($e, $this->__('There was a problem with the subscription: %s', $e->getMessage()));
        }
        catch (Exception $e) {
            $session->addException($e, $this->__('There was a problem with the subscription'));
        }
    }
    $this->_redirectReferer();
}

上記の手順を実行すると、問題の大部分が処理されます。テストする機会がなかったので、最後の部分がどのように機能したか教えてください.

サブスクライバー オブジェクトに追加のフィールドを作成したら、それを使って好きなことを行うことができます。私はあなたが言っていることを本当に理解していませんでした

事前設定された受信者に電子メールとして送信される

あなたがそれを説明できれば、私はこの部分でもあなたを助けようとします.

編集 - 誰かがサブスクライブしたときにメールを送信する方法

サブスクライバー オブジェクトに国を追加する部分の後に、次のコードをコントローラーに追加するだけです。

$mail = new Zend_Mail();
$mail->setBodyHtml("New subscriber: $email <br /><br />Country: ".$this->getRequest()->getPost('country'));
$mail->setFrom("youremail@email.com")
->addTo("admin@mysite.com")
->setSubject("Your Subject here");
$mail->send(); 
于 2010-07-03T22:11:37.960 に答える
0

受け入れられた回答に加えて、日付、日時、またはタイムスタンプタイプの列を追加する場合、これを少し簡単に回避することもできます。

私の場合、グリッドに「Subsubscribed at Date」を追加したかったのです。これを行うために、アップグレード スクリプトを作成しました。列の型は TIMESTAMP で、デフォルト値は CURRENT_TIMESTAMP です。このようにして、行が追加されると、現在の日付/時刻が記録されます。

あとは、ブロックのカスタマイズを追加するだけです。ただし、ローカルのコードプールのオーバーライドを行うのではなく、Magento のグリッド ブロックを拡張することでそれを行うことをお勧めします。このように、_prepareColumns(); をオーバーライドするだけで済みます。

于 2012-12-10T22:35:20.193 に答える
0

古いスレッドですが、誰かが同じ質問をしている場合は、性別、名、姓のフィールドを追加し、バックエンド グリッドで xml/csv 経由でエクスポートできるようにする無料の拡張機能があります: http://www.magentocommerce.com/ magento-connect/extended-newsletter-subscription-for-guests.html

おそらく、ニーズに合わせてコードを拡張できます。

于 2014-01-19T16:42:27.887 に答える