Skip to content

Commit

Permalink
closes #1847 for magento 2.3
Browse files Browse the repository at this point in the history
  • Loading branch information
gonzaloebiz committed Oct 10, 2023
1 parent 1b537c3 commit c5ff022
Show file tree
Hide file tree
Showing 18 changed files with 339 additions and 33 deletions.
6 changes: 5 additions & 1 deletion Block/Subscribe.php
Original file line number Diff line number Diff line change
Expand Up @@ -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]);
}
}
40 changes: 40 additions & 0 deletions Controller/Subscriber/Subscribe.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

namespace Ebizmarts\MailChimp\Controller\Subscriber;

use Magento\Customer\Api\AccountManagementInterface as CustomerAccountManagement;
use Magento\Customer\Model\Session;
use Magento\Customer\Model\Url as CustomerUrl;
use Magento\Framework\App\Action\Context;
use Magento\Framework\App\Action\HttpPostActionInterface;
use Magento\Framework\Validator\EmailAddress as EmailValidator;
use Magento\Newsletter\Controller\Subscriber\NewAction as SubscriberController;
use Magento\Newsletter\Model\SubscriberFactory;
use Magento\Store\Model\StoreManagerInterface;

class Subscribe extends SubscriberController implements HttpPostActionInterface
{
private $session;
public function __construct(
Context $context,
SubscriberFactory $subscriberFactory,
Session $customerSession,
StoreManagerInterface $storeManager,
CustomerUrl $customerUrl,
CustomerAccountManagement $customerAccountManagement,
EmailValidator $emailValidator = null
)
{
$this->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();
}
}
3 changes: 2 additions & 1 deletion Controller/WebHook/Index.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ public function __construct(
\Ebizmarts\MailChimp\Model\MailChimpWebhookRequestFactory $chimpWebhookRequestFactory,
\Magento\Framework\HTTP\PhpEnvironment\RemoteAddress $remoteAddress
) {

parent::__construct($context);
$this->_resultFactory = $context->getResultFactory();
$this->_helper = $helper;
Expand Down Expand Up @@ -111,6 +110,8 @@ public function execute()
$this->_helper->log($request['data']);
$result->setHttpResponseCode(403);
}
} else {
$this->_helper->log("The two way is off");
}
} else {
$this->_helper->log('An empty request comes from ip: '.$this->_remoteAddress->getRemoteAddress());
Expand Down
6 changes: 4 additions & 2 deletions Cron/Webhook.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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)));
Expand Down
22 changes: 17 additions & 5 deletions Helper/Data.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,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';

const GUEST_GROUP = 'NOT LOGGED IN';
Expand Down Expand Up @@ -424,7 +425,7 @@ private function getAddressAtt()
$ret[$item] = [
'attCode' => $item,
'isDate' => false,
'isAddress' => false,
'isAddress' => true,
'options' => []
];
}
Expand Down Expand Up @@ -787,6 +788,14 @@ public function getMergeVarsBySubscriber(\Magento\Newsletter\Model\Subscriber $s
$mergeVars = [];
$storeId = $subscriber->getStoreId();
$webSiteId = $this->getWebsiteId($subscriber->getStoreId());
$webSiteId = $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();
}
Expand All @@ -798,7 +807,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());
Expand Down Expand Up @@ -1035,12 +1044,15 @@ public function deleteWebHook($apikey, $listId)
public function loadListSubscribers($listId, $mail)
{
$collection = null;
$websiteIds = [];
$storeIds = $this->getMagentoStoreIdsByListId($listId);
$storeIds[] = 0;
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;
Expand Down
53 changes: 53 additions & 0 deletions Model/Config/Source/Maps.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?php

namespace Ebizmarts\MailChimp\Model\Config\Source;

use Magento\Framework\Data\OptionSourceInterface;
use Ebizmarts\MailChimp\Helper\Data as MailchimpHelper;
use Magento\Framework\App\RequestInterface;
class Maps implements OptionSourceInterface
{
private $options = null;
public function __construct(
RequestInterface $request,
MailchimpHelper $helper
)
{
$storeId = (int) $request->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;
}
}
34 changes: 12 additions & 22 deletions Model/Plugin/Subscriber.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -99,10 +99,9 @@ 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()) {
Expand Down Expand Up @@ -152,15 +151,16 @@ public function beforeSubscribeCustomerById(
*/
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);
}
$storeId = $this->_storeManager->getStore()->getId();
if ($this->_customerSession->getPhone()) {
$subscriber->setPhone($this->_customerSession->getPhone());
}

if ($this->_helper->isMailChimpEnabled($storeId)) {
$api = $this->_helper->getApi($storeId);
Expand Down Expand Up @@ -201,7 +201,7 @@ 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);
Expand All @@ -228,8 +228,7 @@ 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()) {
Expand All @@ -252,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();
}
}
14 changes: 14 additions & 0 deletions Model/ResourceModel/Newsletter/Collection.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Ebizmarts\MailChimp\Model\ResourceModel\Newsletter;

class Collection extends \Magento\Newsletter\Model\ResourceModel\Subscriber\Collection
{
protected function _initSelect()
{
parent::_initSelect();
$this->showCustomerInfo(true)->addSubscriberTypeField()->showStoreInfo();
$this->_map['fields']['phone'] = 'main_table.phone';
return $this;
}
}
34 changes: 34 additions & 0 deletions Observer/Subscriber/SaveBefore.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

namespace Ebizmarts\MailChimp\Observer\Subscriber;

use Magento\Framework\Event\Observer;
use Magento\Customer\Model\Session;

class SaveBefore implements \Magento\Framework\Event\ObserverInterface
{
/**
* @var Session
*/
private $customerSession;

/**
* @param Session $customerSession
*/
public function __construct(
Session $customerSession
)
{
$this->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;
}
}
12 changes: 12 additions & 0 deletions Setup/UpgradeSchema.php
Original file line number Diff line number Diff line change
Expand Up @@ -753,5 +753,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'
]
);
}
}
}
15 changes: 15 additions & 0 deletions etc/adminhtml/di.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?xml version="1.0"?>
<!--
/**
* Ebizmarts_MailChimp Magento JS component
*
* @category Ebizmarts
* @package Ebizmarts_MailChimp
* @author Ebizmarts Team <[email protected]>
* @copyright Ebizmarts (http://ebizmarts.com)
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Newsletter\Model\ResourceModel\Subscriber\Grid\Collection" type="Ebizmarts\MailChimp\Model\ResourceModel\Newsletter\Collection" />
</config>
Loading

0 comments on commit c5ff022

Please sign in to comment.