
В этой статье мы рассмотрим возможность подписки клиента на почтовую рассылку нескольких мульти-магазинов Magento (Magento multi-store).
По умолчанию, если вы используете несколько магазинов в рамках одной инсталляции Magento (так называемые мульти-магазины / multi-stores), посетитель вашего магазина сможет подписаться на почтовые новости только одного из них.
Небольшой пример: представим, что у вас есть два разных мульти-магазина - магазин одежды и магазин инструментов. Посетитель подписывается на новости магазина одежды, спустя некоторое время он заходит на второй магазин и подписывается на новости магазина инструментов (используя тот же самый адрес электронной почты). В этом случае Magento автоматически переключит подписку для данного адреса электронной почты с первой рассылки на вторую, и посетитель останется подписан на только на инструменты.
Решение, описанное в этой статье, позволит подписываться на новости сразу двух магазинов, используя одинаковый адрес электронной почты.

Создаем Magento модуль, поддерживающий механизм мульти-магазинов для почтовой подписки
1 - Создаем директорию для нашего будущего модуля. В моем случае она примет вид:
app/code/community/Turnkeye/Newsletter
Также создаем конфигурационный файл нашего модуля, в котором переопределяем ресурс-модель newsletter/subscriber. Файл будет выглядеть так:
< ?xml version="1.0"?>
<!--File: app/code/community/Turnkeye/Newsletter/etc/config.xml -->
<config>
<modules>
<Turnkeye_Newsletter>
<version>0.0.1</version>
</Turnkeye_Newsletter>
</modules>
<global>
<models>
<newsletter_mysql4> <!--Используем newsletter_mysql4 для совместимости-->
<rewrite>
<subscriber>Turnkeye_Newsletter_RW_Newsletter_Model_Resource_Subscriber</subscriber>
</rewrite>
</newsletter_mysql4>
</models>
</global>
</config>
2 - Создаем класс Turnkeye_Newsletter_RW_Newsletter_Model_Resource_Subscriber.
< ?php // File: app/code/community/Turnkeye/Newsletter/RW/Newsletter/Model/Resource/Subscriber.php
/**
* RW Resource Model
*
* @category Turnkeye
* @package Turnkeye_Newsletter
* @author Kalashnikov Evgeniy
*/
class Turnkeye_Newsletter_RW_Newsletter_Model_Resource_Subscriber extends Mage_Newsletter_Model_Mysql4_Subscriber
{
/**
* Load subscriber from DB by email
*
* @param string $subscriberEmail
* @return array
*/
public function loadByEmail($subscriberEmail)
{
/** @var $customerSession Mage_Customer_Model_Session */
$customerSession = Mage::getSingleton('customer/session');
$ownerId = Mage::getModel('customer/customer')
->setWebsiteId(Mage::app()->getStore()->getWebsiteId())
->loadByEmail($subscriberEmail)
->getId();
$storeId = $customerSession->isLoggedIn() && $ownerId == $customerSession->getId()
? $customerSession->getCustomer()->getStoreId()
: Mage::app()->getStore()->getId();
$select = $this->_read->select()
->from($this->getMainTable())
->where('subscriber_email=:subscriber_email')
->where('store_id=:store_id'); // Добавляем разделение по магазинам (Magento store).
$result = $this->_read->fetchRow($select, array(
'subscriber_email' => $subscriberEmail,
'store_id' => $storeId
));
if (!$result) {
return array();
}
return $result;
}
/**
* Load subscriber by customer
*
* @param Mage_Customer_Model_Customer $customer
* @return array
*/
public function loadByCustomer(Mage_Customer_Model_Customer $customer)
{
$select = $this->_read->select()
->from($this->getMainTable())
->where('customer_id=:customer_id')
->where('store_id=:store_id');
$result = $this->_read->fetchRow($select, array(
'customer_id' => $customer->getId(),
'store_id' => $customer->getStoreId()
));
if ($result) {
return $result;
}
$select = $this->_read->select()
->from($this->getMainTable())
->where('subscriber_email=:subscriber_email')
->where('store_id=:store_id');
$result = $this->_read->fetchRow($select, array(
'subscriber_email' => $customer->getEmail(),
'store_id' => $customer->getStoreId()
));
if ($result) {
return $result;
}
return array();
}
}
3 - Наш модуль готов, осталось его подключить.
Создаем новый файл app/etc/modules/Turnkeye_Newsletter.xml
< ?xml version="1.0"?>
<!-- File: app/etc/modules/Turnkeye_Newsletter.xml -->
<config>
<modules>
<Turnkeye_Newsletter>
<active>true</active>
<codePool>community</codePool>
<depends>
<Mage_Newsletter />
</depends>
</Turnkeye_Newsletter>
</modules>
</config>
Ну и, конечно, не забудьте выключить Magento compiler и сбросить кеш. Иначе никаких изменений вы не увидите ;)