123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378 |
- <?php
- /**
- *
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Wishlist\Controller\Index;
- use Magento\Framework\App\Action;
- use Magento\Framework\App\Config\ScopeConfigInterface;
- use Magento\Framework\App\ResponseInterface;
- use Magento\Framework\Exception\NotFoundException;
- use Magento\Framework\Session\Generic as WishlistSession;
- use Magento\Store\Model\StoreManagerInterface;
- use Magento\Framework\Controller\ResultFactory;
- use Magento\Framework\View\Result\Layout as ResultLayout;
- use Magento\Captcha\Helper\Data as CaptchaHelper;
- use Magento\Captcha\Observer\CaptchaStringResolver;
- use Magento\Framework\Controller\Result\Redirect;
- use Magento\Framework\Controller\ResultInterface;
- use Magento\Framework\App\ObjectManager;
- use Magento\Captcha\Model\DefaultModel as CaptchaModel;
- use Magento\Framework\Exception\LocalizedException;
- use Magento\Customer\Model\Customer;
- /**
- * Class Send
- *
- * @package Magento\Wishlist\Controller\Index
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
- class Send extends \Magento\Wishlist\Controller\AbstractIndex implements Action\HttpPostActionInterface
- {
- /**
- * @var \Magento\Customer\Helper\View
- */
- protected $_customerHelperView;
- /**
- * @var \Magento\Framework\Translate\Inline\StateInterface
- */
- protected $inlineTranslation;
- /**
- * @var \Magento\Framework\Mail\Template\TransportBuilder
- */
- protected $_transportBuilder;
- /**
- * @var \Magento\Wishlist\Model\Config
- */
- protected $_wishlistConfig;
- /**
- * @var \Magento\Wishlist\Controller\WishlistProviderInterface
- */
- protected $wishlistProvider;
- /**
- * @var \Magento\Customer\Model\Session
- */
- protected $_customerSession;
- /**
- * @var \Magento\Framework\Data\Form\FormKey\Validator
- */
- protected $_formKeyValidator;
- /**
- * @var WishlistSession
- */
- protected $wishlistSession;
- /**
- * @var ScopeConfigInterface
- */
- protected $scopeConfig;
- /**
- * @var StoreManagerInterface
- */
- protected $storeManager;
- /**
- * @var CaptchaHelper
- */
- private $captchaHelper;
- /**
- * @var CaptchaStringResolver
- */
- private $captchaStringResolver;
- /**
- * @param Action\Context $context
- * @param \Magento\Framework\Data\Form\FormKey\Validator $formKeyValidator
- * @param \Magento\Customer\Model\Session $customerSession
- * @param \Magento\Wishlist\Controller\WishlistProviderInterface $wishlistProvider
- * @param \Magento\Wishlist\Model\Config $wishlistConfig
- * @param \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder
- * @param \Magento\Framework\Translate\Inline\StateInterface $inlineTranslation
- * @param \Magento\Customer\Helper\View $customerHelperView
- * @param WishlistSession $wishlistSession
- * @param ScopeConfigInterface $scopeConfig
- * @param StoreManagerInterface $storeManager
- * @param CaptchaHelper|null $captchaHelper
- * @param CaptchaStringResolver|null $captchaStringResolver
- * @SuppressWarnings(PHPMD.ExcessiveParameterList)
- */
- public function __construct(
- Action\Context $context,
- \Magento\Framework\Data\Form\FormKey\Validator $formKeyValidator,
- \Magento\Customer\Model\Session $customerSession,
- \Magento\Wishlist\Controller\WishlistProviderInterface $wishlistProvider,
- \Magento\Wishlist\Model\Config $wishlistConfig,
- \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder,
- \Magento\Framework\Translate\Inline\StateInterface $inlineTranslation,
- \Magento\Customer\Helper\View $customerHelperView,
- WishlistSession $wishlistSession,
- ScopeConfigInterface $scopeConfig,
- StoreManagerInterface $storeManager,
- ?CaptchaHelper $captchaHelper = null,
- ?CaptchaStringResolver $captchaStringResolver = null
- ) {
- $this->_formKeyValidator = $formKeyValidator;
- $this->_customerSession = $customerSession;
- $this->wishlistProvider = $wishlistProvider;
- $this->_wishlistConfig = $wishlistConfig;
- $this->_transportBuilder = $transportBuilder;
- $this->inlineTranslation = $inlineTranslation;
- $this->_customerHelperView = $customerHelperView;
- $this->wishlistSession = $wishlistSession;
- $this->scopeConfig = $scopeConfig;
- $this->storeManager = $storeManager;
- $this->captchaHelper = $captchaHelper ?: ObjectManager::getInstance()->get(CaptchaHelper::class);
- $this->captchaStringResolver = $captchaStringResolver ?
- : ObjectManager::getInstance()->get(CaptchaStringResolver::class);
- parent::__construct($context);
- }
- /**
- * Share wishlist
- *
- * @return \Magento\Framework\Controller\Result\Redirect
- * @throws NotFoundException
- * @throws \Zend_Validate_Exception
- * @SuppressWarnings(PHPMD.CyclomaticComplexity)
- * @SuppressWarnings(PHPMD.NPathComplexity)
- * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
- */
- public function execute()
- {
- /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */
- $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
- $captchaForName = 'share_wishlist_form';
- /** @var CaptchaModel $captchaModel */
- $captchaModel = $this->captchaHelper->getCaptcha($captchaForName);
- if (!$this->_formKeyValidator->validate($this->getRequest())) {
- $resultRedirect->setPath('*/*/');
- return $resultRedirect;
- }
- $isCorrectCaptcha = $this->validateCaptcha($captchaModel, $captchaForName);
- $this->logCaptchaAttempt($captchaModel);
- if (!$isCorrectCaptcha) {
- $this->messageManager->addErrorMessage(__('Incorrect CAPTCHA'));
- $resultRedirect->setPath('*/*/share');
- return $resultRedirect;
- }
- $wishlist = $this->wishlistProvider->getWishlist();
- if (!$wishlist) {
- throw new NotFoundException(__('Page not found.'));
- }
- $sharingLimit = $this->_wishlistConfig->getSharingEmailLimit();
- $textLimit = $this->_wishlistConfig->getSharingTextLimit();
- $emailsLeft = $sharingLimit - $wishlist->getShared();
- $emails = $this->getRequest()->getPost('emails');
- $emails = empty($emails) ? $emails : explode(',', $emails);
- $error = false;
- $message = (string)$this->getRequest()->getPost('message');
- if (strlen($message) > $textLimit) {
- $error = __('Message length must not exceed %1 symbols', $textLimit);
- } else {
- $message = nl2br(htmlspecialchars($message));
- if (empty($emails)) {
- $error = __('Please enter an email address.');
- } else {
- if (count($emails) > $emailsLeft) {
- $error = __('This wish list can be shared %1 more times.', $emailsLeft);
- } else {
- foreach ($emails as $index => $email) {
- $email = trim($email);
- if (!\Zend_Validate::is($email, \Magento\Framework\Validator\EmailAddress::class)) {
- $error = __('Please enter a valid email address.');
- break;
- }
- $emails[$index] = $email;
- }
- }
- }
- }
- if ($error) {
- $this->messageManager->addError($error);
- $this->wishlistSession->setSharingForm($this->getRequest()->getPostValue());
- $resultRedirect->setPath('*/*/share');
- return $resultRedirect;
- }
- /** @var \Magento\Framework\View\Result\Layout $resultLayout */
- $resultLayout = $this->resultFactory->create(ResultFactory::TYPE_LAYOUT);
- $this->addLayoutHandles($resultLayout);
- $this->inlineTranslation->suspend();
- $sent = 0;
- try {
- $customer = $this->_customerSession->getCustomerDataObject();
- $customerName = $this->_customerHelperView->getCustomerName($customer);
- $message .= $this->getRssLink($wishlist->getId(), $resultLayout);
- $emails = array_unique($emails);
- $sharingCode = $wishlist->getSharingCode();
- try {
- foreach ($emails as $email) {
- $transport = $this->_transportBuilder->setTemplateIdentifier(
- $this->scopeConfig->getValue(
- 'wishlist/email/email_template',
- \Magento\Store\Model\ScopeInterface::SCOPE_STORE
- )
- )->setTemplateOptions(
- [
- 'area' => \Magento\Framework\App\Area::AREA_FRONTEND,
- 'store' => $this->storeManager->getStore()->getStoreId(),
- ]
- )->setTemplateVars(
- [
- 'customer' => $customer,
- 'customerName' => $customerName,
- 'salable' => $wishlist->isSalable() ? 'yes' : '',
- 'items' => $this->getWishlistItems($resultLayout),
- 'viewOnSiteLink' => $this->_url->getUrl('*/shared/index', ['code' => $sharingCode]),
- 'message' => $message,
- 'store' => $this->storeManager->getStore(),
- ]
- )->setFrom(
- $this->scopeConfig->getValue(
- 'wishlist/email/email_identity',
- \Magento\Store\Model\ScopeInterface::SCOPE_STORE
- )
- )->addTo(
- $email
- )->getTransport();
- $transport->sendMessage();
- $sent++;
- }
- } catch (\Exception $e) {
- $wishlist->setShared($wishlist->getShared() + $sent);
- $wishlist->save();
- throw $e;
- }
- $wishlist->setShared($wishlist->getShared() + $sent);
- $wishlist->save();
- $this->inlineTranslation->resume();
- $this->_eventManager->dispatch('wishlist_share', ['wishlist' => $wishlist]);
- $this->messageManager->addSuccess(__('Your wish list has been shared.'));
- $resultRedirect->setPath('*/*', ['wishlist_id' => $wishlist->getId()]);
- return $resultRedirect;
- } catch (\Exception $e) {
- $this->inlineTranslation->resume();
- $this->messageManager->addError($e->getMessage());
- $this->wishlistSession->setSharingForm($this->getRequest()->getPostValue());
- $resultRedirect->setPath('*/*/share');
- return $resultRedirect;
- }
- }
- /**
- * Prepare to load additional email blocks
- *
- * Add 'wishlist_email_rss' layout handle.
- * Add 'wishlist_email_items' layout handle.
- *
- * @param \Magento\Framework\View\Result\Layout $resultLayout
- * @return void
- */
- protected function addLayoutHandles(ResultLayout $resultLayout)
- {
- if ($this->getRequest()->getParam('rss_url')) {
- $resultLayout->addHandle('wishlist_email_rss');
- }
- $resultLayout->addHandle('wishlist_email_items');
- }
- /**
- * Retrieve RSS link content (html)
- *
- * @param int $wishlistId
- * @param \Magento\Framework\View\Result\Layout $resultLayout
- * @return mixed
- */
- protected function getRssLink($wishlistId, ResultLayout $resultLayout)
- {
- if ($this->getRequest()->getParam('rss_url')) {
- return $resultLayout->getLayout()
- ->getBlock('wishlist.email.rss')
- ->setWishlistId($wishlistId)
- ->toHtml();
- }
- }
- /**
- * Retrieve wishlist items content (html)
- *
- * @param \Magento\Framework\View\Result\Layout $resultLayout
- * @return string
- */
- protected function getWishlistItems(ResultLayout $resultLayout)
- {
- return $resultLayout->getLayout()
- ->getBlock('wishlist.email.items')
- ->toHtml();
- }
- /**
- * Log customer action attempts
- *
- * @param CaptchaModel $captchaModel
- * @return void
- */
- private function logCaptchaAttempt(CaptchaModel $captchaModel): void
- {
- /** @var Customer $customer */
- $customer = $this->_customerSession->getCustomer();
- $email = '';
- if ($customer->getId()) {
- $email = $customer->getEmail();
- }
- $captchaModel->logAttempt($email);
- }
- /**
- * Captcha validate logic
- *
- * @param CaptchaModel $captchaModel
- * @param string $captchaFormName
- * @return bool
- */
- private function validateCaptcha(CaptchaModel $captchaModel, string $captchaFormName) : bool
- {
- if ($captchaModel->isRequired()) {
- $word = $this->captchaStringResolver->resolve(
- $this->getRequest(),
- $captchaFormName
- );
- if (!$captchaModel->isCorrect($word)) {
- return false;
- }
- }
- return true;
- }
- }
|