В этой статье мы рассмотрим возможность подписки клиента на почтовую рассылку нескольких мульти-магазинов 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 и сбросить кеш. Иначе никаких изменений вы не увидите ;)