2017-12-10 22:19:30 +01:00
< ? php
namespace WapplerSystems\ABTest2 ;
/**
* This file is part of the " abtest2 " Extension for TYPO3 CMS .
*
* For the full copyright and license information , please read the
* LICENSE . txt file that was distributed with this source code .
*/
use TYPO3\CMS\Core\Utility\GeneralUtility ;
2017-12-10 22:33:11 +01:00
use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController ;
2017-12-10 22:19:30 +01:00
use TYPO3\CMS\Frontend\Page\PageRepository ;
/**
* This class detects which page version ( either by cookie or by random ) and sets the page content ID accordingly .
*
* @ package WapplerSystems\ABTest2
* @ author Sven Wapler < typo3YYYYY @ wappler . systems >
*/
2017-12-10 22:33:11 +01:00
class Helper
{
2017-12-10 22:19:30 +01:00
/**
*
* @ param array $params
2017-12-10 22:33:11 +01:00
* @ param $pObj TypoScriptFrontendController
2017-12-10 22:19:30 +01:00
* @ return void
* @ throws \InvalidArgumentException
*/
2017-12-10 22:33:11 +01:00
public function determineContentId ( array $params , & $pObj )
{
// only try to change the page if it's not the googlebot.
if ( false === stripos ( $_SERVER [ 'HTTP_USER_AGENT' ], 'googlebot' )) {
2017-12-11 00:18:29 +01:00
$currentPageId = $randomPageId = $pObj -> id ;
2017-12-10 22:33:11 +01:00
// Get the rootpage_id from realurl config.
2017-12-11 00:18:29 +01:00
$realurlConfig = $pObj -> TYPO3_CONF_VARS [ 'EXTCONF' ][ 'realurl' ];
if ( array_key_exists ( $_SERVER [ 'SERVER_NAME' ], $realurlConfig )) {
$rootpage_id = $realurlConfig [ $_SERVER [ 'SERVER_NAME' ]][ 'pagePath' ][ 'rootpage_id' ];
2017-12-10 22:33:11 +01:00
} else {
2017-12-11 00:18:29 +01:00
$rootpage_id = $realurlConfig [ '_DEFAULT' ][ 'pagePath' ][ 'rootpage_id' ];
2017-12-10 22:33:11 +01:00
}
// If the ID is NULL, then we set this value to the rootpage_id. NULL is the "Home"page, ID is a specific sub-page, e.g. www.domain.de (NULL) - www.domain.de/page.html (ID)
2017-12-11 00:18:29 +01:00
if ( ! $currentPageId ) {
if ( $rootpage_id ) {
$currentPageId = $rootpage_id ;
2017-12-10 22:33:11 +01:00
} else {
// Leave the function because we can not determine the ID.
return ;
}
}
$pageRepository = GeneralUtility :: makeInstance ( PageRepository :: class );
2017-12-11 00:18:29 +01:00
$currentPagePropertiesArray = $pageRepository -> getPage ( $currentPageId );
$pageBPageId = $currentPagePropertiesArray [ 'tx_abtest2_b_id' ];
$cookieLifeTime = $currentPagePropertiesArray [ 'tx_abtest2_cookie_time' ];
2017-12-10 22:33:11 +01:00
2017-12-11 00:18:29 +01:00
if ( $pageBPageId ) {
/* page b id exists */
$cookiePageId = ( int ) $_COOKIE [ 'abtest2-' . $currentPageId ];
2017-12-10 22:33:11 +01:00
2017-12-11 00:18:29 +01:00
if ( $cookiePageId > 0 && ( $cookiePageId === $pageBPageId || $cookiePageId === $currentPageId )) {
/* valid cookie page id -> select cookie page id */
$randomPageId = $cookiePageId ;
2017-12-10 22:33:11 +01:00
} else {
2017-12-11 00:18:29 +01:00
/* select least used page */
$pageBPropertiesArray = $pageRepository -> getPage ( $pageBPageId );
if (( int ) $currentPagePropertiesArray [ 'tx_abtest2_counter' ] > ( int ) $pageBPropertiesArray [ 'tx_abtest2_counter' ]) {
$randomPageId = $pageBPageId ;
$currentPagePropertiesArray = $pageBPropertiesArray ;
} elseif (( int ) $currentPagePropertiesArray [ 'tx_abtest2_counter' ] < ( int ) $pageBPropertiesArray [ 'tx_abtest2_counter' ]) {
2017-12-10 22:33:11 +01:00
} else {
2017-12-11 00:18:29 +01:00
/* random */
$randomPage = rand ( 0 , 1 ); // 0 = original ID; 1 = "B" site.
if ( $randomPage ) {
$randomPageId = $pageBPageId ;
$currentPagePropertiesArray = $pageBPropertiesArray ;
}
2017-12-10 22:33:11 +01:00
}
2017-12-11 00:18:29 +01:00
/* rise counter */
$GLOBALS [ 'TYPO3_DB' ] -> exec_UPDATEquery ( 'pages' , 'uid=' . ( int ) $randomPageId , array ( 'tx_abtest2_counter' => $currentPagePropertiesArray [ 'tx_abtest2_counter' ] + 1 ));
setcookie ( 'abtest2-' . $currentPageId , $randomPageId , time () + $cookieLifeTime );
2017-12-10 22:33:11 +01:00
}
// If current page ID is different from the random page ID we set the correct page ID.
2017-12-11 00:18:29 +01:00
if ( $currentPageId !== $randomPageId ) {
$pObj -> contentPid = $randomPageId ;
$pObj -> page [ 'content_from_pid' ] = $randomPageId ;
}
$pObj -> page [ 'no_cache' ] = true ;
if ( $currentPagePropertiesArray ) {
$additionalHeaderData = $currentPagePropertiesArray [ 'tx_abtest2_header' ];
$additionalFooterData = $currentPagePropertiesArray [ 'tx_abtest2_footer' ];
if ( $additionalHeaderData ) {
$pObj -> additionalHeaderData [ 'abtest2' ] = $additionalHeaderData ;
}
if ( $additionalFooterData ) {
$pObj -> additionalFooterData [ 'abtest2' ] = $additionalFooterData ;
}
2017-12-10 22:33:11 +01:00
}
2017-12-10 22:19:30 +01:00
2017-12-10 22:33:11 +01:00
}
2017-12-10 22:19:30 +01:00
2017-12-10 22:33:11 +01:00
}
2017-12-10 22:19:30 +01:00
2017-12-10 22:33:11 +01:00
}
2017-12-10 22:19:30 +01:00
}