Добавление настраиваемого поля в модуль подписки Magento - PullRequest
9 голосов
/ 01 июля 2010

Модуль подписки на рассылку в Magento по умолчанию имеет только одно поле (адрес электронной почты).После того, как я добавлю дополнительное поле в форму (скажем, страну), как я могу получить данные формы, чтобы они отображались в бэкэнде Magento и отправлялись по электронной почте заданному получателю?Спасибо.

Ответы [ 4 ]

33 голосов
/ 21 июня 2011

Если вы хотите добавить некоторые настраиваемые поля для подписчика на новостную рассылку 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;
}

UPDATE :

Вот подробная статья, объясняющая , как добавить поле Страна Также я создал бесплатный модуль, он доступен на GitHub

23 голосов
/ 04 июля 2010

Есть несколько вещей, о которых вам нужно позаботиться, чтобы сделать эту работу:

  1. Добавить новый столбец для ваших данных в соответствующую таблицу базы данных
  2. Убедитесь, что magento сохраняет ваше новое поле в базе данных
  3. Представить данные в админке администратора
  4. Запишите данные при получении новой подписки на рассылку

Вот как вы можете делать все эти вещи:

Ad. 1)

Используя phpMyAdmin, командную строку mySQL или любой другой предпочитаемый вами метод манипуляции с БД, добавьте новый столбец «страна», например, varchar (100), в таблицу newsletter_subscriber.

Ad. 2)

Magento автоматически предоставит вам доступ к новому полю с помощью методов getCountry () и setCountry () для объекта Mage_Newsletter_Model_Subscriber. Единственное, что он не сделает, - это сохранит ваше поле обратно в БД после того, как оно будет изменено кодом где-то в системе. Чтобы сохранить его, вам нужно изменить функцию _prepareSave (Mage_Newsletter_Model_Subscriber $ subscriber), найденную в Mage_Newsletter_Model_Mysql4_Subscriber (app / code / core / Mage / Newsletter / Model / Mysql4 / Subscriber.php). Обязательно сначала сделайте локальную копию файла, а не изменяйте файл ядра. Вот что вам нужно добавить:

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)

Вам нужно будет изменить ( локальную копию ) файл 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'   =>    '----'
));

Если вы хотите, чтобы поле появилось в конце сетки (как последний столбец), добавьте его в качестве последнего вызова, в противном случае сожмите его между существующими вызовами именно там, где вы хотите, чтобы оно оказалось в администраторе.

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

Выполнение вышеуказанных шагов должно решить большую часть вашей проблемы. Дайте мне знать, как сработала эта последняя часть, так как у меня не было возможности ее протестировать.

Если у вас есть дополнительное поле в объекте Subscriber, вы можете делать с ним все, что захотите. Я не совсем понял, что вы подразумеваете под

отправлять по электронной почте заранее установленному получателю

Если вы можете объяснить, что я постараюсь помочь вам и с этой частью.

Редактировать - как отправить письмо, когда кто-то подписывается

Просто добавьте следующий код в контроллер после части, которая добавляет страну к объекту подписчика.

$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(); 
0 голосов
/ 19 января 2014

Старый поток, но если у кого-то такой же вопрос, есть бесплатное расширение, которое добавляет поля для пола, имени и фамилии и делает его доступным в бэкэнд-сетке для экспорта через xml / csv: http://www.magentocommerce.com/magento-connect/extended-newsletter-subscription-for-guests.html

Возможно, вы сможете расширить код в соответствии со своими потребностями.

0 голосов
/ 11 декабря 2012

Добавив к принятому ответу, вы также можете с легкостью избежать этого, если добавляете столбец типа date, datetime или timestamp.

В моем случае я хотел добавить «Подписан на дату» в мою сетку. Для этого я написал свой скрипт обновления, тип столбца - TIMESTAMP, а значение по умолчанию - CURRENT_TIMESTAMP. Таким образом, при добавлении строки записывается текущая дата / время.

Затем все, что вам нужно сделать, это добавить настройки блока. Я бы предложил сделать это, расширив блок сетки Magento, а не переопределяя локальный пул кодов. Таким образом, вам нужно только переопределить _prepareColumns ();

...