From c3cd46773b7be3bf7370fc31469e3f5eab97fdfe Mon Sep 17 00:00:00 2001 From: gonzalo Date: Tue, 10 Oct 2023 13:56:23 -0300 Subject: [PATCH] closes #1847 for magento 2.2 --- Block/Subscribe.php | 4 + Controller/Subscriber/Subscribe.php | 39 +++++++++ Controller/WebHook/Index.php | 2 + Cron/Webhook.php | 6 +- Helper/Data.php | 21 +++-- Model/Config/Source/Maps.php | 53 ++++++++++++ Model/Plugin/Subscriber.php | 85 +++++++++++++------ Model/ResourceModel/Newsletter/Collection.php | 14 +++ Observer/Subscriber/SaveBefore.php | 34 ++++++++ Setup/UpgradeSchema.php | 13 ++- etc/adminhtml/di.xml | 15 ++++ etc/adminhtml/system.xml | 18 +++- etc/events.xml | 3 + etc/module.xml | 2 +- .../layout/newsletter_subscriber_block.xml | 15 ++++ view/adminhtml/web/js/configapikey.js | 44 ++++++++++ view/frontend/layout/default.xml | 3 + view/frontend/templates/footerwphone.phtml | 48 +++++++++++ 18 files changed, 382 insertions(+), 37 deletions(-) create mode 100644 Controller/Subscriber/Subscribe.php create mode 100644 Model/Config/Source/Maps.php create mode 100644 Model/ResourceModel/Newsletter/Collection.php create mode 100644 Observer/Subscriber/SaveBefore.php create mode 100644 etc/adminhtml/di.xml create mode 100644 view/adminhtml/layout/newsletter_subscriber_block.xml create mode 100644 view/frontend/templates/footerwphone.phtml diff --git a/Block/Subscribe.php b/Block/Subscribe.php index 1012a305..b4932db7 100644 --- a/Block/Subscribe.php +++ b/Block/Subscribe.php @@ -38,4 +38,8 @@ public function getPopupUrl() $storeId = $this->context->getStoreManager()->getStore()->getId(); return $this->helper->getConfigValue(MailchimpHelper::XML_POPUP_URL,$storeId); } + public function getFormActionUrl() + { + return $this->getUrl('mailchimp/subscriber/subscribe', ['_secure' => true]); + } } \ No newline at end of file diff --git a/Controller/Subscriber/Subscribe.php b/Controller/Subscriber/Subscribe.php new file mode 100644 index 00000000..600c4379 --- /dev/null +++ b/Controller/Subscriber/Subscribe.php @@ -0,0 +1,39 @@ +session = $customerSession; + parent::__construct($context, $subscriberFactory, $customerSession, $storeManager, $customerUrl, $customerAccountManagement, $emailValidator); + } + + public function execute() + { + if($this->getRequest()->isPost() && $this->getRequest()->getPost('phone')) { + $phone = (string)$this->getRequest()->getPost('phone'); + $this->session->setPhone($phone); + } + return parent::execute(); + } +} \ No newline at end of file diff --git a/Controller/WebHook/Index.php b/Controller/WebHook/Index.php index 881cb736..070da4a6 100644 --- a/Controller/WebHook/Index.php +++ b/Controller/WebHook/Index.php @@ -85,6 +85,8 @@ public function execute() $this->_helper->log($e->getMessage()); $this->_helper->log($request['data']); } + } else { + $this->_helper->log("The two way is off"); } } else { $this->_helper->log('An empty request comes from ip: '.$this->_remoteAddress->getRemoteAddress()); diff --git a/Cron/Webhook.php b/Cron/Webhook.php index 48262bbe..0dddeadc 100644 --- a/Cron/Webhook.php +++ b/Cron/Webhook.php @@ -150,7 +150,8 @@ protected function _subscribe($data) if (count($storeIds) > 0) { foreach ($storeIds as $storeId) { $sub = $this->_subscriberFactory->create(); - $sub->setStoreId($storeId); + $websiteId = $this->storeManager->getStore($storeId)->getWebsiteId(); + $sub->setStoreId($websiteId); $sub->setSubscriberEmail($email); $this->_subscribeMember($sub, \Magento\Newsletter\Model\Subscriber::STATUS_SUBSCRIBED); } @@ -247,7 +248,8 @@ protected function _profile($data) $stores = $this->_helper->getMagentoStoreIdsByListId($listId); if (count($stores)) { - $subscriber->setStoreId($stores[0]); + $websiteId = $this->storeManager->getStore($stores[0])->getWebsiteId(); + $subscriber->setStoreId($websiteId); try { $api = $this->_helper->getApi($stores[0]); $member = $api->lists->members->get($listId, hash('md5', strtolower($email))); diff --git a/Helper/Data.php b/Helper/Data.php index 11ed256c..750e02d7 100755 --- a/Helper/Data.php +++ b/Helper/Data.php @@ -52,7 +52,8 @@ class Data extends \Magento\Framework\App\Helper\AbstractHelper const XML_POPUP_FORM = 'mailchimp/general/popup_form'; const XML_POPUP_URL = 'mailchimp/general/popup_url'; const XML_CLEAN_ERROR_MONTHS = 'mailchimp/ecommerce/clean_errors_months'; - + const XML_FOOTER_PHONE = 'mailchimp/general/footer_phone'; + const XML_FOOTER_MAP = 'mailchimp/general/footer_phone_map'; const ORDER_STATE_OK = 'complete'; @@ -416,7 +417,7 @@ private function getAddressAtt() $ret[$item] = [ 'attCode' => $item, 'isDate' => false, - 'isAddress' => false, + 'isAddress' => true, 'options' => [] ]; } @@ -776,6 +777,13 @@ public function getMergeVarsBySubscriber(\Magento\Newsletter\Model\Subscriber $s $mergeVars = []; $storeId = $subscriber->getStoreId(); $webSiteId = $this->getWebsiteId($subscriber->getStoreId()); + if ($this->getConfigValue(self::XML_FOOTER_PHONE, $webSiteId, "websites")) { + $phone_field = $this->getConfigValue(self::XML_FOOTER_MAP , $webSiteId, "websites"); + $phone = $subscriber->getPhone(); + if ($phone_field && $phone) { + $mergeVars[$phone_field] = $phone; + } + } if (!$email) { $email = $subscriber->getEmail(); } @@ -787,7 +795,7 @@ public function getMergeVarsBySubscriber(\Magento\Newsletter\Model\Subscriber $s $customer->setWebsiteId($webSiteId); $customer->loadByEmail($email); if ($customer->getData('email') == $email) { - $mergeVars = $this->getMergeVars($customer, $storeId); + $mergeVars = array_merge($mergeVars,$this->getMergeVars($customer, $customer->getStoreId())); } } catch (\Exception $e) { $this->log($e->getMessage()); @@ -1026,11 +1034,14 @@ public function loadListSubscribers($listId, $mail) { $collection = null; $storeIds = $this->getMagentoStoreIdsByListId($listId); - $storeIds[] = 0; + $websiteIds = []; + foreach($storeIds as $storeId) { + $websiteIds[] =$this->_storeManager->getStore($storeId)->getWebsiteId(); + } if (count($storeIds) > 0) { $collection = $this->_subscriberCollection->create(); $collection - ->addFieldToFilter('store_id', ['in'=>$storeIds]) + ->addFieldToFilter('store_id', ['in'=>$websiteIds]) ->addFieldToFilter('subscriber_email', ['eq'=>$mail]); } return $collection; diff --git a/Model/Config/Source/Maps.php b/Model/Config/Source/Maps.php new file mode 100644 index 00000000..563b428a --- /dev/null +++ b/Model/Config/Source/Maps.php @@ -0,0 +1,53 @@ +getParam("store", 0); + if ($request->getParam('website', 0)) { + $scope = 'website'; + $storeId = $request->getParam('website', 0); + } elseif ($request->getParam('store', 0)) { + $scope = 'stores'; + $storeId = $request->getParam('store', 0); + } else { + $scope = 'default'; + } + + if ($helper->getApiKey($storeId, $scope)) { + try { + $this->options = $helper->getApi($storeId, $scope)->lists->mergeFields->getAll( + $helper->getConfigValue(\Ebizmarts\MailChimp\Helper\Data::XML_PATH_LIST, $storeId, $scope), + null, + null, + MailchimpHelper::MAX_MERGEFIELDS + ); + } catch (\Mailchimp_Error $e) { + $helper->log($e->getFriendlyMessage()); + } + } + + } + public function toOptionArray() + { + if (is_array($this->options)&&key_exists('merge_fields', $this->options)) { + $rc = []; + foreach ($this->options['merge_fields'] as $item) { + $rc[$item['tag']] = $item['tag'] . ' (' . $item['name'] . ' : ' . $item['type'] . ')'; + } + } else { + $rc[] = ['value' => 0, 'label' => __('---No Data---')]; + } + return $rc; + } +} \ No newline at end of file diff --git a/Model/Plugin/Subscriber.php b/Model/Plugin/Subscriber.php index 84848706..36aa9f06 100644 --- a/Model/Plugin/Subscriber.php +++ b/Model/Plugin/Subscriber.php @@ -49,7 +49,7 @@ public function __construct( \Magento\Customer\Model\Session $customerSession, \Magento\Store\Model\StoreManagerInterface $storeManager ) { - + $this->_helper = $helper; $this->_customer = $customer; $this->_customerSession = $customerSession; @@ -64,9 +64,9 @@ public function __construct( */ public function beforeUnsubscribeCustomerById( \Magento\Newsletter\Model\Subscriber $subscriber, - $customerId + $customerId ) { - $storeId = $this->getStoreIdFromSubscriber($subscriber); + $storeId = $this->_storeManager->getStore()->getId(); if ($this->_helper->isMailChimpEnabled($storeId)) { if (!$this->_helper->getConfigValue(\Ebizmarts\MailChimp\Helper\Data::XML_MAGENTO_MAIL, $storeId)) { $subscriber->setImportMode(true); @@ -76,7 +76,12 @@ public function beforeUnsubscribeCustomerById( $api = $this->_helper->getApi($storeId); try { $md5HashEmail = hash('md5', strtolower($subscriber->getSubscriberEmail())); - $api->lists->members->update($this->_helper->getDefaultList($storeId), $md5HashEmail, null, 'unsubscribed'); + $api->lists->members->update( + $this->_helper->getDefaultList($storeId), + $md5HashEmail, + null, + 'unsubscribed' + ); } catch (\Mailchimp_Error $e) { $this->_helper->log($e->getFriendlyMessage()); } @@ -94,16 +99,15 @@ public function beforeUnsubscribeCustomerById( */ public function beforeSubscribeCustomerById( \Magento\Newsletter\Model\Subscriber $subscriber, - $customerId + $customerId ) { - $storeId = $this->getStoreIdFromSubscriber($subscriber); + $storeId = $this->_storeManager->getStore()->getId(); if ($this->_helper->isMailChimpEnabled($storeId)) { $subscriber->loadByCustomerId($customerId); if (!$subscriber->isSubscribed()) { if (!$this->_helper->getConfigValue(\Ebizmarts\MailChimp\Helper\Data::XML_MAGENTO_MAIL, $storeId)) { $subscriber->setImportMode(true); } - if ($this->_helper->isMailChimpEnabled($storeId)) { $customer = $this->_customer->getById($customerId); $email = $customer->getEmail(); @@ -116,7 +120,19 @@ public function beforeSubscribeCustomerById( } try { $emailHash = hash('md5', strtolower($customer->getEmail())); - $api->lists->members->addOrUpdate($this->_helper->getDefaultList($storeId), $emailHash, null, $status, $mergeVars, null, null, null, null, $email, $status); + $api->lists->members->addOrUpdate( + $this->_helper->getDefaultList($storeId), + $emailHash, + null, + $status, + $mergeVars, + null, + null, + null, + null, + $email, + $status + ); } catch (\Mailchimp_Error $e) { $this->_helper->log($e->getFriendlyMessage()); } @@ -131,16 +147,20 @@ public function beforeSubscribeCustomerById( * @param $email * @return array * @throws \Magento\Framework\Exception\LocalizedException + * @throws \Magento\Framework\Exception\NoSuchEntityException */ public function beforeSubscribe( \Magento\Newsletter\Model\Subscriber $subscriber, - $email + $email ) { - $storeId = $this->getStoreIdFromSubscriber($subscriber); + $storeId = $this->_storeManager->getStore()->getId(); if ($this->_helper->isMailChimpEnabled($storeId)) { if (!$this->_helper->getConfigValue(\Ebizmarts\MailChimp\Helper\Data::XML_MAGENTO_MAIL, $storeId)) { $subscriber->setImportMode(true); } + if ($this->_customerSession->getPhone()) { + $subscriber->setPhone($this->_customerSession->getPhone()); + } if ($this->_helper->isMailChimpEnabled($storeId)) { $api = $this->_helper->getApi($storeId); @@ -152,7 +172,19 @@ public function beforeSubscribe( $mergeVars = $this->_helper->getMergeVarsBySubscriber($subscriber, $email); try { $md5HashEmail = hash('md5', strtolower($email)); - $return = $api->lists->members->addOrUpdate($this->_helper->getDefaultList($storeId), $md5HashEmail, null, $status, $mergeVars, null, null, null, null, $email, $status); + $return = $api->lists->members->addOrUpdate( + $this->_helper->getDefaultList($storeId), + $md5HashEmail, + null, + $status, + $mergeVars, + null, + null, + null, + null, + $email, + $status + ); } catch (\Mailchimp_Error $e) { $this->_helper->log($e->getFriendlyMessage()); } @@ -169,20 +201,23 @@ public function beforeSubscribe( public function beforeUnsubscribe( \Magento\Newsletter\Model\Subscriber $subscriber ) { - $storeId = $this->getStoreIdFromSubscriber($subscriber); + $storeId = $this->_storeManager->getStore()->getId(); if ($this->_helper->isMailChimpEnabled($storeId)) { if (!$this->_helper->getConfigValue(\Ebizmarts\MailChimp\Helper\Data::XML_MAGENTO_MAIL, $storeId)) { $subscriber->setImportMode(true); - } - $api = $this->_helper->getApi($storeId); + } $api = $this->_helper->getApi($storeId); try { $md5HashEmail = hash('md5', strtolower($subscriber->getSubscriberEmail())); - $api->lists->members->update($this->_helper->getDefaultList($storeId), $md5HashEmail, null, 'unsubscribed'); + $api->lists->members->update( + $this->_helper->getDefaultList($storeId), + $md5HashEmail, + null, + 'unsubscribed' + ); } catch (\Mailchimp_Error $e) { $this->_helper->log($e->getFriendlyMessage()); } } - return null; } /** @@ -193,14 +228,19 @@ public function beforeUnsubscribe( public function afterDelete( \Magento\Newsletter\Model\Subscriber $subscriber ) { - $storeId = $this->getStoreIdFromSubscriber($subscriber); + $storeId = $this->_storeManager->getStore()->getId(); if ($this->_helper->isMailChimpEnabled($storeId)) { $api = $this->_helper->getApi($storeId); if ($subscriber->isSubscribed()) { try { $md5HashEmail = hash('md5', strtolower($subscriber->getSubscriberEmail())); if ($subscriber->getCustomerId()) { - $api->lists->members->update($this->_helper->getDefaultList($storeId), $md5HashEmail, null, 'unsubscribed'); + $api->lists->members->update( + $this->_helper->getDefaultList($storeId), + $md5HashEmail, + null, + 'unsubscribed' + ); } else { $api->lists->members->delete($this->_helper->getDefaultList($storeId), $md5HashEmail); } @@ -211,13 +251,4 @@ public function afterDelete( } return null; } - - /** - * @param \Magento\Newsletter\Model\Subscriber $subscriber - * @return int - */ - protected function getStoreIdFromSubscriber(\Magento\Newsletter\Model\Subscriber $subscriber) - { - return $subscriber->getStoreId(); - } } diff --git a/Model/ResourceModel/Newsletter/Collection.php b/Model/ResourceModel/Newsletter/Collection.php new file mode 100644 index 00000000..38d12daa --- /dev/null +++ b/Model/ResourceModel/Newsletter/Collection.php @@ -0,0 +1,14 @@ +showCustomerInfo(true)->addSubscriberTypeField()->showStoreInfo(); + $this->_map['fields']['phone'] = 'main_table.phone'; + return $this; + } +} \ No newline at end of file diff --git a/Observer/Subscriber/SaveBefore.php b/Observer/Subscriber/SaveBefore.php new file mode 100644 index 00000000..4bd10496 --- /dev/null +++ b/Observer/Subscriber/SaveBefore.php @@ -0,0 +1,34 @@ +customerSession = $customerSession; + } + public function execute(Observer $observer) + { + // TODO: Implement execute() method. + $subscriber = $observer->getSubscriber(); + if ($this->customerSession->getPhone()) { + $subscriber->setPhone($this->customerSession->getPhone()); + $this->customerSession->unsPhone(); + } + return $subscriber; + } +} \ No newline at end of file diff --git a/Setup/UpgradeSchema.php b/Setup/UpgradeSchema.php index 02aed2b3..b9175563 100644 --- a/Setup/UpgradeSchema.php +++ b/Setup/UpgradeSchema.php @@ -746,6 +746,17 @@ public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $con 'mailchimp_sent' ); } - + if (version_compare($context->getVersion(), '102.3.58') < 0) { + $connection->addColumn( + $setup->getTable('newsletter_subscriber'), + 'phone', + [ + 'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, + 'default' => null, + 'length' => 128, + 'comment' => 'Phone' + ] + ); + } } } diff --git a/etc/adminhtml/di.xml b/etc/adminhtml/di.xml new file mode 100644 index 00000000..23d781f6 --- /dev/null +++ b/etc/adminhtml/di.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/etc/adminhtml/system.xml b/etc/adminhtml/system.xml index 7b8b9e5b..d527234a 100644 --- a/etc/adminhtml/system.xml +++ b/etc/adminhtml/system.xml @@ -69,7 +69,7 @@ - + Magento\Config\Model\Config\Source\Yesno Enabling this, the "Subscribe" button at the bottom open a popup with the Mailchimp subscription form @@ -84,6 +84,22 @@ 1 + + + Magento\Config\Model\Config\Source\Yesno + + + 1 + + + + + Ebizmarts\MailChimp\Model\Config\Source\Maps + + 1 + 1 + + Magento\Config\Model\Config\Source\Yesno diff --git a/etc/events.xml b/etc/events.xml index 1e8c1ae3..817721ca 100644 --- a/etc/events.xml +++ b/etc/events.xml @@ -26,6 +26,9 @@ + + + diff --git a/etc/module.xml b/etc/module.xml index faf5bd65..b1cfba35 100644 --- a/etc/module.xml +++ b/etc/module.xml @@ -11,7 +11,7 @@ */ --> - + diff --git a/view/adminhtml/layout/newsletter_subscriber_block.xml b/view/adminhtml/layout/newsletter_subscriber_block.xml new file mode 100644 index 00000000..94b769af --- /dev/null +++ b/view/adminhtml/layout/newsletter_subscriber_block.xml @@ -0,0 +1,15 @@ + + + + + + + Phone + phone + phone + phone + + + + + \ No newline at end of file diff --git a/view/adminhtml/web/js/configapikey.js b/view/adminhtml/web/js/configapikey.js index 69f49d51..05b72997 100644 --- a/view/adminhtml/web/js/configapikey.js +++ b/view/adminhtml/web/js/configapikey.js @@ -85,6 +85,20 @@ define( if (ecommerceEnabled == 0 && abandonedCartEnabled == 1) { self._changeAbandonedCart(); } + $('#mailchimp_general_popup_form').change(function () { + var popupformEnabled = $('#mailchimp_general_popup_form').find(':selected').val(); + var footerphoneEnabled = $('#mailchimp_general_footer_phone').find(':selected').val(); + if (popupformEnabled == 1 && footerphoneEnabled == 1) { + self._disableFooterPhone(); + } + }); + $('#mailchimp_general_footer_phone').change(function () { + var popupformEnabled = $('#mailchimp_general_popup_form').find(':selected').val(); + var footerphoneEnabled = $('#mailchimp_general_footer_phone').find(':selected').val(); + if (popupformEnabled == 1 && footerphoneEnabled == 1) { + self._disablePopupForm(); + } + }); }, _changeEcommerce: function () { var self = this; @@ -397,6 +411,36 @@ define( } }); }); + }, + _disableFooterPhone: function () { + var tag = '#mailchimp_general_footer_phone' + $(tag).empty(); + $(tag).append($('