Добавление пользовательского поля в модуль подписки Magento
-
01-10-2019 - |
Вопрос
Модуль подписки на новостную рассылку в Magento по умолчанию содержит только одно поле (email).После того, как я добавлю дополнительное поле в форму (скажем, страну), как я могу заставить данные формы отображаться во внутренней части Magento и отправляться по электронной почте заданному получателю?Спасибо.
Решение
Есть несколько вещей, о которых вам нужно позаботиться, чтобы это сработало:
- Добавьте новый столбец для ваших данных в соответствующую таблицу базы данных
- Убедитесь, что magento сохранил ваше новое поле в базе данных
- Представьте данные в серверной части администратора
- Запишите данные, когда вы получите новую подписку на рассылку новостей
Вот как вы можете сделать все это:
Реклама.1)
Используя phpMyAdmin, командную строку MySQL или любой другой предпочитаемый вами метод манипулирования БД, добавьте новый столбец "country" в виде, скажем, varchar(100) в таблицу newsletter_subscriber.
Реклама.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
(...)
}
Реклама.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' => '----'
));
Если вы хотите, чтобы поле отображалось в конце таблицы (как последний столбец), добавьте его в качестве последнего вызова, в противном случае втисните его между существующими вызовами именно там, где вы хотите, чтобы оно закончилось в admin.
Реклама.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, вы сможете делать с ним все, что захотите.Я действительно не понял, что вы имеете в виду под
будет отправлено по электронной почте заданному получателю
Если вы сможете объяснить это, я постараюсь помочь вам и с этой частью.
Редактировать - как отправить электронное письмо, когда кто-то подписывается
Просто добавьте следующий код в контроллер после части, которая добавляет country к объекту 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();
Другие советы
Если вы хотите добавить некоторые пользовательские поля для абонента Magento Newsletter (например, Подписчик_name.), вы должны сделать следующее:
- Добавить новый столбец для
newsletter_subscriber
стол - Добавить текстовый ввод в раскладку шаблона
- Создать наблюдатель Newsletter_subscriber_save_before мероприятие
В Observer вы можете получить значение вашего пользовательского поля по запросу и назначить его на объект абонента:
public function newsletterSubscriberSave(Varien_Event_Observer $observer)
{
$subscriber = $observer->getEvent()->getSubscriber();
$name = Mage::app()->getRequest()->getParam('subscriber_name');
$subscriber->setSubscriberName($name);
return $this;
}
ОБНОВИТЬ:
Вот подробная статья, объясняющая Как добавить поле страныКроме того, я создал бесплатный модуль, он доступен на Гадость
Добавление к принятому ответу, вы также можете покончить с этим немного проще, если вы добавите столбец даты, даты DateTime или Timestamp.
В моем случае я хотел добавить «подписанную на дату» для моей сетки. Для этого я написал свой сценарий обновления, TimeStamp типа столбцов, и значение по умолчанию, являющееся current_timestamp. Таким образом, когда ряд добавляется, текущая дата / время записывается.
Затем все, что вам нужно сделать, это добавить свои блок настроивания. Я бы предложил сделать это, продлевая сетку Magento, а не делать локальные переопределения CodePool. Таким образом, вам нужно только переопределить _preprecolumns ();
Старая нить, но если у кого-то есть тот же вопрос, есть свободное расширение, которое добавляет поля для пола, имя и фамилия и делает его доступным в Backeng Grid для экспорта через XML / CSV: http://www.magentocommerce.com/magento-connect/extended-newsletter-subscription-for-guests.html.
Возможно, вы можете продлить код, чтобы соответствовать вашим потребностям.