Есть несколько вещей, о которых вам нужно позаботиться, чтобы сделать эту работу:
- Добавить новый столбец для ваших данных в соответствующую таблицу базы данных
- Убедитесь, что magento сохраняет ваше новое поле в базе данных
- Представить данные в админке администратора
- Запишите данные при получении новой подписки на рассылку
Вот как вы можете делать все эти вещи:
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();