Implement passing of tracking codes across domains

This commit is contained in:
Björn Fromme
2018-11-07 16:02:41 +01:00
parent 205b090eef
commit 878d9a834a
14 changed files with 106 additions and 10 deletions
@@ -350,6 +350,7 @@ $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['cms/layout/class.tx_cms_layout.php'][
$GLOBALS['TYPO3_CONF_VARS']['FE']['cacheHash']['excludedParameters'][] = 'gclid';
$GLOBALS['TYPO3_CONF_VARS']['FE']['cacheHash']['excludedParameters'][] = 'ref';
$GLOBALS['TYPO3_CONF_VARS']['FE']['cacheHash']['excludedParameters'][] = 'pa';
$GLOBALS['TYPO3_CONF_VARS']['FE']['cacheHash']['excludedParameters'][] = 'tx_epproducts_searchresult[searchParams]';
$GLOBALS['TYPO3_CONF_VARS']['FE']['cacheHash']['excludedParameters'][] = 'tx_epproducts_searchresult[filterSettings]';
$GLOBALS['TYPO3_CONF_VARS']['FE']['cacheHash']['excludedParameters'][] = 'tx_epproducts_product_detail[filterSettings]';
@@ -27,7 +27,10 @@ namespace EP\EpTheme\DataProcessing;
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
use EP\EpProducts\Service\ResellerDataService;
use EP\EpProducts\Traits\DbConnectionTrait;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Object\ObjectManager;
use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
use TYPO3\CMS\Frontend\ContentObject\DataProcessorInterface;
@@ -59,9 +62,69 @@ class ContextProcessor implements DataProcessorInterface
if ($regionUid > 0) {
$processedData['context']['region'] = $this->getContextRecord($regionUid, 'tx_epproducts_domain_model_region');
}
$resellerData = $this->getResellerData();
if ($resellerData) {
$processedData['context']['paCode'] = $resellerData['paCode'];
} elseif ($paCode = $this->getPaCodeFromRequest()) {
$processedData['context']['paCode'] = $paCode;
} elseif ($cookieData = $this->getCookieData()) {
$processedData['context']['paCode'] = $cookieData;
}
return $processedData;
}
/**
* @return array|bool
* @throws \Doctrine\DBAL\DBALException
*/
private function getResellerData()
{
/** @var \TYPO3\CMS\Extbase\Object\ObjectManager $objectManager */
$objectManager = GeneralUtility::makeInstance(ObjectManager::class);
/** @var ResellerDataService $resellerService */
$resellerService = $objectManager->get(ResellerDataService::class);
return $resellerService->getResellerForCurrentDomain();
}
/**
* @return string
*/
private function getPaCodeFromRequest()
{
$currentUri = GeneralUtility::getIndpEnv('REQUEST_URI');
$query = parse_url($currentUri, \PHP_URL_QUERY);
if (!$query) {
return '';
}
parse_str($query, $items);
if (array_key_exists('pa', $items)) {
$paCode = $items['pa'];
$expiratonDate = new \DateTime('now');
$expiratonDate->add(new \DateInterval('P' . '30D'));
setcookie('ep_trk', $paCode, $expiratonDate->getTimestamp(), '/');
return $paCode;
}
return '';
}
/**
* @return string
*/
private function getCookieData()
{
if ($_COOKIE['ep_trk']) {
return $_COOKIE['ep_trk'];
}
return '';
}
/**
* @param int $uid
* @param string $table
@@ -69,6 +69,7 @@ new Vue({
},
data () {
return {
config: {},
maxWindowWidth: 991,
lastScrollPosition: 0,
scrollTopVisible: false,
@@ -86,6 +87,10 @@ new Vue({
}
},
methods: {
parseConfig () {
const configElement = document.getElementById('appconfig');
this.config = JSON.parse(configElement.innerHTML);
},
setMobileMode () {
this.mobileMode = $window.outerWidth() < this.maxWindowWidth;
},
@@ -343,9 +348,31 @@ new Vue({
.on('affixed-top.bs.affix', () => {
this.searchbarFixed = false;
});
},
appendPaCode () {
const paCode = this.config.paCode;
if (!paCode) {
return;
}
$('a').each(function () {
if (this.hostname === location.hostname) {
return;
}
let url = $(this).attr('href');
if (!url) {
return;
}
if (url.indexOf('pa=') !== -1) {
return;
}
const separator = url.indexOf('?') === -1 ? '?' : '&';
url += separator + 'pa=' + paCode;
$(this).attr('href', url);
});
}
},
created () {
this.parseConfig();
EventBus.$on('ajaxContentLoaded', () => {
Vue.nextTick(() => {
this.initContentsliders();
@@ -398,6 +425,7 @@ new Vue({
this.initDropdownMenuBehavior();
this.initPartnerIdSelect();
this.initFaqFilter();
this.appendPaCode();
});
}
});
@@ -19,4 +19,5 @@
<f:render partial="ContactBar" arguments="{_all}"/>
</div>
<f:render partial="ConversionTracking" />
<f:render partial="Config" arguments="{_all}" />
</html>
@@ -19,5 +19,5 @@
<f:render partial="ContactBar" arguments="{_all}"/>
</div>
<f:render partial="ConversionTracking" />
<f:render partial="Config" />
<f:render partial="Config" arguments="{_all}" />
</html>
@@ -15,5 +15,5 @@
<f:render partial="ContactBar" arguments="{_all}"/>
</div>
<f:render partial="ConversionTracking" />
<f:render partial="Config" />
<f:render partial="Config" arguments="{_all}" />
</html>
@@ -13,5 +13,5 @@
<f:render partial="ContactBar" arguments="{_all}"/>
</div>
<f:render partial="ConversionTracking" />
<f:render partial="Config" />
<f:render partial="Config" arguments="{_all}" />
</html>
@@ -21,5 +21,5 @@
<f:render partial="ContactBar" arguments="{_all}"/>
</div>
<f:render partial="ConversionTracking" />
<f:render partial="Config" />
<f:render partial="Config" arguments="{_all}" />
</html>
@@ -34,5 +34,5 @@
<f:render partial="ContactBar" arguments="{_all}"/>
</div>
<f:render partial="ConversionTracking" />
<f:render partial="Config" />
<f:render partial="Config" arguments="{_all}" />
</html>
@@ -26,5 +26,5 @@
<f:render partial="ContactBar" arguments="{_all}"/>
</div>
<f:render partial="ConversionTracking" />
<f:render partial="Config" />
<f:render partial="Config" arguments="{_all}" />
</html>
@@ -36,5 +36,5 @@
<f:render partial="ContactBar" arguments="{_all}"/>
</div>
<f:render partial="ConversionTracking" />
<f:render partial="Config" />
<f:render partial="Config" arguments="{_all}" />
</html>
@@ -26,5 +26,5 @@
<f:render partial="ContactBar" arguments="{_all}"/>
</div>
<f:render partial="ConversionTracking" />
<f:render partial="Config" />
<f:render partial="Config" arguments="{_all}" />
</html>
@@ -1,6 +1,7 @@
<script type="application/json" id="appconfig">
{
"loaderUrl": "<f:format.raw>{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/ajax-loader-white.gif', absolute: 1)}</f:format.raw>",
"myEpApiBaseUrl": "<f:format.raw>{settings.myEpApiBaseUrl}</f:format.raw>"
"myEpApiBaseUrl": "<f:format.raw>{settings.myEpApiBaseUrl}</f:format.raw>",
"paCode": <f:if condition='{context.paCode}'><f:then>"{context.paCode}"</f:then><f:else>null</f:else></f:if>
}
</script>
@@ -10,7 +10,9 @@
<v:menu levels="1" useShortcutUid="1" pageUid="{settings.topNavPid}">
<f:for each="{menu}" as="menuitem">
<li class="area-nav__list-item">
<a class="area-nav__link{f:if(condition: menuitem.active, then: ' active')}{f:if(condition: '{menuitem.uid} == {settings.forceActiveTopnavUid}', then: ' active')}" href="{menuitem.link}"{f:if(condition: '{menuitem.doktype} == 3', then: ' target="_blank"')} title="{menuitem.linktext}">{menuitem.title -> ep:topnavItem()}</a>
<a class="area-nav__link{f:if(condition: menuitem.active, then: ' active')}{f:if(condition: '{menuitem.uid} == {settings.forceActiveTopnavUid}', then: ' active')}"
href="{menuitem.link}"{f:if(condition: '{menuitem.doktype} == 3', then: ' target="_blank"')}
title="{menuitem.linktext}">{menuitem.title -> ep:topnavItem()}</a>
</li>
</f:for>
</v:menu>