123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Newsletter\Model\Plugin;
- use Magento\Customer\Api\CustomerRepositoryInterface as CustomerRepository;
- use Magento\Customer\Api\Data\CustomerInterface;
- use Magento\Newsletter\Model\SubscriberFactory;
- use Magento\Framework\Api\ExtensionAttributesFactory;
- use Magento\Newsletter\Model\ResourceModel\Subscriber;
- use Magento\Customer\Api\Data\CustomerExtensionInterface;
- /**
- * Newsletter Plugin for customer
- */
- class CustomerPlugin
- {
- /**
- * Factory used for manipulating newsletter subscriptions
- *
- * @var SubscriberFactory
- */
- private $subscriberFactory;
- /**
- * @var ExtensionAttributesFactory
- */
- private $extensionFactory;
- /**
- * @var Subscriber
- */
- private $subscriberResource;
- /**
- * @var array
- */
- private $customerSubscriptionStatus = [];
- /**
- * Initialize dependencies.
- *
- * @param SubscriberFactory $subscriberFactory
- * @param ExtensionAttributesFactory $extensionFactory
- * @param Subscriber $subscriberResource
- */
- public function __construct(
- SubscriberFactory $subscriberFactory,
- ExtensionAttributesFactory $extensionFactory,
- Subscriber $subscriberResource
- ) {
- $this->subscriberFactory = $subscriberFactory;
- $this->extensionFactory = $extensionFactory;
- $this->subscriberResource = $subscriberResource;
- }
- /**
- * Plugin after create customer that updates any newsletter subscription that may have existed.
- *
- * If we have extension attribute (is_subscribed) we need to subscribe that customer
- *
- * @param CustomerRepository $subject
- * @param CustomerInterface $result
- * @param CustomerInterface $customer
- * @return CustomerInterface
- * @SuppressWarnings(PHPMD.UnusedFormalParameter)
- */
- public function afterSave(CustomerRepository $subject, CustomerInterface $result, CustomerInterface $customer)
- {
- $resultId = $result->getId();
- /** @var \Magento\Newsletter\Model\Subscriber $subscriber */
- $subscriber = $this->subscriberFactory->create();
- $subscriber->updateSubscription($resultId);
- // update the result only if the original customer instance had different value.
- $initialExtensionAttributes = $result->getExtensionAttributes();
- if ($initialExtensionAttributes === null) {
- /** @var CustomerExtensionInterface $initialExtensionAttributes */
- $initialExtensionAttributes = $this->extensionFactory->create(CustomerInterface::class);
- $result->setExtensionAttributes($initialExtensionAttributes);
- }
- $newExtensionAttributes = $customer->getExtensionAttributes();
- if ($newExtensionAttributes
- && $initialExtensionAttributes->getIsSubscribed() !== $newExtensionAttributes->getIsSubscribed()
- ) {
- if ($newExtensionAttributes->getIsSubscribed()) {
- $subscriber->subscribeCustomerById($resultId);
- } else {
- $subscriber->unsubscribeCustomerById($resultId);
- }
- }
- $isSubscribed = $subscriber->isSubscribed();
- $this->customerSubscriptionStatus[$resultId] = $isSubscribed;
- $initialExtensionAttributes->setIsSubscribed($isSubscribed);
- return $result;
- }
- /**
- * Plugin around delete customer that updates any newsletter subscription that may have existed.
- *
- * @param CustomerRepository $subject
- * @param callable $deleteCustomerById Function we are wrapping around
- * @param int $customerId Input to the function
- * @return bool
- */
- public function aroundDeleteById(
- CustomerRepository $subject,
- callable $deleteCustomerById,
- $customerId
- ) {
- $customer = $subject->getById($customerId);
- $result = $deleteCustomerById($customerId);
- /** @var \Magento\Newsletter\Model\Subscriber $subscriber */
- $subscriber = $this->subscriberFactory->create();
- $subscriber->loadByEmail($customer->getEmail());
- if ($subscriber->getId()) {
- $subscriber->delete();
- }
- return $result;
- }
- /**
- * Plugin after delete customer that updates any newsletter subscription that may have existed.
- *
- * @param CustomerRepository $subject
- * @param bool $result
- * @param CustomerInterface $customer
- * @return bool
- * @SuppressWarnings(PHPMD.UnusedFormalParameter)
- */
- public function afterDelete(CustomerRepository $subject, $result, CustomerInterface $customer)
- {
- $subscriber = $this->subscriberFactory->create();
- $subscriber->loadByEmail($customer->getEmail());
- if ($subscriber->getId()) {
- $subscriber->delete();
- }
- return $result;
- }
- /**
- * Plugin after getById customer that obtains newsletter subscription status for given customer.
- *
- * @param CustomerRepository $subject
- * @param CustomerInterface $customer
- * @return CustomerInterface
- * @SuppressWarnings(PHPMD.UnusedFormalParameter)
- */
- public function afterGetById(CustomerRepository $subject, CustomerInterface $customer)
- {
- $extensionAttributes = $customer->getExtensionAttributes();
- if ($extensionAttributes === null) {
- /** @var CustomerExtensionInterface $extensionAttributes */
- $extensionAttributes = $this->extensionFactory->create(CustomerInterface::class);
- $customer->setExtensionAttributes($extensionAttributes);
- }
- if ($extensionAttributes->getIsSubscribed() === null) {
- $isSubscribed = $this->isSubscribed($customer);
- $extensionAttributes->setIsSubscribed($isSubscribed);
- }
- return $customer;
- }
- /**
- * This method returns newsletters subscription status for given customer.
- *
- * @param CustomerInterface $customer
- * @return bool
- */
- private function isSubscribed(CustomerInterface $customer)
- {
- $customerId = $customer->getId();
- if (!isset($this->customerSubscriptionStatus[$customerId])) {
- $subscriber = $this->subscriberResource->loadByCustomerData($customer);
- $this->customerSubscriptionStatus[$customerId] = isset($subscriber['subscriber_status'])
- && $subscriber['subscriber_status'] == 1;
- }
- return $this->customerSubscriptionStatus[$customerId];
- }
- }
|