403 lines
15 KiB
PHP
403 lines
15 KiB
PHP
<?php
|
|
|
|
/**
|
|
* This Software is the property of Data Development and is protected
|
|
* by copyright law - it is NOT Freeware.
|
|
*
|
|
* Any unauthorized use of this software without a valid license
|
|
* is a violation of the license agreement and will be prosecuted by
|
|
* civil and criminal law.
|
|
*
|
|
* http://www.shopmodule.com
|
|
*
|
|
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
|
|
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
|
|
* @link http://www.oxidmodule.com
|
|
*/
|
|
|
|
namespace D3\Extsearch\Application\Controller\Admin\Reports;
|
|
|
|
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
|
|
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
|
|
use OxidEsales\Eshop\Core\Registry;
|
|
use OxidEsales\Eshop\Core\DatabaseProvider;
|
|
use OxidEsales\Eshop\Core\Request;
|
|
use OxidEsales\Eshop\Application\Model\Category;
|
|
use OxidEsales\Eshop\Application\Model\Vendor;
|
|
use OxidEsales\Eshop\Application\Model\Manufacturer;
|
|
use OxidEsales\Eshop\Application\Model\Attribute;
|
|
use \OeStatistics_Report_Base;
|
|
use stdClass;
|
|
|
|
// @codeCoverageIgnoreStart
|
|
// fallback for non ee editions
|
|
if (false == class_exists("\OeStatistics_Report_Base")) {
|
|
class d3_OeStatistics_Report_Base
|
|
{
|
|
public function render()
|
|
{}
|
|
}
|
|
} else {
|
|
class d3_OeStatistics_Report_Base extends OeStatistics_Report_Base {}
|
|
}
|
|
// @codeCoverageIgnoreEnd
|
|
|
|
class d3_extsearch_report_base extends d3_OeStatistics_Report_Base
|
|
{
|
|
public $aStatParams = array('type' => 'mostsearches');
|
|
public $sTimeFrom;
|
|
public $sTimeType = 'month';
|
|
public $aFilters;
|
|
|
|
/**
|
|
* @param $sFrom
|
|
* @return array
|
|
*/
|
|
public function getLogSubQuery($sFrom)
|
|
{
|
|
$aParameters = array();
|
|
$sTmpTableName = 'LogTable';
|
|
|
|
$sSelect = "
|
|
SELECT";
|
|
if ($this->aStatParams['type'] == 'hitless' || $this->aStatParams['type'] == 'mostsearches') {
|
|
$sSelect .= "
|
|
count($sTmpTableName.oxsearchparam) as counter, ";
|
|
}
|
|
$sSelect .= "
|
|
$sTmpTableName.oxsearchparam,
|
|
$sTmpTableName.oxparameter,";
|
|
|
|
if ($this->sTimeType == 'month') {
|
|
$sSelect .= "
|
|
date_format($sTmpTableName.oxtime,'%d.') as searchdate,";
|
|
} else {
|
|
$sSelect .= "
|
|
date_format($sTmpTableName.oxtime,'%m.') as searchdate,";
|
|
}
|
|
|
|
if ($this->aStatParams['type'] == 'mosthits') {
|
|
$sSelect .= "
|
|
$sTmpTableName.d3count as counter, ";
|
|
}
|
|
|
|
$sSelect .= "
|
|
$sTmpTableName.oxtime
|
|
FROM
|
|
$sFrom as $sTmpTableName
|
|
WHERE";
|
|
|
|
if ($this->aStatParams['type'] == 'mosthits') {
|
|
$sSelect .= "
|
|
$sTmpTableName.d3count != ? AND ";
|
|
$aParameters[] = 0;
|
|
} elseif ($this->aStatParams['type'] == 'hitless') {
|
|
$sSelect .= "
|
|
$sTmpTableName.d3count = ? AND ";
|
|
$aParameters[] = 0;
|
|
}
|
|
|
|
$sSelect .= "
|
|
$sTmpTableName.oxsearchparam = ? AND";
|
|
$aParameters[] = Registry::get(Request::class)->getRequestEscapedParameter('searchword');
|
|
$sSelect .= "
|
|
$sTmpTableName.oxlang = ? AND";
|
|
$aParameters[] = Registry::get(Request::class)->getRequestEscapedParameter('lang');
|
|
|
|
if (Registry::get(Request::class)->getRequestEscapedParameter('searchparams')) {
|
|
$sSelect .= "
|
|
$sTmpTableName.oxparameter = ? AND";
|
|
$aParameters[] = base64_decode(Registry::get(Request::class)->getRequestEscapedParameter('searchparams'));
|
|
}
|
|
|
|
if ($this->sTimeType == 'month') {
|
|
$sSelect .= "
|
|
date_format($sTmpTableName.oxtime,'%Y%m') = ? AND";
|
|
$aParameters[] = $this->sTimeFrom;
|
|
} else {
|
|
$sSelect .= "
|
|
date_format($sTmpTableName.oxtime,'%Y') = ? AND";
|
|
$aParameters[] = $this->sTimeFrom;
|
|
}
|
|
|
|
$sSelect .= "
|
|
$sTmpTableName.oxshopid = ?";
|
|
$aParameters[] = Registry::getConfig()->getShopId();
|
|
|
|
$sSelect .= "
|
|
GROUP BY";
|
|
if ($this->sTimeType == 'month') {
|
|
$sSelect .= "
|
|
date_format($sTmpTableName.oxtime, '%Y%m%d'),";
|
|
} else {
|
|
$sSelect .= "
|
|
date_format($sTmpTableName.oxtime, '%Y%m'),";
|
|
}
|
|
|
|
$sSelect .= "
|
|
$sTmpTableName.oxsearchparam,
|
|
$sTmpTableName.oxparameter
|
|
ORDER BY
|
|
counter DESC,
|
|
$sTmpTableName.oxsearchparam ASC
|
|
";
|
|
|
|
return array($sSelect, $aParameters);
|
|
}
|
|
|
|
/**
|
|
* @param $sSelect
|
|
* @param $aParameters
|
|
* @param $iLines
|
|
* @return array
|
|
* @throws DatabaseConnectionException
|
|
* @throws DatabaseErrorException
|
|
*/
|
|
protected function _getDataArray($sSelect, $aParameters, $iLines)
|
|
{
|
|
$aTemp = array();
|
|
for ($i = 1; $i <= $iLines; $i++) {
|
|
$aTemp[date("d.", mktime(23, 59, 59, 01, $i, 1970))] = 0;
|
|
}
|
|
|
|
$aRecords = DatabaseProvider::getDb(DatabaseProvider::FETCH_MODE_ASSOC)->getAll($sSelect, $aParameters);
|
|
if ($aRecords && is_array($aRecords) && count($aRecords)) {
|
|
foreach ($aRecords as $aRecord) {
|
|
$aRecord = array_change_key_case($aRecord, CASE_UPPER);
|
|
if ($aRecord['COUNTER']) {
|
|
$aTemp[$aRecord['SEARCHDATE']] = (int)$aRecord['COUNTER'];
|
|
}
|
|
}
|
|
}
|
|
|
|
return $aTemp;
|
|
}
|
|
|
|
/**
|
|
* @return int
|
|
*/
|
|
protected function _getLineCount()
|
|
{
|
|
$iCount = 0;
|
|
|
|
if ($this->sTimeType == 'month') {
|
|
$iCount =
|
|
date("t", mktime(23, 59, 59, substr($this->sTimeFrom, 4, 2), 01, substr($this->sTimeFrom, 0, 4)));
|
|
} elseif ($this->sTimeType == 'year') {
|
|
$iCount = 12;
|
|
}
|
|
|
|
return $iCount;
|
|
}
|
|
|
|
/**
|
|
* @param $aDataX
|
|
* @return int
|
|
*/
|
|
protected function _getMaxValue($aDataX)
|
|
{
|
|
$iMax = 0;
|
|
foreach ($aDataX as $sValue) {
|
|
if ($iMax < (int)$sValue) {
|
|
$iMax = (int)$sValue;
|
|
}
|
|
}
|
|
|
|
return $iMax;
|
|
}
|
|
|
|
/**
|
|
* @param $iMax
|
|
* @return mixed
|
|
*/
|
|
protected function _getAligns($iMax)
|
|
{
|
|
$aPoints = array();
|
|
$aPoints["0"] = 0;
|
|
$aAligns["0"] = 'report_searchstrings_scale_aligns_left"';
|
|
$iTenth = strlen($iMax) - 1;
|
|
if ($iTenth < 1) {
|
|
$aPoints["" . (round(($iMax / 2))) . ""] = $iMax / 2;
|
|
$aAligns["" . (round(($iMax / 2))) . ""] =
|
|
'report_searchstrings_scale_aligns_center" width="' . (720 / 3) . '"';
|
|
$aPoints["" . $iMax . ""] = $iMax;
|
|
$aAligns["" . $iMax . ""] =
|
|
'report_searchstrings_scale_aligns_right" width="' . (720 / 3) . '"';
|
|
} else {
|
|
$iScaleMax = $iMax;
|
|
$ctr = 0;
|
|
for ($iCtr = 10; $iCtr > 0; $iCtr--) {
|
|
$aPoints["" . (round(($ctr))) . ""] = $ctr += $iScaleMax / 10;
|
|
$aAligns["" . (round(($ctr))) . ""] =
|
|
'report_searchstrings_scale_aligns_center" width="' . (720 / 10) . '"';
|
|
}
|
|
$aAligns["" . (round(($ctr))) . ""] = 'report_searchstrings_scale_aligns_right" width="' . (720 / 10) . '"';
|
|
}
|
|
|
|
$aAligns["0"] .= ' width="' . (720 / count($aAligns)) . '"';
|
|
|
|
return $aAligns;
|
|
}
|
|
|
|
/**
|
|
* @param $aDataX
|
|
* @param $aDataY
|
|
* @return array
|
|
*/
|
|
protected function _getDataVals($aDataX, $aDataY)
|
|
{
|
|
$iMax = $this->_getMaxValue($aDataX);
|
|
$aDataVals = array();
|
|
|
|
for ($iCtr = 0; $iCtr < count($aDataY); $iCtr++) {
|
|
$aDataVals[$aDataY[$iCtr]] = round($aDataX[$iCtr] / $iMax * 100);
|
|
}
|
|
|
|
foreach ($aDataX as $sKey => $sValue) {
|
|
$aDataVals[$sKey] = round($sValue / $iMax * 100);
|
|
}
|
|
|
|
return $aDataVals;
|
|
}
|
|
|
|
/**
|
|
* @param $aFilters
|
|
* @return array
|
|
*/
|
|
protected function _extractFilters($aFilters)
|
|
{
|
|
$aFilters = unserialize($aFilters);
|
|
|
|
$aPreparedFilters = array();
|
|
|
|
if (is_array($aFilters)) {
|
|
foreach ($aFilters as $sType => $sValue) {
|
|
$oPreparedFilter = new stdClass;
|
|
|
|
switch ($sType) {
|
|
case "cat":
|
|
$oPreparedFilter->desc =
|
|
Registry::getLang()->translateString('D3_EXTSEARCH_STAT_TYPES_CATEGORY');
|
|
/** @var $oCategory Category */
|
|
$oCategory = oxNew(Category::class);
|
|
$oCategory->load($sValue);
|
|
/** @var Category $oParentCategory */
|
|
$oParentCategory = $oCategory->getParentCategory();
|
|
$oPreparedFilter->value = $oCategory->getFieldData('oxtitle') ?
|
|
'.../' . $oParentCategory->getFieldData('oxtitle') . '/' .
|
|
$oCategory->getFieldData('oxtitle') : $sValue;
|
|
break;
|
|
case "price":
|
|
$oPreparedFilter->desc =
|
|
Registry::getLang()->translateString('D3_EXTSEARCH_STAT_TYPES_PRICE');
|
|
if (is_array($sValue)) {
|
|
$oPreparedFilter->value = http_build_query($sValue,'','; ');
|
|
} else {
|
|
$oPreparedFilter->value = $sValue;
|
|
}
|
|
break;
|
|
case "vnd":
|
|
$oPreparedFilter->desc =
|
|
Registry::getLang()->translateString('D3_EXTSEARCH_STAT_TYPES_VENDOR');
|
|
$oVendor = oxNew(Vendor::class);
|
|
$oVendor->load($sValue);
|
|
$oPreparedFilter->value =
|
|
$oVendor->getFieldData('oxtitle') ? $oVendor->getFieldData('oxtitle') : $sValue;
|
|
break;
|
|
case "mnf":
|
|
$oPreparedFilter->desc =
|
|
Registry::getLang()->translateString('D3_EXTSEARCH_STAT_TYPES_MANUFACTURER');
|
|
$oManufacturer = oxNew(Manufacturer::class);
|
|
$oManufacturer->load($sValue);
|
|
$oPreparedFilter->value =
|
|
$oManufacturer->getFieldData('oxtitle') ? $oManufacturer->getFieldData('oxtitle') : $sValue;
|
|
break;
|
|
case "ownlike":
|
|
$oPreparedFilter->desc =
|
|
Registry::getLang()->translateString('D3_EXTSEARCH_STAT_TYPES_OWNLIKE');
|
|
$aFieldList = array();
|
|
if (is_array($sValue) && count($sValue)) {
|
|
foreach ($sValue as $sFieldName => $aFieldValue) {
|
|
if (count($aFieldValue) && strlen($aFieldValue[0])) {
|
|
$aFieldList[] = sprintf(
|
|
Registry::getLang()->translateString('D3_EXTSEARCH_STAT_TYPES_OWNVALUE'),
|
|
$sFieldName,
|
|
implode(', ', $aFieldValue)
|
|
);
|
|
}
|
|
}
|
|
}
|
|
$oPreparedFilter->value = implode(nl2br(', '.PHP_EOL.' '), $aFieldList);
|
|
break;
|
|
case "ownis":
|
|
$oPreparedFilter->desc =
|
|
Registry::getLang()->translateString('D3_EXTSEARCH_STAT_TYPES_OWNIS');
|
|
$aFieldList = array();
|
|
if (is_array($sValue) && count($sValue)) {
|
|
foreach ($sValue as $sFieldName => $aFieldValue) {
|
|
if (count($aFieldValue) && strlen($aFieldValue[0])) {
|
|
$aFieldList[] =
|
|
sprintf(
|
|
Registry::getLang()->translateString('D3_EXTSEARCH_STAT_TYPES_OWNVALUE'),
|
|
$sFieldName,
|
|
implode(', ', $aFieldValue)
|
|
);
|
|
}
|
|
}
|
|
}
|
|
$oPreparedFilter->value = implode(nl2br(', '.PHP_EOL.' '), $aFieldList);
|
|
break;
|
|
case "attr":
|
|
$oPreparedFilter->desc =
|
|
Registry::getLang()->translateString('D3_EXTSEARCH_STAT_TYPES_ATTRIBUTE');
|
|
if (is_array($sValue)) {
|
|
foreach ($sValue as $sAttrKey => $sAttribValue) {
|
|
$oAttribute = oxNew(Attribute::class);
|
|
$oAttribute->load($sAttrKey);
|
|
$oPreparedFilter->value .= $oAttribute->getFieldData('oxtitle') ?
|
|
$oAttribute->getFieldData('oxtitle') :
|
|
$sAttrKey;
|
|
$oPreparedFilter->value .= ': ' . $sAttribValue . "; ";
|
|
}
|
|
}
|
|
break;
|
|
case "lttr":
|
|
$oPreparedFilter->desc =
|
|
Registry::getLang()->translateString('D3_EXTSEARCH_STAT_TYPES_INDEXLETTER');
|
|
$oPreparedFilter->value = strtolower($sValue);
|
|
break;
|
|
default:
|
|
$oPreparedFilter->desc =
|
|
Registry::getLang()->translateString('D3_EXTSEARCH_STAT_TYPES_UNKNOWN');
|
|
$oPreparedFilter->value = $sValue;
|
|
break;
|
|
}
|
|
|
|
$aPreparedFilters[] = $oPreparedFilter;
|
|
}
|
|
}
|
|
|
|
return $aPreparedFilters;
|
|
}
|
|
|
|
/**
|
|
* @param $aFilters
|
|
* @return string
|
|
*/
|
|
protected function FilterToString($aFilters)
|
|
{
|
|
$aFilters = $this->_extractFilters($aFilters);
|
|
$aPreparedFilter = array();
|
|
|
|
if (!isset($aFilters) || !is_array($aFilters) || !count($aFilters)) {
|
|
return '';
|
|
}
|
|
|
|
foreach ($aFilters as $aFilter) {
|
|
$aPreparedFilter[] = $aFilter->desc . ': ' . $aFilter->value;
|
|
}
|
|
|
|
return implode(', ', $aPreparedFilter);
|
|
}
|
|
}
|