Frage

Das Newsletter-Abonnement-Modul in Magento hat nur ein Feld (E-Mail) standardmäßig aktiviert. Nachdem ich ein zusätzliches Feld in die Form (zB Land) hinzufügen, wie kann ich die Formulardaten erhalte im Magento-Backend zu zeigen und als E-Mail an einen vorgegebenen Empfänger gesendet werden? Danke.

War es hilfreich?

Lösung

Es gibt ein paar Dinge, die Sie darauf achten müssen, diese Arbeit zu machen:

  1. Fügen Sie eine neue Spalte für Ihre Daten an die entsprechende Datenbanktabelle
  2. Stellen Sie sicher, dass magento spart Ihr neues Feld in die Datenbank
  3. Präsentieren Sie die Daten im Admin-Backend
  4. Nehmen Sie die Daten, wenn Sie erhalten einen neuen Newsletter-Abonnement

Hier ist, wie Sie all diese Dinge tun können:

Ad. 1)

Mit phpMyAdmin, mySQL Befehlszeile, oder was auch immer Ihre bevorzugte DB Manipulationsmethode ist, fügen Sie eine neue Spalte "Land", sagen wir, varchar (100) an die newsletter_subscriber Tabelle.

Ad. 2)

Magento erhalten Sie automatisch Zugriff geben auf das neue Feld durch die getCountry () und setCountry () Methoden auf dem Mage_Newsletter_Model_Subscriber Objekt. Das einzige, was es nicht ist auf die DB speichern Sie Ihr Feld zurück zu tun, nachdem es mit dem Code irgendwo im System geändert wurde. Um es zu bekommen gespeichert Sie müssen _prepareSave ändern (Mage_Newsletter_Model_Subscriber $ Teilnehmer) Funktion gefunden in Mage_Newsletter_Model_Mysql4_Subscriber (app / code / core / Mage / Newsletter / Modell / MySQL4 / Subscriber.php). Achten Sie darauf, eine lokale Kopie der Datei zu ändern, die den Kern Datei zuerst und nicht machen Hier ist, was Sie hinzufügen müssen.

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
    (...)
}

Ad. 3)

Sie ändern müssen ( eine lokale Kopie von ) auf die Datei app / code / core / Mage / Adminhtml / Block / Newsletter / Subscriber / Grid.php. Verfahren Sie suchen, ist _prepareColumns () aufgerufen. Dort finden Sie eine Reihe von Aufrufen von $ this-> addColumn (siehe). Sie benötigen einen entsprechenden Anruf für „Land“ -Feld mit dem folgenden Code hinzuzufügen:

$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'   =>    '----'
));

Wenn Sie das Feld wollen am Ende des Gitters erscheinen (als letzte Spalte) fügen Sie es als das letzte Gespräch, sonst quetschen sie zwischen den bestehenden Anrufe genau dort, wo Sie es wollen im Admin beenden.

Ad. 4)

Dies ist ein Teil ich nicht in meiner Anpassung des magento-Newsletter zu tun habe, so ist es meist theoretisch sein. Das Abonnement erfolgt in der Steuerung an app / code / core / Mage / Newsletter / controllers / SubscriberController.php entfernt. Hier ist der Code der NewAction Methode mit meinen vorgeschlagenen Änderungen:

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();
}

Wenn man durch die oben genannten Schritte sollten von dem größten Teil des Problems kümmern. Lassen Sie uns wissen, wie das letzte Stück gearbeitet, da ich keine Chance zu testen, es habe.

Wenn Sie Ihr zusätzliches Feld in dem Subscriber-Objekt haben, können Sie tun, was man will. Ich habe nicht wirklich bekommen, was Sie mit

als E-Mail an einen vorgegebenen Empfänger gesendet werden

Wenn Sie erklären, dass ich versuche, Ihnen mit diesem Teil auch zu helfen.

Bearbeiten - wie eine E-Mail zu senden, wenn jemand abonniert

Fügen Sie einfach den folgenden Code in die Steuerung nach dem Teil, das Land zu einem Teilnehmer-Objekt erstellt.

$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(); 

Andere Tipps

Wenn Sie einige benutzerdefinierte Felder für Magento Newsletter-Abonnent hinzufügen (zum Beispiel subscriber_name ), sollten Sie Folgendes tun:

  • Fügen Sie neue Spalte für newsletter_subscriber Tabelle
  • Fügen Sie Texteingabe Newsletter-Vorlage
  • Erstellen Beobachter für newsletter_subscriber_save_before Ereignis

In den Beobachtern können Sie Ihren benutzerdefinierten Feldwert von Anfrage erhalten und weisen es Teilnehmer Objekt:

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

    $subscriber->setSubscriberName($name);

    return $this;
}


UPDATE :

Hier ist der detaillierte Artikel erklärt wie Land Feld hinzufügen Außerdem habe ich ein freies Modul erstellt, ist es auf dem GitHub

auf die akzeptierte Antwort hinzufügen, können Sie auch mit diesem ein wenig leichter weg, wenn Sie ein Datum sind das Hinzufügen, Datum- und Zeitstempel oder Typ-Spalte.

In meinem Fall wollte ich eine „Abonniert auf Date“ zu meinem Raster hinzuzufügen. Dazu schrieb ich meine Upgrade-Skript, Spalte Typ ist, Zeitstempel und der Standardwert Sein CURRENT_TIMESTAMP. Auf diese Weise, wenn die Zeile hinzugefügt wird, wird die aktuelle Datum / Zeit aufgezeichnet.

Dann alles, was Sie tun müssen, ist Ihre Block Anpassungen hinzufügen. Ich würde es zu tun vorschlagen, von Magento Gitterblock erstreckt, anstatt tun der lokale codepool Überschreibung though. Auf diese Weise müssen Sie nur _prepareColumns außer Kraft zu setzen ();

Alt Faden aber wenn jemand die gleiche Frage hat, gibt es eine kostenlose Erweiterung, die Felder für Geschlecht, Vornamen und Nachnamen fügt hinzu und stellt sie im Backend-Raster für den Export über XML / CSV: http://www.magentocommerce.com/magento-connect/extended-newsletter-subscription- für-guests.html

Vielleicht können Sie den Code erweitern Ihre Bedürfnisse anzupassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top