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