diff --git a/Block/Js.php b/Block/Js.php deleted file mode 100644 index 686e944..0000000 --- a/Block/Js.php +++ /dev/null @@ -1,53 +0,0 @@ -) - * @license - * @Author: magepow - * @github: - */ - -namespace Magepow\AjaxCompare\Block; - -use Magento\Framework\View\Element\Template\Context; -use Magepow\AjaxCompare\Helper\Data; - - -class Js extends \Magento\Framework\View\Element\Template -{ - - /** - * @var string - */ - protected $_template = 'js/main.phtml'; - - /** - * @var Data - */ - protected $_ajaxCompareHelper; - - /** - * Js constructor. - * @param Context $context - * @param Data $ajaxCompareHelper - * @param array $data - */ - public function __construct( - Context $context, - Data $ajaxCompareHelper, - array $data = [] - ) { - parent::__construct($context, $data); - $this->_ajaxCompareHelper = $ajaxCompareHelper; - } - - /** - * @return string - */ - public function getAjaxCompareInitOptions() - { - return $this->_ajaxCompareHelper->getAjaxCompareInitOptions(); - } -} \ No newline at end of file diff --git a/Block/Message.php b/Block/Message.php deleted file mode 100644 index 4bcbce4..0000000 --- a/Block/Message.php +++ /dev/null @@ -1,53 +0,0 @@ -) - * @license - * @Author: magepow - * @github: - */ - -namespace Magepow\AjaxCompare\Block; - -/** - * Class Message - * @package Magepow\AjaxCompare\Block - */ -class Message extends \Magento\Framework\View\Element\Template -{ - /** - * @var \Magepow\AjaxCompare\Helper\Data - */ - protected $_ajaxCompareHelper; - - /** - * Message constructor. - * @param \Magento\Framework\View\Element\Template\Context $context - * @param \Magepow\AjaxCompare\Helper\Data $_ajaxCompareHelper - * @param array $data - */ - public function __construct( - \Magento\Framework\View\Element\Template\Context $context, - \Magepow\AjaxCompare\Helper\Data $_ajaxCompareHelper, - array $data - ) { - parent::__construct($context, $data); - $this->_ajaxCompareHelper = $_ajaxCompareHelper; - } - - /** - * @return mixed|string - */ - public function getMessage() - { - $message = $this->_ajaxCompareHelper->getConfig('magepow_ajaxcompare/general/message'); - if (!$message) { - $message = __('You added this product to the comparison list'); - } - return $message; - } - - -} \ No newline at end of file diff --git a/Helper/Data.php b/Helper/Data.php index ca6a264..5263d1a 100644 --- a/Helper/Data.php +++ b/Helper/Data.php @@ -23,131 +23,62 @@ * Class Data * @package Magepow\AjaxCompare\Helper */ + class Data extends \Magento\Framework\App\Helper\AbstractHelper { /** - * @var Registry + * @var array */ - protected $_coreRegistry; + protected $configModule; /** - * @var StoreManagerInterface + * @var \Magento\Framework\Module\Manager */ - protected $_storeManager; + protected $moduleManager; - /** - * @var CustomerSession - */ - protected $_customerSession; - - /** - * @var LayoutFactory - */ - protected $_layoutFactory; - - /** - * @var EncoderInterface - */ - protected $_jsonEncoder; - - /** - * @var DecoderInterface - */ - protected $_jsonDecoder; - - - /** - * Data constructor. - * @param Context $context - * @param StoreManagerInterface $storeManager - * @param Registry $coreRegistry - * @param CustomerSession $customerSession - * @param LayoutFactory $layoutFactory - * @param EncoderInterface $jsonEncoder - * @param DecoderInterface $jsonDecoder - */ public function __construct( - Context $context, - StoreManagerInterface $storeManager, - Registry $coreRegistry, - CustomerSession $customerSession, - LayoutFactory $layoutFactory, - EncoderInterface $jsonEncoder, - DecoderInterface $jsonDecoder - ) { + \Magento\Framework\App\Helper\Context $context, + \Magento\Framework\Module\Manager $moduleManager + ) + { parent::__construct($context); - $this->_storeManager = $storeManager; - $this->_coreRegistry = $coreRegistry; - $this->_customerSession = $customerSession; - $this->_layoutFactory = $layoutFactory; - $this->_jsonEncoder = $jsonEncoder; - $this->_jsonDecoder = $jsonDecoder; - + $this->moduleManager = $moduleManager; + $this->configModule = $this->getConfig(strtolower($this->_getModuleName())); } - - public function getConfig($cfg='') + + public function getConfig($cfg='') { if($cfg) return $this->scopeConfig->getValue( $cfg, \Magento\Store\Model\ScopeInterface::SCOPE_STORE ); return $this->scopeConfig; } - /** - * @return string - */ - public function getAjaxCompareInitOptions() - { - $options = [ - 'ajaxCompare' => [ - 'enabled' => $this->isEnabledAjaxCompare(), - 'ajaxCompareUrl' => $this->_getUrl('catalog/product_compare/add'), - 'popupTTL' => $this->getConfig("magepow_ajaxcompare/general/popupttl"), - 'showLoader' => (bool) $this->getConfig('magepow_ajaxcompare/general/loader'), - ], - ]; - - return $this->_jsonEncoder->encode($options); - } - - /** - * @return bool - */ - public function isEnabledAjaxCompare() + public function getConfigModule($cfg='', $value=null) { - return (bool)$this->getConfig('magepow_ajaxcompare/general/enabled'); + $values = $this->configModule; + if( !$cfg ) return $values; + $config = explode('/', $cfg); + $end = count($config) - 1; + foreach ($config as $key => $vl) { + if( isset($values[$vl]) ){ + if( $key == $end ) { + $value = $values[$vl]; + }else { + $values = $values[$vl]; + } + } + + } + return $value; } - /** - * @return string - * @throws \Magento\Framework\Exception\LocalizedException - */ - public function getSuccessHtml() + public function isEnabledModule($moduleName) { - $layout = $this->_layoutFactory->create(['cacheable' => false]); - $layout->getUpdate()->addHandle('ajaxcompare_success_message')->load(); - $layout->generateXml(); - $layout->generateElements(); - $result = $layout->getOutput(); - $layout->__destruct(); - return $result; + return $this->moduleManager->isEnabled($moduleName); } - /** - * @return string - * @throws \Magento\Framework\Exception\LocalizedException - */ - public function getErrorHtml() + public function getModuleName() { - $layout = $this->_layoutFactory->create(['cacheable' => false]); - $layout->getUpdate()->addHandle('ajaxcompare_error_message')->load(); - $layout->generateXml(); - $layout->generateElements(); - $result = $layout->getOutput(); - $layout->__destruct(); - return $result; + return $this->_getModuleName(); } - public function getBaseUrlMedia() - { - return $this->_storeManager->getStore()->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA); - } -} +} \ No newline at end of file diff --git a/Plugin/Controller/Product/Compare/Add.php b/Plugin/Controller/Product/Compare/Add.php index 8b400f6..7e3a237 100644 --- a/Plugin/Controller/Product/Compare/Add.php +++ b/Plugin/Controller/Product/Compare/Add.php @@ -12,141 +12,57 @@ namespace Magepow\AjaxCompare\Plugin\Controller\Product\Compare; use Magento\Catalog\Api\ProductRepositoryInterface; -use Magento\Framework\Data\Form\FormKey\Validator; -use Magento\Framework\Exception\NoSuchEntityException; -use Magento\Framework\Json\Helper\Data; -use Magento\Framework\Registry; -use Magento\Framework\View\Result\PageFactory; -use Magento\Store\Model\StoreManagerInterface; -use Magento\Framework\App\Action\HttpPostActionInterface as HttpPostActionInterface; use Magento\Framework\Controller\ResultFactory; /** * Class Add * @package Magepow\AjaxCompare\Plugin\Controller\Product\Compare */ -class Add extends \Magento\Catalog\Controller\Product\Compare\Add implements HttpPostActionInterface +class Add extends \Magento\Catalog\Controller\Product\Compare\Add { - /** - * @var null - */ - protected $_coreRegistry = null; - - /** - * @var AjaxgroupData Data - */ - protected $_ajaxCompareHelper; - - /** - * @var \Magento\Framework\Json\Helper\Data - */ - protected $_jsonEncode; - - /** - * @var \Magento\Framework\Controller\Result\RedirectFactory - */ - protected $_resultRedirectFactory; - - /** - * Add constructor. - * @param \Magento\Framework\App\Action\Context $context - * @param \Magento\Catalog\Model\Product\Compare\ItemFactory $compareItemFactory - * @param \Magento\Catalog\Model\ResourceModel\Product\Compare\Item\CollectionFactory $itemCollectionFactory - * @param \Magento\Customer\Model\Session $customerSession - * @param \Magento\Customer\Model\Visitor $customerVisitor - * @param \Magento\Catalog\Model\Product\Compare\ListCompare $catalogProductCompareList - * @param \Magento\Catalog\Model\Session $catalogSession - * @param StoreManagerInterface $storeManager - * @param Validator $formKeyValidator - * @param PageFactory $resultPageFactory - * @param ProductRepositoryInterface $productRepository - * @param Registry $registry - * @param Data $jsonEncode - * @param \Magento\Framework\Controller\Result\RedirectFactory $redirectFactory - * @param \Magepow\AjaxCompare\Helper\Data $ajaxCompareHelper - */ - public function __construct(\Magento\Framework\App\Action\Context $context, - \Magento\Catalog\Model\Product\Compare\ItemFactory $compareItemFactory, - \Magento\Catalog\Model\ResourceModel\Product\Compare\Item\CollectionFactory $itemCollectionFactory, - \Magento\Customer\Model\Session $customerSession, - \Magento\Customer\Model\Visitor $customerVisitor, - \Magento\Catalog\Model\Product\Compare\ListCompare $catalogProductCompareList, - \Magento\Catalog\Model\Session $catalogSession, - \Magento\Store\Model\StoreManagerInterface $storeManager, - Validator $formKeyValidator, - PageFactory $resultPageFactory, - ProductRepositoryInterface $productRepository, - Registry $registry, - Data $jsonEncode, - \Magento\Framework\Controller\Result\RedirectFactory $redirectFactory, - \Magepow\AjaxCompare\Helper\Data $ajaxCompareHelper) - { - parent::__construct($context, $compareItemFactory, $itemCollectionFactory, $customerSession, $customerVisitor, $catalogProductCompareList, $catalogSession, $storeManager, $formKeyValidator, $resultPageFactory, $productRepository); - $this->_resultRedirectFactory = $redirectFactory; - $this->_coreRegistry = $registry; - $this->_jsonEncode = $jsonEncode; - $this->_ajaxCompareHelper = $ajaxCompareHelper; - } /** * Init popup ajax compare * * @param \Magento\Catalog\Controller\Product\Compare\Add $subject - * @param $proceed + * @param $result * @return \Magento\Framework\Controller\Result\Redirect * @throws NoSuchEntityException */ - public function aroundExecute(\Magento\Catalog\Controller\Product\Compare\Add $subject, $proceed) + public function afterExecute(\Magento\Catalog\Controller\Product\Compare\Add $subject, $result) { - $result = []; - $params = $subject->getRequest()->getParams(); - $productId = (int)$subject->getRequest()->getParam('product'); - if (!empty($params['isCompare'])) { - if ($productId && ($this->_customerVisitor->getId() || $this->_customerSession->isLoggedIn())) { - $storeId = $this->_storeManager->getStore()->getId(); - try { - $product = $this->productRepository->getById($productId, false, $storeId); - } catch (NoSuchEntityException $e) { - $product = null; - } - - if ($product) { - $this->_catalogProductCompareList->addProduct($product); - $this->_eventManager->dispatch('catalog_product_compare_add_product', ['product' => $product]); - $this->_coreRegistry->register('product', $product); - $this->_coreRegistry->register('current_product', $product); + if ($subject->getRequest()->isAjax()) { + $this->_view->loadLayout(); + $productId = (int)$this->getRequest()->getParam('product'); + $storeId = $this->_storeManager->getStore()->getId(); + try { + /** @var \Magento\Catalog\Model\Product $product */ + $product = $this->productRepository->getById($productId, false, $storeId); + } catch (NoSuchEntityException $e) { + $product = null; + } - $htmlPopup = $this->_ajaxCompareHelper->getSuccessHtml(); - $result['success'] = true; - $result['html_popup'] = $htmlPopup; - $subject->getResponse()->representJson($this->_jsonEncode->jsonEncode($result)); - } + if ($product) { + $this->_catalogProductCompareList->addProduct($product); + $this->_eventManager->dispatch('catalog_product_compare_add_product', ['product' => $product]); + $response = []; + $popup = $this->_view->getLayout()->createBlock('Magento\Catalog\Block\Product\AbstractProduct') + ->setData('product', $product) + ->setTemplate('Magepow_AjaxCompare::popup.phtml') + ->toHtml(); + $response['success'] = true; + $response['popup'] = $popup; + $resultJson = $this->resultFactory->create(ResultFactory::TYPE_JSON); + $resultJson->setData($response); $this->_objectManager->get(\Magento\Catalog\Helper\Product\Compare::class)->calculate(); + return $resultJson; } + return false; } - if (!$this->_ajaxCompareHelper->isEnabledAjaxCompare()) { - return $proceed(); - } - } - /** - * @param $productId - * @return bool|\Magento\Catalog\Api\Data\ProductInterface - * @throws NoSuchEntityException - */ - protected function _initProduct($productId) - { - if ($productId) { - $storeId = $this->_storeManager->getStore()->getId(); - try { - $product = $this->_productRepository->getById($productId, false, $storeId); + return $result; - return $product; - } catch (NoSuchEntityException $e) { - return false; - } - } - return false; } + } diff --git a/view/frontend/layout/ajaxcompare_error_message.xml b/view/frontend/layout/ajaxcompare_error_message.xml deleted file mode 100644 index b0b019d..0000000 --- a/view/frontend/layout/ajaxcompare_error_message.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - diff --git a/view/frontend/layout/ajaxcompare_success_message.xml b/view/frontend/layout/ajaxcompare_success_message.xml deleted file mode 100644 index 1fd8714..0000000 --- a/view/frontend/layout/ajaxcompare_success_message.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - diff --git a/view/frontend/layout/default.xml b/view/frontend/layout/default.xml index e0f2dc3..b7cfbc0 100644 --- a/view/frontend/layout/default.xml +++ b/view/frontend/layout/default.xml @@ -13,8 +13,8 @@ - - + + diff --git a/view/frontend/templates/error_message.phtml b/view/frontend/templates/error_message.phtml deleted file mode 100644 index dda2b2d..0000000 --- a/view/frontend/templates/error_message.phtml +++ /dev/null @@ -1,37 +0,0 @@ -) - * @license - * @Author: magepow - * @github: - */ -?> - - -
-

- -

- -
- - -
-
diff --git a/view/frontend/templates/js/main.phtml b/view/frontend/templates/js.phtml similarity index 52% rename from view/frontend/templates/js/main.phtml rename to view/frontend/templates/js.phtml index 862d285..6fe3c64 100644 --- a/view/frontend/templates/js/main.phtml +++ b/view/frontend/templates/js.phtml @@ -12,12 +12,17 @@ * @var \Magepow\AjaxCompare\Block\Js $block */ ?> - +helper('Magepow\AjaxCompare\Helper\Data'); +if(!$helper->getConfigModule('general/enabled')) return; +?> \ No newline at end of file diff --git a/view/frontend/templates/message.phtml b/view/frontend/templates/message.phtml deleted file mode 100644 index 410c104..0000000 --- a/view/frontend/templates/message.phtml +++ /dev/null @@ -1,18 +0,0 @@ -) - * @license - * @Author: magepow - * @github: - */ - -$message = $block->getMessage(); -if (!$message) { - $message = __('You added this product to the comparison list'); -} -?> - -

