diff --git a/src/Block/Frontend/DaemonCollector.php b/src/Block/Frontend/DaemonCollector.php new file mode 100644 index 0000000..27f45d5 --- /dev/null +++ b/src/Block/Frontend/DaemonCollector.php @@ -0,0 +1,89 @@ + + (function(_,r,e,t,a,i,l){_['retailCRMObject']=a;_[a]=_[a]||function(){(_[a].q=_[a].q||[]).push(arguments)};_[a].l=1*new Date();l=r.getElementsByTagName(e)[0];i=r.createElement(e);i.async=!0;i.src=t;l.parentNode.insertBefore(i,l)})(window,document,'script','https://collector.retailcrm.pro/w.js','_rc'); + {{ code }} + _rc('send', 'pageView'); + +EOT; + + /** + * DaemonCollector constructor. + * + * @param \Magento\Framework\View\Element\Template\Context $context + * @param \Magento\Customer\Model\Session $customerSession + * @param \Magento\Store\Model\StoreManagerInterface $storeManager + * @param \Magento\Store\Api\StoreResolverInterface $storeResolver + * @param \Retailcrm\Retailcrm\Helper\Data $helper + * @param array $data + */ + public function __construct( + \Magento\Framework\View\Element\Template\Context $context, + \Magento\Customer\Model\Session $customerSession, + \Magento\Store\Model\StoreManagerInterface $storeManager, + \Magento\Store\Api\StoreResolverInterface $storeResolver, + \Retailcrm\Retailcrm\Helper\Data $helper, + array $data = [] + ) { + parent::__construct($context, $data); + $this->customer = $customerSession->getCustomer(); + $this->storeManager = $storeManager; + $this->storeResolver = $storeResolver; + $this->helper = $helper; + } + + /** + * @return string + */ + public function getJs() + { + return $this->js; + } + + /** + * @return $this + */ + public function buildScript() + { + $params = array(); + + if ($this->customer->getId()) { + $params['customerId'] = $this->customer->getId(); + } + + try { + $siteKey = $this->helper->getSiteKey( + $this->storeManager->getStore( + $this->storeResolver->getCurrentStoreId() + )->getWebsiteId() + ); + } catch (\Magento\Framework\Exception\NoSuchEntityException $entityException) { + return $this; + } + + if ($siteKey) { + $this->js = preg_replace( + '/{{ code }}/', + sprintf( + "\t_rc('create', '%s', %s);\n", + $siteKey, + json_encode((object) $params) + ), + $this->template + ); + } + + return $this; + } +} diff --git a/src/Helper/Data.php b/src/Helper/Data.php index bfe613b..91792c5 100644 --- a/src/Helper/Data.php +++ b/src/Helper/Data.php @@ -2,6 +2,7 @@ namespace Retailcrm\Retailcrm\Helper; +use Magento\Framework\App\Config\ScopeConfigInterface; use Magento\Framework\App\Helper\AbstractHelper; use Magento\Store\Model\StoreManagerInterface; use Magento\Framework\App\Helper\Context; @@ -14,6 +15,7 @@ class Data extends AbstractHelper const XML_PATH_RETAILCRM = 'retailcrm/'; const XML_PATH_DEFAULT_SITE = 'retailcrm_site/default'; const XML_PATH_SITES = 'retailcrm_sites/'; + const XML_PATH_DAEMON_COLLECTOR = 'daemon_collector/'; public function __construct( Context $context, @@ -45,6 +47,7 @@ class Data extends AbstractHelper * @param $store * * @return mixed|null + * @throws \Exception */ public function getSite($store) { @@ -70,6 +73,9 @@ class Data extends AbstractHelper return $websitesConfig; } + /** + * @return array + */ public function getMappingSites() { $sites = []; @@ -90,6 +96,72 @@ class Data extends AbstractHelper return $sites; } + /** + * @param $website + * + * @return array|bool + */ + public function getDaemonCollector($website) + { + $forWebsite = $this->scopeConfig->getValue( + self::XML_PATH_RETAILCRM . self::XML_PATH_DAEMON_COLLECTOR . 'active', + ScopeInterface::SCOPE_WEBSITES, + $website + ); + + if ($forWebsite) { + return [ + 'website' => $website, + 'active' => $forWebsite + ]; + } + + $forDefault = $this->scopeConfig->getValue( + self::XML_PATH_RETAILCRM . self::XML_PATH_DAEMON_COLLECTOR . 'active', + ScopeConfigInterface::SCOPE_TYPE_DEFAULT + ); + + if ($forDefault) { + return [ + 'website' => 0, + 'active' => $forDefault + ]; + } + + return false; + } + + /** + * @param $website + * + * @return bool|mixed + */ + public function getSiteKey($website) + { + $daemonCollector = $this->getDaemonCollector($website); + + if ($daemonCollector === false) { + return false; + } + + if ($daemonCollector['active']) { + if ($daemonCollector['website'] > 0) { + return $this->scopeConfig->getValue( + self::XML_PATH_RETAILCRM . self::XML_PATH_DAEMON_COLLECTOR . 'key', + ScopeInterface::SCOPE_WEBSITES, + $website + ); + } else { + return $this->scopeConfig->getValue( + self::XML_PATH_RETAILCRM . self::XML_PATH_DAEMON_COLLECTOR . 'key', + ScopeConfigInterface::SCOPE_TYPE_DEFAULT + ); + } + } + + return false; + } + /** * Recursive array filter * diff --git a/src/Model/Setting/DaemonCollector.php b/src/Model/Setting/DaemonCollector.php new file mode 100644 index 0000000..fc838ca --- /dev/null +++ b/src/Model/Setting/DaemonCollector.php @@ -0,0 +1,14 @@ + true, 'label' => __('Yes')], + ['value' => false, 'label' => __('No')] + ]; + } +} diff --git a/src/Test/Unit/Block/Frontend/DaemonCollectorTest.php b/src/Test/Unit/Block/Frontend/DaemonCollectorTest.php new file mode 100644 index 0000000..46aa1ba --- /dev/null +++ b/src/Test/Unit/Block/Frontend/DaemonCollectorTest.php @@ -0,0 +1,75 @@ +getObject(\Magento\Framework\View\Element\Template\Context::class); + $customerSession = $this->createMock(\Magento\Customer\Model\Session::class); + $storeManager = $this->createMock(\Magento\Store\Model\StoreManager::class); + $storeResolver = $this->createMock(\Magento\Store\Model\StoreResolver::class); + $helper = $this->createMock(\Retailcrm\Retailcrm\Helper\Data::class); + $this->customer = $this->createMock(\Magento\Customer\Model\Customer::class); + $store = $this->createMock(\Magento\Store\Model\Store::class); + + $customerSession->expects($this->any()) + ->method('getCustomer') + ->willReturn($this->customer); + $storeResolver->expects($this->any()) + ->method('getCurrentStoreId') + ->willReturn(1); + $store->expects($this->any()) + ->method('getWebsiteId') + ->willReturn(1); + $storeManager->expects($this->any()) + ->method('getStore') + ->willReturn($store); + $helper->expects($this->any()) + ->method('getSiteKey') + ->willReturn(self::SITE_KEY); + + $this->unit = new \Retailcrm\Retailcrm\Block\Frontend\DaemonCollector( + $context, + $customerSession, + $storeManager, + $storeResolver, + $helper + ); + } + + public function testGetJSWithCustomer() + { + $this->customer->expects($this->any()) + ->method('getId') + ->willReturn(1); + + $js = $this->unit->buildScript()->getJs(); + + $this->assertContains('', $js); + $this->assertContains('_rc(\'send\', \'pageView\');', $js); + $this->assertContains(self::SITE_KEY, $js); + $this->assertContains('customerId', $js); + } + + public function testGetJSWithoutCustomer() + { + $this->customer->expects($this->any()) + ->method('getId') + ->willReturn(null); + + $js = $this->unit->buildScript()->getJs(); + + $this->assertContains('', $js); + $this->assertContains('_rc(\'send\', \'pageView\');', $js); + $this->assertContains(self::SITE_KEY, $js); + $this->assertNotContains('customerId', $js); + } +} diff --git a/src/etc/adminhtml/system.xml b/src/etc/adminhtml/system.xml index 6e48678..8fa6dac 100644 --- a/src/etc/adminhtml/system.xml +++ b/src/etc/adminhtml/system.xml @@ -64,6 +64,16 @@ Retailcrm\Retailcrm\Block\Adminhtml\System\Config\Form\Fieldset\Sites + + + + + Retailcrm\Retailcrm\Model\Setting\DaemonCollector + + + + + diff --git a/src/etc/crontab.xml b/src/etc/crontab.xml index fe8235d..44e38d3 100644 --- a/src/etc/crontab.xml +++ b/src/etc/crontab.xml @@ -4,10 +4,8 @@ * */4 * * * - */5 * * * * - \ No newline at end of file diff --git a/src/i18n/es_ES.csv b/src/i18n/es_ES.csv index 57780a2..0dc474f 100644 --- a/src/i18n/es_ES.csv +++ b/src/i18n/es_ES.csv @@ -21,4 +21,6 @@ "Incorrect URL of retailCRM or API key","La dirección del retailCRM o la llave API son incorrectos" "The selected API version is unavailable","La versión de la API seleccionada no está disponible" "Send","Enviar" -"Default site","Tienda por defecto" \ No newline at end of file +"Default site","Tienda por defecto" +"Activate","Active" +"Site key","Clave de la página web" \ No newline at end of file diff --git a/src/i18n/ru_RU.csv b/src/i18n/ru_RU.csv index 4dffff2..35339e3 100644 --- a/src/i18n/ru_RU.csv +++ b/src/i18n/ru_RU.csv @@ -21,4 +21,6 @@ "Incorrect URL of retailCRM or API key","Некорректный адрес retailCRM или API ключ" "The selected API version is unavailable","Выбранная версия API недоступна" "Send","Выгрузить" -"Default site","Сайт по умолчанию" \ No newline at end of file +"Default site","Сайт по умолчанию" +"Activate","Активировать" +"Site key","Ключ сайта" \ No newline at end of file diff --git a/src/view/frontend/layout/default.xml b/src/view/frontend/layout/default.xml new file mode 100644 index 0000000..faf05af --- /dev/null +++ b/src/view/frontend/layout/default.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/view/frontend/layout/retailcrm_index_display.xml b/src/view/frontend/layout/retailcrm_index_display.xml index 368d1f7..7e82d05 100644 --- a/src/view/frontend/layout/retailcrm_index_display.xml +++ b/src/view/frontend/layout/retailcrm_index_display.xml @@ -3,4 +3,9 @@ + + + + + \ No newline at end of file diff --git a/src/view/frontend/templates/daemon_collector.phtml b/src/view/frontend/templates/daemon_collector.phtml new file mode 100644 index 0000000..acb8ec6 --- /dev/null +++ b/src/view/frontend/templates/daemon_collector.phtml @@ -0,0 +1 @@ +buildScript()->getJs() ?> \ No newline at end of file