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 @@