\ No newline at end of file diff --git a/view/frontend/templates/success_message.phtml b/view/frontend/templates/popup.phtml similarity index 57% rename from view/frontend/templates/success_message.phtml rename to view/frontend/templates/popup.phtml index 895f695..cb6076b 100644 --- a/view/frontend/templates/success_message.phtml +++ b/view/frontend/templates/popup.phtml @@ -9,27 +9,31 @@ * @github: */ /** - * @var \Magento\Catalog\Block\Product\View $block + * @var \Magento\Catalog\Block\Product\AbstractProduct $block */ ?> helper('Magepow\AjaxCompare\Helper\Data'); -$_product = $block->getProduct(); +if(!$helper->getConfigModule('general/enabled')) return; +$_product = $block->getProduct(); +$imageDisplayArea = 'category_page_grid'; +$productImage = $block->getImage($_product, $imageDisplayArea); +$message = $helper->getConfigModule('general/message'); ?>
- <?php echo $_product->getName() ?> -

getName() ?>

+ + toHtml() ?> + +

getName() ?>

- - getChildHtml('ajaxcompare.message'); ?> - +

-
diff --git a/view/frontend/web/js/ajax-compare.js b/view/frontend/web/js/ajax-compare.js index 3a8ad8d..6b1a968 100644 --- a/view/frontend/web/js/ajax-compare.js +++ b/view/frontend/web/js/ajax-compare.js @@ -3,7 +3,6 @@ define([ 'Magento_Ui/js/modal/modal', 'mage/translate', 'jquery/ui', - 'mage/validation/validation', ], function ($, modal, $t) { 'use strict'; @@ -13,38 +12,34 @@ define([ popupWrapperSelector: '#mgp-compare-popup-wrapper', popupBlankSelector: '#mgp-compare-blank', closePopupModal: '.action-close', - ajaxCompare: { - processStart: 'processStart', - processStop: 'processStop', - enabled: null, - ajaxCompareUrl: null, - compareBtnSelector: 'a.tocompare', - btnCloseSelector: '#ajaxcompare_btn_close_popup', - showLoader: null - } + processStart: 'processStart', + processStop : 'processStop', + ajaxCompareUrl: null, + addToCompareButtonSelector: '.tocompare', + addToCompareButtonDisabledClass: 'disabled', + addToCompareButtonTextWhileAdding: '', + addToCompareButtonTextAdded: '', + addToCompareButtonTextDefault: '', + btnCloseSelector: '#ajaxcompare_btn_close_popup', + showLoader: false }, _create: function () { - this._bind(); - }, - - - _bind: function () { - if (this.options.ajaxCompare.enabled == true) this.initEvents(); - + var self = this; + self._init(); + $('body').on('contentUpdated', function () { + self._init(); + }); }, - isLoaderEnabled: function () { - return (this.options.ajaxCompare.processStart && this.options.ajaxCompare.processStop); - }, autoClosePopup: function (wrapper) { var self = this; - var ajaxcompare_autoclose_countdown = setInterval(function (wrapper) { + var autocloseCountdown = setInterval(function (wrapper) { var leftTimeNode = $('body').find('#ajaxcompare_btn_close_popup .compare-autoclose-countdown'); var leftTime = parseInt(leftTimeNode.text()) - 1; leftTimeNode.text(leftTime); if (leftTime == 0) { - clearInterval(ajaxcompare_autoclose_countdown); + clearInterval(autocloseCountdown); self.closePopup(); } }, 1000); @@ -56,18 +51,16 @@ define([ $(this.options.closePopupModal).trigger('click'); }, - initEvents: function () { + _init: function () { var self = this; - $('body').on('click', self.options.ajaxCompare.btnCloseSelector, function (e) { + $('body').on('click', self.options.btnCloseSelector, function (e) { self.closePopup(); }); - $('body').on('click', this.options.ajaxCompare.compareBtnSelector, function (e) { + self.element.find(self.options.addToCompareButtonSelector).off('click').click(function(e) { e.preventDefault(); e.stopPropagation(); - var params = $(this).data('post').data; - params['isCompare'] = true; - self.addCompare(params); + self.addCompare($(this)); }); }, @@ -89,28 +82,29 @@ define([ comparePopup.modal('openModal'); }, - addCompare: function (params) { + addCompare: function (el) { var self = this, comparePopup = $(self.options.popupWrapperSelector), - body = $('body'); + body = $('body'), + parent = el.parent(), + post = el.data('post'); + var params = post.data; + if(parent.hasClass(self.options.addToCompareButtonDisabledClass)) return; $.ajax({ - url: self.options.ajaxCompare.ajaxCompareUrl, + url: post.action, data: params, type: 'POST', dataType: 'json', - showLoader: self.options.ajaxCompare.showLoader, + showLoader: self.options.showLoader, beforeSend: function () { - if (self.options.ajaxCompare.showLoader && self.isLoaderEnabled()) { - body.trigger(self.options.ajaxCompare.processStart); - } + self.disableAddToCompareButton(parent); + if (self.options.showLoader) body.trigger(self.options.processStart); }, success: function (res) { - if (self.options.ajaxCompare.showLoader && self.isLoaderEnabled()) { - body.trigger(self.options.ajaxCompare.processStop); - } - if (res.html_popup) { + if (self.options.showLoader) body.trigger(self.options.processStop); + if (res.popup) { if (!comparePopup.length) { - body.append('
'+res.html_popup+'
'); + body.append('
'+res.popup+'
'); } self.showPopup(); self.autoClosePopup(self.options.popupWrapperSelector); @@ -118,8 +112,43 @@ define([ alert($t('No response from server')); } } + }).done(function(){ + self.enableAddToCompareButton(parent); }); }, + + /** + * @param {String} form + */ + disableAddToCompareButton: function (form) { + var addToCompareButtonTextWhileAdding = this.options.addToCompareButtonTextWhileAdding || $t('Adding...'), + addToCompareButton = $(form).find(this.options.addToCompareButtonSelector); + + addToCompareButton.addClass(this.options.addToCompareButtonDisabledClass); + addToCompareButton.find('span').text(addToCompareButtonTextWhileAdding); + addToCompareButton.attr('title', addToCompareButtonTextWhileAdding); + }, + + /** + * @param {String} form + */ + enableAddToCompareButton: function (form) { + var addToCompareButtonTextAdded = this.options.addToCompareButtonTextAdded || $t('Added'), + self = this, + addToCompareButton = $(form).find(this.options.addToCompareButtonSelector); + + addToCompareButton.find('span').text(addToCompareButtonTextAdded); + addToCompareButton.attr('title', addToCompareButtonTextAdded); + + setTimeout(function () { + var addToCompareButtonTextDefault = self.options.addToCompareButtonTextDefault || $t('Add to Compare'); + + addToCompareButton.removeClass(self.options.addToCompareButtonDisabledClass); + addToCompareButton.find('span').text(addToCompareButtonTextDefault); + addToCompareButton.attr('title', addToCompareButtonTextDefault); + }, 1000); + } + }); return $.magepow.ajaxCompare;