From dc9a1043a80465b9df55ae40bbe711db53d82d59 Mon Sep 17 00:00:00 2001 From: DanielSeifert Date: Wed, 17 Aug 2016 08:10:15 +0000 Subject: [PATCH 1/9] change table engine, fix small issues --- Sources/UsersOnline-Installation.docx | Bin 51251 -> 50301 bytes .../admin/d3_cfg_usersonline_main.php | 4 +++ .../admin/d3_usersonline_statistic.php | 4 +++ .../setup/d3usersonline_update.php | 33 +++++++++++++++++- .../views/admin/de/d3usersonline_lang.php | 3 +- .../views/admin/en/d3usersonline_lang.php | 3 +- .../admin/tpl/d3_cfg_usersonline_main.tpl | 12 +------ .../admin/tpl/d3_usersonline_statistic.tpl | 10 ------ setup+doku/Precheck/d3precheck.php | 2 +- 9 files changed, 46 insertions(+), 25 deletions(-) diff --git a/Sources/UsersOnline-Installation.docx b/Sources/UsersOnline-Installation.docx index 97636186a172550b81ea324d4216f220f0b0f60b..13914c7c41e297f9d0bff77c22d247bed3fc6c2d 100644 GIT binary patch delta 23942 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 Jbo`yv{{u@C$EyGU delta 24847 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 'checkUsersOnlineTableExist', 'do' => 'updateUsersOnlineTableExist'), + array('check' => 'checkUsersOnlineTableEngine', + 'do' => 'updateUsersOnlineTableEngine'), array('check' => 'checkRenameFields', 'do' => 'fixRenameFields'), array('check' => 'checkDeleteFields', @@ -162,12 +166,39 @@ DQ9'; $blRet = true; if ($this->checkUsersOnlineTableExist()) { - $blRet = $this->_addTable2('d3usersonline', $this->aFields, $this->aIndizes, 'users online', 'MyISAM'); + $blRet = $this->_addTable2('d3usersonline', $this->aFields, $this->aIndizes, 'users online', 'InnoDB'); } return $blRet; } + /** + * @return bool true, if table has wrong engine + */ + public function checkUsersOnlineTableEngine() + { + /** @var d3installdbtable $oDbTable */ + $oDbTable = oxNew('d3installdbtable', $this); + $aData = $oDbTable->getTableData('d3usersonline'); + + if (isset($aData) && count($aData) && isset($aData['ENGINE']) && $aData['ENGINE'] == 'InnoDB') { + return false; + } + + return true; + } + + /** + * @return bool + */ + public function updateUsersOnlineTableEngine() + { + /** @var d3installdbtable $oDbTable */ + $oDbTable = oxNew('d3installdbtable', $this); + $blRet = $oDbTable->changeTableEngine('d3usersonline', 'InnoDB'); + return $blRet; + } + /** * @return bool */ diff --git a/copy_this/modules/d3/d3usersonline/views/admin/de/d3usersonline_lang.php b/copy_this/modules/d3/d3usersonline/views/admin/de/d3usersonline_lang.php index f67ea15..a6818d9 100644 --- a/copy_this/modules/d3/d3usersonline/views/admin/de/d3usersonline_lang.php +++ b/copy_this/modules/d3/d3usersonline/views/admin/de/d3usersonline_lang.php @@ -25,7 +25,7 @@ $iLangNr = 0; $aLang = array( 'charset' => 'ISO-8859-15', - 'd3mxusersonline' => 'Benutzer online', + 'd3mxusersonline' => ' Benutzer online', 'd3mxusersonline_settings' => 'Einstellungen', 'd3tbclussersonline_settings_main' => 'Grundeinstellungen', 'd3mxusersonline_analysis' => 'Auswertungen', @@ -35,4 +35,5 @@ $aLang = array( 'D3_USERSONLINE_USER' => 'Benutzer', 'D3_USERSONLINE_USERS' => 'Benutzer', 'D3_USERSONLINE_ALL' => 'gesamt', + 'D3_USERSONLINE_SAVE' => 'Speichern', ); diff --git a/copy_this/modules/d3/d3usersonline/views/admin/en/d3usersonline_lang.php b/copy_this/modules/d3/d3usersonline/views/admin/en/d3usersonline_lang.php index a5a3c60..64d6f52 100644 --- a/copy_this/modules/d3/d3usersonline/views/admin/en/d3usersonline_lang.php +++ b/copy_this/modules/d3/d3usersonline/views/admin/en/d3usersonline_lang.php @@ -25,7 +25,7 @@ $iLangNr = 0; $aLang = array( 'charset' => 'ISO-8859-15', - 'd3mxusersonline' => 'Users Online', + 'd3mxusersonline' => ' Users online', 'd3mxusersonline_settings' => 'Settings', 'd3tbclussersonline_settings_main' => 'Main Settings', 'd3mxusersonline_analysis' => 'Analysis', @@ -35,4 +35,5 @@ $aLang = array( 'D3_USERSONLINE_USER' => 'user', 'D3_USERSONLINE_USERS' => 'users', 'D3_USERSONLINE_ALL' => 'all', + 'D3_USERSONLINE_SAVE' => 'save', ); diff --git a/copy_this/modules/d3/d3usersonline/views/admin/tpl/d3_cfg_usersonline_main.tpl b/copy_this/modules/d3/d3usersonline/views/admin/tpl/d3_cfg_usersonline_main.tpl index 3574879..2c23747 100644 --- a/copy_this/modules/d3/d3usersonline/views/admin/tpl/d3_cfg_usersonline_main.tpl +++ b/copy_this/modules/d3/d3usersonline/views/admin/tpl/d3_cfg_usersonline_main.tpl @@ -128,7 +128,7 @@
- +

@@ -142,13 +142,3 @@ [{include file="d3_cfg_mod_inc.tpl"}] - - \ No newline at end of file diff --git a/copy_this/modules/d3/d3usersonline/views/admin/tpl/d3_usersonline_statistic.tpl b/copy_this/modules/d3/d3usersonline/views/admin/tpl/d3_usersonline_statistic.tpl index ac39bfa..921b1eb 100644 --- a/copy_this/modules/d3/d3usersonline/views/admin/tpl/d3_usersonline_statistic.tpl +++ b/copy_this/modules/d3/d3usersonline/views/admin/tpl/d3_usersonline_statistic.tpl @@ -149,13 +149,3 @@ [{/if}] [{include file="d3_cfg_mod_inc.tpl"}] - - \ No newline at end of file diff --git a/setup+doku/Precheck/d3precheck.php b/setup+doku/Precheck/d3precheck.php index e8a4b09..8e75852 100644 --- a/setup+doku/Precheck/d3precheck.php +++ b/setup+doku/Precheck/d3precheck.php @@ -143,7 +143,7 @@ class requConfig 'aParams' => array( 'id' => 'd3modcfg_lib', 'name' => 'Modul-Connector', - 'version' => '4.3.1.0', + 'version' => '4.3.7.0', ), ), ), From c0a59c7196167cfcaf58e6721c9df8d9bbdc7d66 Mon Sep 17 00:00:00 2001 From: DanielSeifert Date: Wed, 24 Aug 2016 14:43:50 +0000 Subject: [PATCH 2/9] add nex index for clean up --- .../d3/d3usersonline/setup/d3usersonline_update.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/copy_this/modules/d3/d3usersonline/setup/d3usersonline_update.php b/copy_this/modules/d3/d3usersonline/setup/d3usersonline_update.php index 083f6a9..841067b 100644 --- a/copy_this/modules/d3/d3usersonline/setup/d3usersonline_update.php +++ b/copy_this/modules/d3/d3usersonline/setup/d3usersonline_update.php @@ -111,6 +111,14 @@ DQ9'; 'OXCLASS' => 'OXCLASS', ), ), + 'TIMEVISIT' => array( + 'sTableName' => 'd3usersonline', + 'sType' => '', + 'sName' => 'TIMEVISIT', + 'aFields' => array( + 'TIMEVISIT' => 'TIMEVISIT', + ), + ), ); public $aRenameFields = array( From dac3ae9b23f423adbaad0acff30ceee3c5de0ace Mon Sep 17 00:00:00 2001 From: DanielSeifert Date: Thu, 15 Sep 2016 09:46:16 +0000 Subject: [PATCH 3/9] reduce delete calls because of heave db load --- .../d3/d3usersonline/models/d3usersonline.php | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/copy_this/modules/d3/d3usersonline/models/d3usersonline.php b/copy_this/modules/d3/d3usersonline/models/d3usersonline.php index e4b8e8f..0bf24b4 100644 --- a/copy_this/modules/d3/d3usersonline/models/d3usersonline.php +++ b/copy_this/modules/d3/d3usersonline/models/d3usersonline.php @@ -32,6 +32,8 @@ class d3usersonline extends oxbase protected $_httpXComingFrom = null; protected $_httpComingFrom = null; + protected $_iDeleteThreshold = 30; // Zeitdifferenz für Löschaufträge + /** * constructor */ @@ -48,8 +50,15 @@ class d3usersonline extends oxbase { startProfile(__METHOD__); - $iExptime = time() - $iExpTime; - oxDb::getDb()->Execute("delete from ".$this->getViewName()." where timevisit < $iExptime"); + $iTime = time(); + $iLastDeleteTime = oxRegistry::getConfig()->getShopConfVar('iLastDeleteTime', null, 'd3usersonline'); + + if ($iTime > $iLastDeleteTime + $this->_iDeleteThreshold) { + $iExptime = $iTime - $iExpTime; + oxDb::getDb()->Execute("delete from " . $this->getViewName() . " where timevisit < $iExptime"); + + oxRegistry::getConfig()->saveShopConfVar('int', 'iLastDeleteTime', $iTime, null, 'd3usersonline'); + } stopProfile(__METHOD__); } @@ -63,7 +72,7 @@ class d3usersonline extends oxbase $sSelect = "select count(oxid) AS counter, oxclass from ". $this->getViewName()." GROUP BY oxclass ORDER BY counter desc"; - $aRecords = oxDb::getDb(oxDb::FETCH_MODE_ASSOC)->getArray($sSelect); + $aRecords = oxDb::getDb(oxDb::FETCH_MODE_ASSOC)->getAll($sSelect); $iAllCounter = 0; $aUserClasses = array(); From 759b22b76434826d287802a90d2fb391836abdc6 Mon Sep 17 00:00:00 2001 From: Daniel Seifert Date: Tue, 21 Nov 2017 11:02:32 +0100 Subject: [PATCH 4/9] add page details --- .../admin/d3_usersonline_statistic.php | 27 ++++++++++ .../d3/d3usersonline/models/d3usersonline.php | 53 +++++++++++++++++-- .../setup/d3usersonline_update.php | 19 +++++++ .../views/admin/de/d3usersonline_lang.php | 8 +++ .../views/admin/en/d3usersonline_lang.php | 8 +++ .../admin/tpl/d3_usersonline_statistic.tpl | 8 ++- 6 files changed, 118 insertions(+), 5 deletions(-) diff --git a/copy_this/modules/d3/d3usersonline/controllers/admin/d3_usersonline_statistic.php b/copy_this/modules/d3/d3usersonline/controllers/admin/d3_usersonline_statistic.php index 13c2b0b..e39df09 100644 --- a/copy_this/modules/d3/d3usersonline/controllers/admin/d3_usersonline_statistic.php +++ b/copy_this/modules/d3/d3usersonline/controllers/admin/d3_usersonline_statistic.php @@ -31,4 +31,31 @@ class d3_usersonline_statistic extends d3_cfg_mod_main $oUsersOnline->clearOldItems($this->_iExpTime); return $oUsersOnline->getUserCount(); } + + public function getControllerTitle($sControllerIdent) + { + $oLang = oxRegistry::getLang(); + $sTranslationIdent = 'D3_USERSONLINE_CLASS_'.strtoupper($sControllerIdent); + $sTranslation = $oLang->translateString( + $sTranslationIdent, + null, + false + ); + + if ($sTranslation !== $sTranslationIdent) { + return $sTranslation; + } else { + $sTranslationIdent = 'PAGE_TITLE_'.strtoupper($sControllerIdent); + $sTranslation = $oLang->translateString( + $sTranslationIdent, + null, + true + ); + if ($sTranslation !== $sTranslationIdent) { + return $sTranslation; + } + } + + return ucfirst($sControllerIdent); + } } diff --git a/copy_this/modules/d3/d3usersonline/models/d3usersonline.php b/copy_this/modules/d3/d3usersonline/models/d3usersonline.php index 0bf24b4..65f9dce 100644 --- a/copy_this/modules/d3/d3usersonline/models/d3usersonline.php +++ b/copy_this/modules/d3/d3usersonline/models/d3usersonline.php @@ -70,8 +70,8 @@ class d3usersonline extends oxbase { startProfile(__METHOD__); - $sSelect = "select count(oxid) AS counter, oxclass from ". - $this->getViewName()." GROUP BY oxclass ORDER BY counter desc"; + $sSelect = "select count(oxid) AS counter, oxclass, oxpage from ". + $this->getViewName()." GROUP BY oxclass, oxpage ORDER BY counter desc"; $aRecords = oxDb::getDb(oxDb::FETCH_MODE_ASSOC)->getAll($sSelect); $iAllCounter = 0; @@ -82,6 +82,7 @@ class d3usersonline extends oxbase $oTmp = new stdClass; $oTmp->classname = $aRecord['OXCLASS']; + $oTmp->page = $aRecord['OXPAGE']; $oTmp->counter = $aRecord['COUNTER']; $iAllCounter += $aRecord['COUNTER']; $aUserClasses['classes'][] = $oTmp; @@ -103,7 +104,8 @@ class d3usersonline extends oxbase $aValues = array( 'timevisit' => time(), - 'oxclass' => oxRegistry::getConfig()->getActiveView()->getClassName() + 'oxclass' => oxRegistry::getConfig()->getActiveView()->getClassName(), + 'oxpage' => $this->getPageIdent(), ); $this->assign($aValues); @@ -112,6 +114,51 @@ class d3usersonline extends oxbase stopProfile(__METHOD__); } + /** + * @return null|string + */ + public function getPageIdent() + { + switch (strtolower(oxRegistry::getConfig()->getActiveView()->getClassName())) + { + case 'details': + case 'oxwarticledetails': + if (($oView = oxRegistry::getConfig()->getActiveView()) + && method_exists($oView, 'getProduct') + ) { + return $oView->getProduct()->getFieldData('oxtitle'); + } + return null; + case 'alist': + case 'manufacturerlist': + case 'vendorlist': + if (($oView = oxRegistry::getConfig()->getActiveView()) + && method_exists($oView, 'getTitle') + ) { + return $oView->getTitle(); + } + return null; + case 'search': + return oxRegistry::getConfig()->getRequestParameter('searchparam'); + case 'content': + if (($oView = oxRegistry::getConfig()->getActiveView()) + && method_exists($oView, 'getContent') + ) { + return $oView->getContent()->getFieldData('oxtitle'); + } + return null; + case 'tag': + if (($oView = oxRegistry::getConfig()->getActiveView()) + && method_exists($oView, 'getTag') + ) { + return $oView->getTag(); + } + return null; + } + + return null; + } + /** * @return string */ diff --git a/copy_this/modules/d3/d3usersonline/setup/d3usersonline_update.php b/copy_this/modules/d3/d3usersonline/setup/d3usersonline_update.php index 841067b..d2f8df4 100644 --- a/copy_this/modules/d3/d3usersonline/setup/d3usersonline_update.php +++ b/copy_this/modules/d3/d3usersonline/setup/d3usersonline_update.php @@ -93,6 +93,16 @@ DQ9'; 'sExtra' => '', 'blMultilang' => false, ), + 'OXPAGE' => array( + 'sTableName' => 'd3usersonline', + 'sFieldName' => 'OXPAGE', + 'sType' => 'VARCHAR(32)', + 'blNull' => false, + 'sDefault' => false, + 'sComment' => '', + 'sExtra' => '', + 'blMultilang' => false, + ), ); public $aIndizes = array( @@ -111,6 +121,15 @@ DQ9'; 'OXCLASS' => 'OXCLASS', ), ), + 'CLASSPAGE' => array( + 'sTableName' => 'd3usersonline', + 'sType' => '', + 'sName' => 'CLASSPAGE', + 'aFields' => array( + 'OXCLASS' => 'OXCLASS', + 'OXPAGE' => 'OXPAGE', + ), + ), 'TIMEVISIT' => array( 'sTableName' => 'd3usersonline', 'sType' => '', diff --git a/copy_this/modules/d3/d3usersonline/views/admin/de/d3usersonline_lang.php b/copy_this/modules/d3/d3usersonline/views/admin/de/d3usersonline_lang.php index a6818d9..45c7093 100644 --- a/copy_this/modules/d3/d3usersonline/views/admin/de/d3usersonline_lang.php +++ b/copy_this/modules/d3/d3usersonline/views/admin/de/d3usersonline_lang.php @@ -36,4 +36,12 @@ $aLang = array( 'D3_USERSONLINE_USERS' => 'Benutzer', 'D3_USERSONLINE_ALL' => 'gesamt', 'D3_USERSONLINE_SAVE' => 'Speichern', + 'D3_USERSONLINE_CLASS_ALIST' => 'Artikelliste aus Kategorie', + 'D3_USERSONLINE_CLASS_MANUFACTURERLIST' => 'Artikelliste aus Hersteller', + 'D3_USERSONLINE_CLASS_VENDORLIST' => 'Artikelliste aus Lieferant', + 'D3_USERSONLINE_CLASS_CONTENT' => 'Informationstext', + 'D3_USERSONLINE_CLASS_OXWARTICLEDETAILS' => 'Detailseite', + 'D3_USERSONLINE_CLASS_DETAILS' => 'Detailseite', + 'D3_USERSONLINE_CLASS_START' => 'Startseite', + 'D3_USERSONLINE_CLASS_TAGS' => 'Stichwort', ); diff --git a/copy_this/modules/d3/d3usersonline/views/admin/en/d3usersonline_lang.php b/copy_this/modules/d3/d3usersonline/views/admin/en/d3usersonline_lang.php index 64d6f52..0e038e7 100644 --- a/copy_this/modules/d3/d3usersonline/views/admin/en/d3usersonline_lang.php +++ b/copy_this/modules/d3/d3usersonline/views/admin/en/d3usersonline_lang.php @@ -36,4 +36,12 @@ $aLang = array( 'D3_USERSONLINE_USERS' => 'users', 'D3_USERSONLINE_ALL' => 'all', 'D3_USERSONLINE_SAVE' => 'save', + 'D3_USERSONLINE_CLASS_ALIST' => 'article list from category', + 'D3_USERSONLINE_CLASS_MANUFACTURERLIST' => 'article list from manufacturer', + 'D3_USERSONLINE_CLASS_VENDORLIST' => 'article list from vendor', + 'D3_USERSONLINE_CLASS_CONTENT' => 'information text', + 'D3_USERSONLINE_CLASS_OXWARTICLEDETAILS' => 'details page', + 'D3_USERSONLINE_CLASS_DETAILS' => 'details page', + 'D3_USERSONLINE_CLASS_START' => 'start page', + 'D3_USERSONLINE_CLASS_TAGS' => 'tag', ); diff --git a/copy_this/modules/d3/d3usersonline/views/admin/tpl/d3_usersonline_statistic.tpl b/copy_this/modules/d3/d3usersonline/views/admin/tpl/d3_usersonline_statistic.tpl index 921b1eb..9ceffeb 100644 --- a/copy_this/modules/d3/d3usersonline/views/admin/tpl/d3_usersonline_statistic.tpl +++ b/copy_this/modules/d3/d3usersonline/views/admin/tpl/d3_usersonline_statistic.tpl @@ -125,10 +125,14 @@ [{if $aClassUser->classname}] - [{$aClassUser->classname|ucfirst}]: + [{$oView->getControllerTitle($aClassUser->classname)}] [{else}] - undefined: + undefined [{/if}] + [{if $aClassUser->page}] + "[{$aClassUser->page}]" + [{/if}] + : [{$aClassUser->counter}]  From 3e287f888a28872f6da716275790ad612e7a588e Mon Sep 17 00:00:00 2001 From: Daniel Seifert Date: Tue, 21 Nov 2017 11:32:40 +0100 Subject: [PATCH 5/9] add group switch --- .../controllers/admin/d3_usersonline_statistic.php | 11 ++++++++++- .../modules/d3/d3usersonline/models/d3usersonline.php | 11 ++++++++--- .../views/admin/tpl/d3_usersonline_statistic.tpl | 8 +++++++- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/copy_this/modules/d3/d3usersonline/controllers/admin/d3_usersonline_statistic.php b/copy_this/modules/d3/d3usersonline/controllers/admin/d3_usersonline_statistic.php index e39df09..3c14f46 100644 --- a/copy_this/modules/d3/d3usersonline/controllers/admin/d3_usersonline_statistic.php +++ b/copy_this/modules/d3/d3usersonline/controllers/admin/d3_usersonline_statistic.php @@ -21,6 +21,15 @@ class d3_usersonline_statistic extends d3_cfg_mod_main protected $_sMenuSubItemTitle = 'd3mxusersonline_analysis'; + public $blGroupByClass = false; + + public function render() + { + $this->blGroupByClass = oxRegistry::getConfig()->getRequestParameter('groupbyclass') == 'true'; + $this->addTplParam('blGroupByClass', $this->blGroupByClass); + return parent::render(); + } + /** * @return array */ @@ -29,7 +38,7 @@ class d3_usersonline_statistic extends d3_cfg_mod_main /** @var d3usersonline $oUsersOnline */ $oUsersOnline = oxNew('d3usersonline'); $oUsersOnline->clearOldItems($this->_iExpTime); - return $oUsersOnline->getUserCount(); + return $oUsersOnline->getUserCount($this->blGroupByClass); } public function getControllerTitle($sControllerIdent) diff --git a/copy_this/modules/d3/d3usersonline/models/d3usersonline.php b/copy_this/modules/d3/d3usersonline/models/d3usersonline.php index 65f9dce..531209f 100644 --- a/copy_this/modules/d3/d3usersonline/models/d3usersonline.php +++ b/copy_this/modules/d3/d3usersonline/models/d3usersonline.php @@ -66,12 +66,17 @@ class d3usersonline extends oxbase /** * @return array */ - public function getUserCount() + public function getUserCount($blGroupByClass = false) { startProfile(__METHOD__); - $sSelect = "select count(oxid) AS counter, oxclass, oxpage from ". - $this->getViewName()." GROUP BY oxclass, oxpage ORDER BY counter desc"; + if ($blGroupByClass) { + $sSelect = "SELECT count(oxid) AS counter, oxclass FROM " . + $this->getViewName() . " GROUP BY oxclass ORDER BY counter DESC"; + } else { + $sSelect = "select count(oxid) AS counter, oxclass, oxpage from ". + $this->getViewName()." GROUP BY oxclass, oxpage ORDER BY counter desc"; + } $aRecords = oxDb::getDb(oxDb::FETCH_MODE_ASSOC)->getAll($sSelect); $iAllCounter = 0; diff --git a/copy_this/modules/d3/d3usersonline/views/admin/tpl/d3_usersonline_statistic.tpl b/copy_this/modules/d3/d3usersonline/views/admin/tpl/d3_usersonline_statistic.tpl index 9ceffeb..4b0b8ad 100644 --- a/copy_this/modules/d3/d3usersonline/views/admin/tpl/d3_usersonline_statistic.tpl +++ b/copy_this/modules/d3/d3usersonline/views/admin/tpl/d3_usersonline_statistic.tpl @@ -39,6 +39,10 @@ - - - - - - - - + + EOT; echo "

" . $this->translate('RequCheck') . ' "' . $this->oConfig->sModName . ' ' . $sModVersion . '"

'; echo '

' . $this->translate('ExecNotice') . '

' . PHP_EOL; @@ -777,6 +923,14 @@ EOT; $sScriptName = $_SERVER['SCRIPT_NAME']; $sTranslShopPhpInfo = $this->translate('showPhpInfo'); $sTranslDependent = $this->translate('dependentoffurther'); + + if (count($this->oBase->getMessages())) { + echo '
    '; + foreach ($this->oBase->getMessages() as $sMessage) { + echo '
  • '.$sMessage.'
  • '; + } + echo '
'; + } if ($this->oBase->blGlobalResult) { echo '

' . $this->translate('globalSuccess') . '' . @@ -806,6 +960,29 @@ EOT; return; } + /** + * @param $aResult + * + * @return bool + */ + protected function hasRemoteVersionDiff($aResult) + { + $blDiff = false; + + if (is_array($aResult) + && isset($aResult[$this->oBase->sVersionTag]) + && is_array($aResult[$this->oBase->sVersionTag]) + ) { + foreach ($aResult[$this->oBase->sVersionTag] as $sRemoteVersion) { + if (version_compare($sRemoteVersion, $this->oBase->getVersion(), '!=')) { + $blDiff = true; + } + } + } + + return $blDiff; + } + /** * @param $aResult * @param $sElementId @@ -814,12 +991,19 @@ EOT; */ public function getNoSuccessItem($aResult, $sElementId, $sCheckType, $aConfiguration) { - echo "

" . + $sText = ''; + $sDesc = ''; + if ($this->hasRemoteVersionDiff($aResult)) { + $sText = '!'; + $sDesc = strip_tags($this->translate('RemoteVersionDiff')); + } + + echo '
'.$sText.'
' . $this->_addToggleScript($aResult, $sElementId) . $this->translate($sCheckType, $aConfiguration) . $this->_addDescBox($sCheckType.'_DESC', $aConfiguration) . - "
" . PHP_EOL; + '
' . PHP_EOL; $this->getSubDirItems($aResult, $sElementId); } @@ -832,12 +1016,19 @@ EOT; */ public function getSuccessItem($aResult, $sElementId, $sCheckType, $aConfiguration) { - echo "
" . + $sText = ''; + $sDesc = ''; + if ($this->hasRemoteVersionDiff($aResult)) { + $sText = '!'; + $sDesc = strip_tags($this->translate('RemoteVersionDiff')); + } + + echo '
'.$sText.'
' . $this->_addToggleScript($aResult, $sElementId) . $this->translate($sCheckType, $aConfiguration) . $this->_addDescBox($sCheckType.'_DESC', $aConfiguration) . - "
" . PHP_EOL; + '
' . PHP_EOL; $this->getSubDirItems($aResult, $sElementId); } @@ -850,12 +1041,19 @@ EOT; */ public function getUnknownItem($aResult, $sElementId, $sCheckType, $aConfiguration) { - echo "
" . + $sText = ''; + $sDesc = ''; + if ($this->hasRemoteVersionDiff($aResult)) { + $sText = '!'; + $sDesc = strip_tags($this->translate('RemoteVersionDiff')); + } + + echo '
'.$sText.'
' . $this->_addToggleScript($aResult, $sElementId) . $this->translate($sCheckType, $aConfiguration) . $this->_addDescBox($sCheckType.'_DESC', $aConfiguration) . - "
" . PHP_EOL; + '
' . PHP_EOL; $this->getSubDirItems($aResult, $sElementId); } @@ -866,11 +1064,11 @@ EOT; */ public function getUncheckableItem($sCheckType, $aConfiguration) { - echo "
" . - $this->translate($sCheckType, $aConfiguration) . " (" . $this->translate('RequNotCheckable') . ")" . + echo '
' . + $this->translate($sCheckType, $aConfiguration) . ' (' . $this->translate('RequNotCheckable') . ')' . $this->_addDescBox($sCheckType.'_DESC', $aConfiguration) . - "
" . PHP_EOL; + '
' . PHP_EOL; } /** @@ -880,20 +1078,33 @@ EOT; public function getSubDirItems($aResult, $sElementId) { if (is_array($aResult) && count($aResult)) { - echo "' . PHP_EOL; } } @@ -929,6 +1140,7 @@ EOT; protected function _addDescBox($sTextIdent, $aConfiguration) { $sContent = "
?". + "
". "
".$this->translate($sTextIdent, $aConfiguration)."
". "
"; @@ -1116,7 +1328,7 @@ class requTranslations 'Ihres Shops aus. Nur dann können die Prüfungen erfolgreich durchgeführt werden.', 'RequSucc' => 'Bedingung erfüllt', 'RequNotSucc' => 'Bedingung nicht erfüllt', - 'RequUnknown' => 'Bedingung nicht prüfbar', + 'RequUnknown' => 'Bedingung unklar, siehe Hinweise im Hilfetext', 'RequNotCheckable' => 'Bedingung nicht prüfbar', 'hasMinPhpVersion' => 'mindestens PHP Version %1$s', 'hasMinPhpVersion_DESC' => '
Das Modul erfordert eine PHP-Version die nicht kleiner ist '. @@ -1125,12 +1337,14 @@ class requTranslations 'ist auf Ihrem Server aktiv.
'. '
Das Modul kann in '. 'PHP-Versionen kleiner als %1$s nicht ausgeführt werden. Fragen Sie Ihren Serverprovider '. - 'nach der Anpassung der PHP-Installation.
'. + 'nach der Anpassung der PHP-Installation oder kontaktieren Sie uns für eine alternative '. + 'Modulversion.'. '
Über den [+]-Button können Sie Ergebnisse zu den getesteten Verzeichnissen '. 'abrufen. Je nach Servereinstellung können die Ergebnisse abweichen. Nur die rot markierten '. 'Verzeichnisse erfordern eine Anpassung.
'. - '
Details zu Ihrer Serverinstallation sehen Sie durch Klick auf den Button "PHPInfo anzeigen".'. - '
', + '
Details zu Ihrer Serverinstallation sehen Sie durch Klick auf den Button "PHPInfo anzeigen". '. + 'Bei Fragen kontaktieren Sie uns bitte über '. + 'support@shopmodule.com.
', 'hasMaxPhpVersion' => 'maximal PHP Version %1$s', 'hasMaxPhpVersion_DESC' => '
Das Modul erfordert eine PHP-Version die nicht höher ist '. 'als %1$s.
'. @@ -1138,24 +1352,28 @@ class requTranslations 'ist auf Ihrem Server aktiv.'. '
Das Modul kann in '. 'PHP-Versionen höher als %1$s nicht ausgeführt werden. Fragen Sie Ihren Serverprovider '. - 'nach der Anpassung der PHP-Installation.
'. + 'nach der Anpassung der PHP-Installation oder kontaktieren Sie uns für eine alternative '. + 'Modulversion.'. '
Über den [+]-Button können Sie Ergebnisse zu den getesteten Verzeichnissen '. 'abrufen. Je nach Servereinstellung können die Ergebnisse abweichen. Nur die rot markierten '. 'Verzeichnisse erfordern eine Anpassung.
'. - '
Details zu Ihrer Serverinstallation sehen Sie durch Klick auf den Button "PHPInfo anzeigen".'. - '
', + '
Details zu Ihrer Serverinstallation sehen Sie durch Klick auf den Button "PHPInfo anzeigen". '. + 'Bei Fragen kontaktieren Sie uns bitte über '. + 'support@shopmodule.com.
', 'hasFromToPhpVersion' => 'Server verwendet PHP Version zwischen %1$s und %2$s', 'hasFromToPhpVersion_DESC' => '
Das Modul erfordert eine PHP-Version zwischen %1$s und %2$s.
'. '
Die passende PHP-Version '. 'ist auf Ihrem Server aktiv.
'. '
Das Modul kann '. 'außerhalb der PHP-Versionen nicht ausgeführt werden. Fragen Sie Ihren Serverprovider '. - 'nach der Anpassung der PHP-Installation.
'. + 'nach der Anpassung der PHP-Installation oder kontaktieren Sie uns für eine alternative '. + 'Modulversion.'. '
Über den [+]-Button können Sie Ergebnisse zu den getesteten Verzeichnissen '. 'abrufen. Je nach Servereinstellung können die Ergebnisse abweichen. Nur die rot markierten '. 'Verzeichnisse erfordern eine Anpassung.
'. - '
Details zu Ihrer Serverinstallation sehen Sie durch Klick auf den Button "PHPInfo anzeigen".'. - '
', + '
Details zu Ihrer Serverinstallation sehen Sie durch Klick auf den Button "PHPInfo anzeigen". '. + 'Bei Fragen kontaktieren Sie uns bitte über '. + 'support@shopmodule.com.
', 'hasExtension' => '%1$s-Erweiterung verfügbar', 'hasExtension_DESC' => '
Das Modul erfordert die %1$s-Servererweiterung.
'. '
Die %1$s-Erweiterung ist '. @@ -1166,8 +1384,35 @@ class requTranslations '
Über den [+]-Button können Sie Ergebnisse zu den getesteten Verzeichnissen '. 'abrufen. Je nach Servereinstellung können die Ergebnisse abweichen. Nur die rot markierten '. 'Verzeichnisse erfordern eine Anpassung.
'. - '
Details zu Ihrer Serverinstallation sehen Sie durch Klick auf den Button "PHPInfo anzeigen".'. - '
', + '
Details zu Ihrer Serverinstallation sehen Sie durch Klick auf den Button "PHPInfo anzeigen". '. + 'Bei Fragen kontaktieren Sie uns bitte über '. + 'support@shopmodule.com.
', + 'hasMinCurlVersion' => 'mindestens cURL Version %1$s', + 'hasMinCurlVersion_DESC' => '
Das Modul benötigt cURL ab der Version %1$s.
'. + '
cURL ist in '. + 'passender Version installiert.
'. + '
cURL ist nicht oder in einer '. + 'älteren Version installiert. Fragen Sie Ihren Serverprovider nach einer passenden '. + 'cURL-Version.
'. + '
Über den [+]-Button können Sie Ergebnisse zu den getesteten Verzeichnissen '. + 'abrufen. Je nach Servereinstellung können die Ergebnisse abweichen. Nur die rot markierten '. + 'Verzeichnisse erfordern eine Anpassung.
'. + '
Details zu Ihrer Serverinstallation sehen Sie durch Klick auf den Button "PHPInfo anzeigen". '. + 'Bei Fragen kontaktieren Sie uns bitte über '. + 'support@shopmodule.com.
', + 'hasMinOpenSSLVersion' => 'mindestens OpenSSL Version %1$s', + 'hasMinOpenSSLVersion_DESC' => '
Das Modul benötigt OpenSSL ab der Version %1$s.
'. + '
OpenSSL ist in '. + 'passender Version installiert.
'. + '
OpenSSL ist nicht oder in '. + 'einer älteren Version installiert. Fragen Sie Ihren Serverprovider nach einer passenden '. + 'OpenSSL-Version.
'. + '
Über den [+]-Button können Sie Ergebnisse zu den getesteten Verzeichnissen '. + 'abrufen. Je nach Servereinstellung können die Ergebnisse abweichen. Nur die rot markierten '. + 'Verzeichnisse erfordern eine Anpassung.
'. + '
Details zu Ihrer Serverinstallation sehen Sie durch Klick auf den Button "PHPInfo anzeigen". '. + 'Bei Fragen kontaktieren Sie uns bitte über '. + 'support@shopmodule.com.
', 'hasMinShopVersion' => 'mindestens Shop Version %1$s', 'hasMinShopVersion_DESC' => '
Das Modul ist ab Shopversion %1$s freigegeben.
'. '
Die Shopsoftware ist in '. @@ -1175,16 +1420,16 @@ class requTranslations '
Das Modul kann in dieser '. 'Version der Shopsoftware nicht installiert werden. Fragen Sie nach einer früheren '. 'Modulversion, die für Ihre Shopversion getestet wurde.
'. - '
Bei Fragen wenden Sie sich bitte an '. + '', 'hasMaxShopVersion' => 'maximal Shop Version %1$s', 'hasMaxShopVersion_DESC' => '
Das Modul ist bis zur Shopversion %1$s freigegeben.
'. '
Die Shopsoftware ist in '. 'passender Version installiert.
'. - '
Das Modul kann in dieser '. - 'Version der Shopsoftware nicht installiert werden. Fragen Sie nach einer aktuelleren '. + '
Wir können nicht '. + 'garantieren, dass das Modul in Ihrer Shopversion funktioniert. Fragen Sie nach einer aktuelleren '. 'Modulversion, die für Ihren Shop passt.
'. - '
Bei Fragen wenden Sie sich bitte an '. + '', 'hasMinModCfgVersion' => '%2$s (ModCfg-Eintrag "%1$s") mindestens in Version %3$s', 'hasMinModCfgVersion_DESC' => '
Das Modul benötigt die Zusatzsoftware "%2$s" mindestens in '. @@ -1194,7 +1439,7 @@ class requTranslations '
Die Zusatzsoftware ist '. 'möglicherweise gar nicht oder in falscher Version installiert. Bitte installieren Sie die '. 'Zusatzsoftware, bevor Sie diese Installation fortsetzen.
'. - '
Bei Fragen wenden Sie sich bitte an '. + '', 'hasMaxModCfgVersion' => '%2$s (ModCfg-Eintrag "%1$s") maximal in Version %3$s', 'hasMaxModCfgVersion_DESC' => '
Das Modul benötigt die Zusatzsoftware "%2$s" höchstens '. @@ -1204,7 +1449,7 @@ class requTranslations '
Die Zusatzsoftware ist '. 'möglicherweise gar nicht oder in falscher Version installiert. Bitte installieren Sie die '. 'Zusatzsoftware, bevor Sie diese Installation fortsetzen.
'. - '
Bei Fragen wenden Sie sich bitte an '. + '', 'requireNewLicence' => 'bisheriger Lizenzschlüssel kann verwendet werden', 'requireNewLicence_DESC' => '
Diese Prüfung versucht zu ermitteln, ob Sie für den '. @@ -1230,7 +1475,7 @@ class requTranslations 'Connector nicht ausgeführt werden. Bitte laden Sie sich diesen kostenfrei aus unserem Shop '. 'unter www.oxidmodule.com/'. 'connector/ und installieren diesen vorab.
'. - '
Bei Fragen wenden Sie sich bitte an '. + '', 'isShopEdition' => 'ist Shopedition %1$s', 'isShopEdition_DESC' => '
Das Modul erfordert eine dieser Shopeditionen: %1$s
'. @@ -1239,39 +1484,67 @@ class requTranslations '
Das Modul kann in Ihrer '. 'Shopedition nicht ausgeführt werden. Bitte fragen Sie nach einer Modulversion für Ihre '. 'Shopedition.
'. - '
Bei Fragen wenden Sie sich bitte an '. + '', 'hasZendLoaderOptimizer' => 'Zend Optimizer (PHP 5.2) oder Zend Guard Loader (PHP 5.3, 5.4, 5.5, 5.6) '. - 'installiert', + 'installiert (auf passendes Zend-Installationspaket achten!)', 'hasZendLoaderOptimizer_DESC' => '
Das Modul erfordert (je nach PHP-Version) den Zend Optimizer '. - 'bzw. den Zend Guard Loader.
'. + 'bzw. den Zend Guard Loader. Achten Sie darauf, ein für den verfügbaren Decoder '. + 'erstelltes Installationspaket zu verwenden.
'. '
Der passende Decoder ist '. 'auf Ihrem Server installiert.
'. + '
Der passende Decoder ist '. + 'auf Ihrem Server installiert. Es ist eine zusätzliche Erweiterungen (Zend OPcache) installiert, '. + 'die im Zusammenspiel mit dem Decoder Fehler verursachen kann.
'. '
Das Modul kann ohne den '. 'passenden Decoder nicht ausgeführt werden. Fragen Sie Ihren Serverprovider nach der '. 'Installation des passenden Zend-Decoders.
'. '
Über den [+]-Button können Sie Ergebnisse zu den getesteten Verzeichnissen '. 'abrufen. Je nach Servereinstellung können die Ergebnisse abweichen. Nur die rot markierten '. 'Verzeichnisse erfordern eine Anpassung.
'. - '
Details zu Ihrer Serverinstallation sehen Sie durch Klick auf den Button "PHPInfo anzeigen".'. - '
', - 'hasIonCubeLoader' => 'ionCube Loader installiert', - 'hasIonCubeLoader_DESC' => '
Das Modul erfordert den IonCube Loader.
'. + '
Details zu Ihrer Serverinstallation sehen Sie durch Klick auf den Button "PHPInfo anzeigen". '. + 'Bei Fragen kontaktieren Sie uns bitte über '. + 'support@shopmodule.com.
', + 'hasIonCubeLoader' => 'ionCube Loader installiert (auf passendes ionCube-Installationspaket achten!)', + 'hasIonCubeLoader_DESC' => '
Das Modul erfordert den ionCube Loader. Achten Sie darauf, ein '. + 'für den verfügbaren Decoder erstelltes Installationspaket zu verwenden.
'. '
Der passende Decoder ist '. 'auf Ihrem Server installiert.
'. '
Das Modul kann ohne den '. 'passenden Decoder nicht ausgeführt werden. Fragen Sie Ihren Serverprovider nach der '. - 'Installation des IonCube Loaders.
'. + 'Installation des ionCube Loaders.
'. '
Über den [+]-Button können Sie Ergebnisse zu den getesteten Verzeichnissen '. 'abrufen. Je nach Servereinstellung können die Ergebnisse abweichen. Nur die rot markierten '. 'Verzeichnisse erfordern eine Anpassung.
'. - '
Details zu Ihrer Serverinstallation sehen Sie durch Klick auf den Button "PHPInfo anzeigen".'. - '
', + '
Details zu Ihrer Serverinstallation sehen Sie durch Klick auf den Button "PHPInfo anzeigen". '. + 'Bei Fragen kontaktieren Sie uns bitte über '. + 'support@shopmodule.com.
', + 'hasIonCubeOrZendLoader' => 'ionCube Loader oder Zend Optimizer / Guard Loader installiert '. + '(%1$s)', + 'hasIonCubeOrZendLoader_DESC' => '
Das Modul erfordert den ionCube Loader oder den Zend '. + 'Optimizer / Guard Loader. Achten Sie darauf, ein für die verfügbaren Decoder erstelltes '. + 'Installationspaket zu verwenden (%1$s).
'. + '
Ein passender Decoder ist '. + 'auf Ihrem Server installiert.
'. + '
Ein passender Decoder ist '. + 'auf Ihrem Server installiert. Es ist jedoch ein Abbruchgrund festgestellt worden, der zu Fehlern '. + 'führen kann. Details entnehmen Sie bitte den folgenden Hinweisen.
'. + '
Das Modul kann ohne einen '. + 'passenden Decoder nicht ausgeführt werden. Fragen Sie Ihren Serverprovider nach der '. + 'Installation des ionCube Loaders oder des Zend Optimizers / Guard Loaders.
'. + '%2$s'. + '
Über den [+]-Button können Sie Ergebnisse zu den getesteten Verzeichnissen '. + 'abrufen. Je nach Servereinstellung können die Ergebnisse abweichen. Nur die rot markierten '. + 'Verzeichnisse erfordern eine Anpassung.
'. + '
Details zu Ihrer Serverinstallation sehen Sie durch Klick auf den Button "PHPInfo anzeigen". '. + 'Bei Fragen kontaktieren Sie uns bitte über '. + 'support@shopmodule.com.
', + 'RemoteVersionDiff' => ' (Remotescript hat abweichende Version oder ist nicht '. + 'prüfbar, Ergebnis mglw. nicht sicher)', 'globalSuccess' => 'Die technische Prüfung war erfolgreich. Sie können das Modul '. 'installieren.*

', 'globalNotSuccess' => 'Die technische Prüfung war nicht erfolgreich. Bitte kontrollieren '. - 'Sie die rot '. - 'markierten Bedingungen.

', + 'Sie die rot oder orange markierten Bedingungen.

', 'deleteFile1' => 'Löschen Sie diese Datei nach der Verwendung bitte unbedingt wieder von '. 'Ihrem Server! Klicken Sie hier, um diese Datei zu löschen.', @@ -1284,6 +1557,20 @@ class requTranslations 'unableDeleteFile' => 'Datei konnte nicht gelöscht werden. Bitte löschen Sie diese '. 'manuell.', 'goodBye' => 'Auf Wiedersehen.', + 'unableExecuteDirectoryIterator' => 'Es können nicht alle Unterverzeichnisse auf weitere Prüfungen '. + 'kontrolliert werden. (%1$s)', + 'availableDecoder' => 'verfügbar: %1$s - auf passendes Installationspaket achten!', + 'noDecoderAvailable' => 'kein verwendbarer Decoder verfügbar', + 'availableDecoder_hasZendLoaderOptimizer' => 'Zend Guard Loader / Optimizer', + 'notAvailableDecoder_hasZendLoaderOptimizer' => '
  • Der Zend Guard Loader / Optimizer ist nicht '. + 'installiert.
  • ', + 'decoderIssue_hasZendLoaderOptimizer' => '
  • Der Zend-Decoder ist '. + 'auf Ihrem Server installiert. Es ist jedoch eine zusätzliche Erweiterungen (Zend OPcache) '. + 'installiert, die im Zusammenspiel mit dem Zend-Decoder Fehler verursachen kann.
  • ', + 'availableDecoder_hasIonCubeLoader' => 'ionCube Loader', + 'notAvailableDecoder_hasIonCubeLoader' => '
  • Der ionCube Loader ist nicht installiert.
  • ', + 'decoderIssue_hasIonCubeLoader' => '
  • Es wurde ein nicht definierter Abbruchgrund bei der '. + 'Verwendung des ionCube-Decoders festgestellt.
  • ', ), 'en' => array( 'RequCheck' => 'Requirement check', @@ -1291,116 +1578,193 @@ class requTranslations 'case only checks can executed succesfully.', 'RequSucc' => 'condition is fulfilled', 'RequNotSucc' => 'condition isn\'t fulfilled', - 'RequUnknown' => 'condition isn\'t checkable', + 'RequUnknown' => 'condition unclear, see notes in help text', 'RequNotCheckable' => 'condition isn\'t checkable', 'hasMinPhpVersion' => 'at least PHP version %1$s', - 'hasMinPhpVersion_DESC' => '
    requirement check result
    '. - '
    This requirement is '. - 'fulfilled.
    '. - '
    This requirement isn\'t '. - 'fulfilled. The module can\'t installed or executed.
    '. - '
    The [+] button show details for all tested directories. If you have any questions, please '. - 'contact us at support@shopmodule.com.
    ', + 'hasMinPhpVersion_DESC' => '
    The module requires a PHP version at least %1$s
    '. + '
    The appropriate version of PHP '. + 'is activated on your server.
    '. + '
    The module can not be executed within '. + 'the actived PHP version. Ask your server provider for for the adaption of your PHP installation or '. + 'contact us for another module version.
    '. + '
    The [+] button show details for all tested directories. Depending on the server settings, '. + 'the results may vary. Only the red marked directories requires adaptation.
    '. + '
    Details about your server installation you can see by clicking on the button "show PHPinfo". '. + 'If you have any questions, please contact us at '. + 'support@shopmodule.com.
    ', 'hasMaxPhpVersion' => 'not more than PHP version %1$s', - 'hasMaxPhpVersion_DESC' => '
    requirement check result
    '. - '
    This requirement is '. - 'fulfilled.
    '. - '
    This requirement isn\'t '. - 'fulfilled. The module can\'t installed or executed.
    '. - '
    The [+] button show details for all tested directories. If you have any questions, please '. - 'contact us at support@shopmodule.com.
    ', + 'hasMaxPhpVersion_DESC' => '
    The module requires a PHP version not more than %1$s
    '. + '
    The appropriate version of PHP '. + 'is activated on your server.
    '. + '
    The module can not be executed within '. + 'the actived PHP version. Ask your server provider for for the adaption of your PHP installation or '. + 'contact us for another module version.
    '. + '
    The [+] button show details for all tested directories. Depending on the server settings, '. + 'the results may vary. Only the red marked directories requires adaptation.
    '. + '
    Details about your server installation you can see by clicking on the button "show PHPinfo". '. + 'If you have any questions, please contact us at '. + 'support@shopmodule.com.
    ', 'hasFromToPhpVersion' => 'server use PHP version between %1$s and %2$s', - 'hasFromToPhpVersion_DESC'=> '
    requirement check result
    '. - '
    This requirement is '. - 'fulfilled.
    '. - '
    This requirement isn\'t '. - 'fulfilled. The module can\'t installed or executed.
    '. - '
    The [+] button show details for all tested directories. If you have any questions, please '. - 'contact us at support@shopmodule.com.
    ', + 'hasFromToPhpVersion_DESC'=> '
    The module requires a PHP version between %1$s and %2$s
    '. + '
    The appropriate version of PHP '. + 'is activated on your server.
    '. + '
    The module can not be executed within '. + 'the actived PHP version. Ask your server provider for for the adaption of your PHP installation or '. + 'contact us for another module version.
    '. + '
    The [+] button show details for all tested directories. Depending on the server settings, '. + 'the results may vary. Only the red marked directories requires adaptation.
    '. + '
    Details about your server installation you can see by clicking on the button "show PHPinfo". '. + 'If you have any questions, please contact us at '. + 'support@shopmodule.com.
    ', 'hasExtension' => '%1$s extension is available', - 'hasExtension_DESC' => '
    requirement check result
    '. - '
    This requirement is '. - 'fulfilled.
    '. - '
    This requirement isn\'t '. - 'fulfilled. The module can\'t installed or executed.
    '. - '
    The [+] button show details for all tested directories. If you have any questions, please '. - 'contact us at support@shopmodule.com.
    ', + 'hasExtension_DESC' => '
    The module requires the %1$s server extension.
    '. + '
    The %1$s server extension is '. + 'available on your server.
    '. + '
    The module can not be executed '. + 'without the %1$s extension. Ask your server provider for installing this extension.
    '. + '
    The [+] button show details for all tested directories. Depending on the server settings, '. + 'the results may vary. Only the red marked directories requires adaptation.
    '. + '
    Details about your server installation you can see by clicking on the button "show PHPinfo". '. + 'If you have any questions, please contact us at '. + 'support@shopmodule.com.
    ', + 'hasMinCurlVersion' => 'at least cURL version %1$s', + 'hasMinCurlVersion_DESC' => '
    The module requires at least cURL version %1$s.
    '. + '
    cURL is available '. + 'in a compatible version.
    '. + '
    cURL is not installed or '. + 'installed in an older version. Ask your server provider for an appropriate version.
    '. + '
    The [+] button show details for all tested directories. Depending on the server settings, '. + 'the results may vary. Only the red marked directories requires adaptation.
    '. + '
    Details about your server installation you can see by clicking on the button "show PHPinfo". '. + 'If you have any questions, please contact us at '. + 'support@shopmodule.com.
    ', + 'hasMinOpenSSLVersion' => 'at least OpenSSL version %1$s', + 'hasMinOpenSSLVersion_DESC' => '
    The module requires at least OpenSSL version %1$s.
    '. + '
    OpenSSL is availabe '. + 'in a compatible version.
    '. + '
    OpenSSL is not installed or '. + 'installed in an older version. Ask your server provider for an appropriate version.
    '. + '
    The [+] button show details for all tested directories. Depending on the server settings, '. + 'the results may vary. Only the red marked directories requires adaptation.
    '. + '
    Details about your server installation you can see by clicking on the button "show PHPinfo". '. + 'If you have any questions, please contact us at '. + 'support@shopmodule.com.
    ', 'hasMinShopVersion' => 'at least shop version %1$s', - 'hasMinShopVersion_DESC' => '
    requirement check result
    '. - '
    This requirement is '. - 'fulfilled.
    '. - '
    This requirement isn\'t '. - 'fulfilled. The module can\'t installed or executed.
    '. - '
    The [+] button show details for all tested directories. If you have any questions, please '. - 'contact us at support@shopmodule.com.
    ', + 'hasMinShopVersion_DESC' => '
    The module is released to shop version %1$s
    '. + '
    The shop software is installed '. + 'in a compatible version.
    '. + '
    We can not guarantee, '. + 'that this module works properly in your shop version. Please ask for a matching module version.
    '. + '
    If you have any questions, please contact us at '. + 'support@shopmodule.com.
    ', 'hasMaxShopVersion' => 'not more than shop version %1$s', - 'hasMaxShopVersion_DESC' => '
    requirement check result
    '. - '
    This requirement is '. - 'fulfilled.
    '. - '
    This requirement isn\'t '. - 'fulfilled. The module can\'t installed or executed.
    '. - '
    The [+] button show details for all tested directories. If you have any questions, please '. - 'contact us at support@shopmodule.com.
    ', - 'hasMinModCfgVersion' => '%2$s (ModCfg item "%1$s") has at least version %3$s', - 'hasMinModCfgVersion_DESC' => '
    requirement check result
    '. - '
    This requirement is '. - 'fulfilled.
    '. - '
    This requirement isn\'t '. - 'fulfilled. The module can\'t installed or executed.
    '. - '
    The [+] button show details for all tested directories. If you have any questions, please '. - 'contact us at support@shopmodule.com.
    ', - 'hasMaxModCfgVersion' => '%2$s (ModCfg item "%1$s") has not more than version %3$s', - 'hasMaxModCfgVersion_DESC' => '
    requirement check result
    '. - '
    This requirement is '. - 'fulfilled.
    '. - '
    This requirement isn\'t '. - 'fulfilled. The module can\'t installed or executed.
    '. - '
    The [+] button show details for all tested directories. If you have any questions, please '. - 'contact us at support@shopmodule.com.
    ', + 'hasMaxShopVersion_DESC' => '
    The module is released to shop version %1$s
    '. + '
    The shop software is installed '. + 'in a compatible version.
    '. + '
    We can not guarantee, '. + 'that this module works properly in your shop version. Please ask for a matching module version.
    '. + '
    If you have any questions, please contact us at '. + 'support@shopmodule.com.
    ', + 'hasMinModCfgVersion' => '%2$s (ModCfg item "%1$s") at least in version %3$s', + 'hasMinModCfgVersion_DESC' => '
    The module requires additional software "%2$s" at least '. + 'in version %3$s
    '. + '
    The software is installed '. + 'in a compatible version.
    '. + '
    The additional software is '. + 'not installed or in wrong version available. Please install the additional software before '. + 'proceeding this installation.
    '. + '
    If you have any questions, please contact us at '. + 'support@shopmodule.com.
    ', + 'hasMaxModCfgVersion' => '%2$s (ModCfg item "%1$s") not more than in version %3$s', + 'hasMaxModCfgVersion_DESC' => '
    The module requires additional software "%2$s" not more than '. + 'in version %3$s
    '. + '
    The software is installed '. + 'in a compatible version.
    '. + '
    The additional software is '. + 'be installed or in wrong version available. Please install the additional software before '. + 'proceeding this installation.
    '. + '
    If you have any questions, please contact us at '. + 'support@shopmodule.com.
    ', 'requireNewLicence' => 'former licence key can be used', - 'requireNewLicence_DESC' => '
    requirement check result
    '. - '
    This requirement is '. - 'fulfilled.
    '. - '
    This requirement isn\'t '. - 'fulfilled. The module can\'t installed or executed.
    '. - '
    The [+] button show details for all tested directories. If you have any questions, please '. - 'contact us at support@shopmodule.com.
    ', + 'requireNewLicence_DESC' => '
    This test tries to determine whether you need a new licence key '. + 'for the use of this module
    '. + '
    You have stored a license key '. + 'for this module, which is probably also compatible for the new module version.
    '. + '
    You need likely a new license '. + 'key for this module. Do you have already one, run the installation and then apply the license '. + 'key in the admin panel of your shop. Otherwise, you can purchase it in our shop '. + 'oxidmodule.com or also create a '. + 'free trial license key in the admin panel of your shop.
    '. + '
    If you have any questions, please contact us at '. + 'buchhaltung@shopmodule.com.
    ', 'hasModCfg' => 'Module '. 'Connector installed', - 'hasModCfg_DESC' => '
    requirement check result
    '. - '
    This requirement is '. - 'fulfilled.
    '. - '
    This requirement isn\'t '. - 'fulfilled. The module can\'t installed or executed.
    '. - '
    The [+] button show details for all tested directories. If you have any questions, please '. - 'contact us at support@shopmodule.com.
    ', + 'hasModCfg_DESC' => '
    The module requires necessarily the D3 Module Connector.
    '. + '
    The Module Connector is '. + 'installed.
    '. + '
    The module can not be executed '. + 'without the Module Connector. Please download this free of charge from our shop '. + 'www.oxidmodule.com/'. + 'connector/ and install it beforehand.
    '. + '
    If you have any questions, please contact us at '. + 'support@shopmodule.com.
    ', 'isShopEdition' => 'shop edition is %1$s', - 'isShopEdition_DESC' => '
    requirement check result
    '. - '
    This requirement is '. - 'fulfilled.
    '. - '
    This requirement isn\'t '. - 'fulfilled. The module can\'t installed or executed.
    '. - '
    The [+] button show details for all tested directories. If you have any questions, please '. - 'contact us at support@shopmodule.com.
    ', - 'hasZendLoaderOptimizer' => 'Zend Optimizer (PHP 5.2) or Zend Guard Loader (PHP 5.3, 5.4, 5.5, 5.6) installed', - 'hasZendLoaderOptimizer_DESC' => '
    requirement check result
    '. - '
    This requirement is '. - 'fulfilled.
    '. - '
    This requirement isn\'t '. - 'fulfilled. The module can\'t installed or executed.
    '. - '
    The [+] button show details for all tested directories. If you have any questions, please '. - 'contact us at support@shopmodule.com.
    ', - 'hasIonCubeLoader' => 'ionCube loader installed', - 'hasonCubeLoader_DESC' => '
    requirement check result
    '. - '
    This requirement is '. - 'fulfilled.
    '. - '
    This requirement isn\'t '. - 'fulfilled. The module can\'t installed or executed.
    '. - '
    The [+] button show details for all tested directories. If you have any questions, please '. - 'contact us at support@shopmodule.com.
    ', + 'isShopEdition_DESC' => '
    The module requires one of these shop editions: %1$s
    '. + '
    The shop is installed '. + 'in the appropriate edition.
    '. + '
    The module can not be executed '. + 'in your shop edition. Please ask for a module version for your shop edition.
    '. + '
    If you have any questions, please contact us at '. + 'support@shopmodule.com.
    ', + 'hasZendLoaderOptimizer' => 'Zend Optimizer (PHP 5.2) or Zend Guard Loader (PHP 5.3, 5.4, 5.5, 5.6) '. + 'installed (pay attention to the compatible Zend installation package!)', + 'hasZendLoaderOptimizer_DESC' => '
    The module requires (depending on the PHP version) the Zend Guard Optimizer '. + 'or the Zend Guard Loader.
    '. + '
    The appropriate decoder is '. + 'installed on your server.
    '. + '
    The decoder is '. + 'installed on your server. There is an additional installed extension (Zend OPcache), '. + 'which can cause errors in combination with the decoder.
    '. + '
    The decoder isn\'t '. + 'installed on your server. The module can\'t installed or executed. Please contact your server provider.
    '. + '
    The [+] button show details for all tested directories. Depending on the server settings, '. + 'the results may vary. Only the red marked directories requires adaptation.
    '. + '
    Details about your server installation you can see by clicking on the button "show PHPinfo". '. + 'If you have any questions, please contact us at '. + 'support@shopmodule.com.
    ', + 'hasIonCubeLoader' => 'ionCube Loader installed (pay attention to the compatible ionCube installation package!)', + 'hasIonCubeLoader_DESC' => '
    The module requires the ionCube Loader.
    '. + '
    The appropriate decoder is '. + 'installed on your server.
    '. + '
    The decoder isn\'t '. + 'installed on your server. The module can\'t installed or executed. Please contact your server provider.
    '. + '
    The [+] button show details for all tested directories. Depending on the server settings, '. + 'the results may vary. Only the red marked directories requires adaptation.
    '. + '
    Details about your server installation you can see by clicking on the button "show PHPinfo". '. + 'If you have any questions, please contact us at '. + 'support@shopmodule.com.
    ', + 'hasIonCubeOrZendLoader' => 'ionCube Loader or Zend Optimizer / Guard Loader installed '. + '(%1$s)', + 'hasIonCubeOrZendLoader_DESC' => '
    The module requires the ionCube Loader or the Zend '. + 'Optimizer / Guard Loader. Pay attention to use a compatible installation package (%1$s).
    '. + '
    One of the appropriate '. + 'decoders is installed on your server.
    '. + '
    One of the appropriate '. + 'decoder is installed on your server. An undefined abort reason has been found, which can cause '. + 'to errors. For details, please refer to the following notes.
    '. + '
    None of the decoders is '. + 'installed on your server. The module can\'t installed or executed. Please contact your server provider.
    '. + '%2$s'. + '
    The [+] button show details for all tested directories. Depending on the server settings, '. + 'the results may vary. Only the red marked directories requires adaptation.
    '. + '
    Details about your server installation you can see by clicking on the button "show PHPinfo". '. + 'If you have any questions, please contact us at '. + 'support@shopmodule.com.
    ', + 'RemoteVersionDiff' => ' (Remote script has different version or isn\'t '. + 'callable, result may not be safe)', 'globalSuccess' => 'The technical test was successful. Your server is ready for installing '. 'the module.*

    ', - 'globalNotSuccess' => 'The technical test wasn\'t successfull. Please check the red marked '. + 'globalNotSuccess' => 'The technical test wasn\'t successfull. Please check the red or orange marked '. 'conditions.

    ', 'deleteFile1' => 'Please delete this file after use on your server! Click here, to delete this file.', @@ -1412,6 +1776,19 @@ class requTranslations 'toggleswitch' => 'click for details', 'unableDeleteFile' => 'Unable to delete file. Please delete it manually.', 'goodBye' => 'Good Bye.', + 'unableExecuteDirectoryIterator' => 'Unable to check subdirectories for further checks. (%1$s)', + 'availableDecoder' => 'available: %1$s - pay attention to the compatible installation package!', + 'noDecoderAvailable' => 'no usable decoder available', + 'availableDecoder_hasZendLoaderOptimizer' => 'Zend Guard Loader / Optimizer', + 'notAvailableDecoder_hasZendLoaderOptimizer' => '
  • Zend Guard Loader / Optimizer isn\'t '. + 'available.
  • ', + 'decoderIssue_hasZendLoaderOptimizer' => '
  • The Zend decoder is '. + 'installed on your server. There is an additional installed extension (Zend OPcache), '. + 'which can cause errors in combination with the decoder.
  • ', + 'availableDecoder_hasIonCubeLoader' => 'ionCube Loader', + 'notAvailableDecoder_hasIonCubeLoader' => '
  • ionCube Loader isn\'t available.
  • ', + 'decoderIssue_hasIonCubeLoader' => '
  • An undefined abort reason has been found when using the '. + 'ionCube decoder.
  • ', ), ); } @@ -1657,7 +2034,7 @@ class requTests */ public function hasMinPhpVersion(&$aConfiguration) { - $aResult[$this->getBasePath()] = false; + $aResult = array($this->getBasePath() => false); if (version_compare(phpversion(), $aConfiguration['aParams']['version'], '>=')) { $aResult[$this->getBasePath()] = true; @@ -1675,7 +2052,7 @@ class requTests */ public function hasFromToPhpVersion(&$aConfiguration) { - $aResult[$this->getBasePath()] = false; + $aResult = array($this->getBasePath() => false); if ((version_compare(phpversion(), $aConfiguration['aParams']['from'], '>=')) && (version_compare(phpversion(), $aConfiguration['aParams']['to'], '<')) @@ -1695,7 +2072,7 @@ class requTests */ public function hasMaxPhpVersion(&$aConfiguration) { - $aResult[$this->getBasePath()] = false; + $aResult = array($this->getBasePath() => false); if (version_compare(phpversion(), $aConfiguration['aParams']['version'], '<=')) { $aResult[$this->getBasePath()] = true; @@ -1713,7 +2090,7 @@ class requTests */ public function hasExtension(&$aConfiguration) { - $aResult[$this->getBasePath()] = false; + $aResult = array($this->getBasePath() => false); if (extension_loaded($aConfiguration['aParams']['type'])) { $aResult[$this->getBasePath()] = true; @@ -1724,6 +2101,69 @@ class requTests return $aResult; } + /** + * @param $aConfiguration + * @return array + */ + public function hasMinCurlVersion(&$aConfiguration) + { + $aCurlVersion = curl_version(); + $aResult = array( + $this->getBasePath() => version_compare($aCurlVersion['version'], $aConfiguration['aParams']['version'], '>=') + ); + + $aResult = array_merge($aResult, $this->checkInSubDirs(__FUNCTION__, $aConfiguration['aParams'])); + + return $aResult; + } + + /** + * @param $aConfiguration + * @return array + */ + public function hasMinOpenSSLVersion(&$aConfiguration) + { + $aResult = array( + $this->getBasePath() => version_compare($this->get_openssl_version_number(true), $aConfiguration['aParams']['version'], '>=') + ); + + $aResult = array_merge($aResult, $this->checkInSubDirs(__FUNCTION__, $aConfiguration['aParams'])); + + return $aResult; + } + + /** + * @param bool $patch_as_number + * @param null $openssl_version_number + * @return bool|string + */ + protected function get_openssl_version_number($patch_as_number=false,$openssl_version_number=null) { + if (is_null($openssl_version_number)) $openssl_version_number = OPENSSL_VERSION_NUMBER; + $openssl_numeric_identifier = str_pad((string)dechex($openssl_version_number),8,'0',STR_PAD_LEFT); + + $openssl_version_parsed = array(); + $preg = '/(?[[:xdigit:]])(?[[:xdigit:]][[:xdigit:]])(?[[:xdigit:]][[:xdigit:]])'; + $preg.= '(?[[:xdigit:]][[:xdigit:]])(?[[:xdigit:]])/'; + preg_match_all($preg, $openssl_numeric_identifier, $openssl_version_parsed); + $openssl_version = false; + if (!empty($openssl_version_parsed)) { + $alphabet = array(1=>'a',2=>'b',3=>'c',4=>'d',5=>'e',6=>'f',7=>'g',8=>'h',9=>'i',10=>'j',11=>'k', + 12=>'l',13=>'m',14=>'n',15=>'o',16=>'p',17=>'q',18=>'r',19=>'s',20=>'t',21=>'u', + 22=>'v',23=>'w',24=>'x',25=>'y',26=>'z'); + $openssl_version = intval($openssl_version_parsed['major'][0]).'.'; + $openssl_version.= intval($openssl_version_parsed['minor'][0]).'.'; + $openssl_version.= intval($openssl_version_parsed['fix'][0]); + $patchlevel_dec = hexdec($openssl_version_parsed['patch'][0]); + if (!$patch_as_number && array_key_exists($patchlevel_dec, $alphabet)) { + $openssl_version.= $alphabet[$patchlevel_dec]; // ideal for text comparison + } + else { + $openssl_version.= '.'.$patchlevel_dec; // ideal for version_compare + } + } + return $openssl_version; + } + /** * @param $aConfiguration * @@ -1734,8 +2174,8 @@ class requTests if ($this->getDb()) { $sField = 'oxversion'; $sSelect = "SELECT " . $sField . " FROM oxshops WHERE 1 ORDER BY oxversion ASC LIMIT 1"; - $rResult = mysql_query($sSelect, $this->getDb()); - $oResult = mysql_fetch_object($rResult); + $rResult = mysqli_query($this->getDb(), $sSelect); + $oResult = mysqli_fetch_object($rResult); $oEditionResult = $this->_getShopEdition(); $sEdition = strtoupper($oEditionResult->oxedition); @@ -1770,8 +2210,8 @@ class requTests if ($this->getDb()) { $sField = 'oxversion'; $sSelect = "SELECT " . $sField . " FROM oxshops WHERE 1 ORDER BY oxversion DESC LIMIT 1"; - $rResult = mysql_query($sSelect, $this->getDb()); - $oResult = mysql_fetch_object($rResult); + $rResult = mysqli_query($this->getDb(), $sSelect); + $oResult = mysqli_fetch_object($rResult); $oEditionResult = $this->_getShopEdition(); $sEdition = strtoupper($oEditionResult->oxedition); @@ -1833,8 +2273,8 @@ class requTests if ($this->getDb()) { $sField = 'oxedition'; $sSelect = "SELECT " . $sField . " FROM oxshops WHERE 1 LIMIT 1"; - $rResult = mysql_query($sSelect, $this->getDb()); - $oResult = mysql_fetch_object($rResult); + $rResult = mysqli_query($this->getDb(), $sSelect); + $oResult = mysqli_fetch_object($rResult); return $oResult; } @@ -1850,11 +2290,11 @@ class requTests if ($this->getDb()) { $sModId = 'd3modcfg_lib'; $sSelect = "SELECT 1 as result FROM d3_cfg_mod WHERE oxmodid = '" . $sModId . "' LIMIT 1"; - $rResult = mysql_query($sSelect, $this->getDb()); - if (is_resource($rResult)) { - $oResult = mysql_fetch_object($rResult); + $rResult = mysqli_query($this->getDb(), $sSelect); + if (is_object($rResult)) { + $oResult = mysqli_fetch_object($rResult); - if ($oResult->result) { + if ((bool) $oResult->result == true) { return true; } } @@ -1879,14 +2319,15 @@ class requTests oxversion != 'basic' ORDER BY oxversion ASC LIMIT 1"; - $rResult = mysql_query($sSelect, $this->getDb()); - $aResult = mysql_fetch_assoc($rResult); + $rResult = mysqli_query($this->getDb(), $sSelect); + $oResult = mysqli_fetch_object($rResult); + $blReturn = (bool)$oResult->result; - if (!(int)$aResult['result']) { + if (false == $blReturn) { $this->setGlobalResult(false); } - return (int)$aResult['result']; + return $blReturn; } $this->setGlobalResult(false); @@ -1909,14 +2350,15 @@ class requTests oxversion != 'basic' ORDER BY oxversion ASC LIMIT 1"; - $rResult = mysql_query($sSelect, $this->getDb()); - $aResult = mysql_fetch_assoc($rResult); + $rResult = mysqli_query($this->getDb(), $sSelect); + $oResult = mysqli_fetch_object($rResult); + $blResult = (bool)$oResult->result; - if (!(int)$aResult['result']) { + if (false == $blResult) { $this->setGlobalResult(false); } - return (int)$aResult['result']; + return $blResult; } $this->setGlobalResult(false); @@ -1938,17 +2380,16 @@ class requTests oxmodid = '" . $this->oConfig->sModId . "' ORDER BY oxversion ASC LIMIT 1"; - $rResult = mysql_query($sSelect, $this->getDb()); - $aResult = mysql_fetch_assoc($rResult); + $rResult = mysqli_query($this->getDb(), $sSelect); + $oResult = mysqli_fetch_object($rResult); - if (isset($aResult) - && is_array($aResult) - && count($aResult) - && isset($aResult['oxversion']) - && $aConfiguration['aParams']['checkVersion'] + if (isset($oResult) + && is_object($oResult) + && isset($oResult->oxversion) + && isset($aConfiguration['aParams']['checkVersion']) ) { $sInstalledVersion = $this->_getConvertedVersion( - $aResult['oxversion'], + $oResult->oxversion, $aConfiguration['aParams']['remainingDigits'] ); $sNewVersion = $this->_getConvertedVersion( @@ -1980,23 +2421,31 @@ class requTests /** * @return array */ - public function hasZendLoaderOptimizer() + public function hasZendLoaderOptimizer(&$aConfiguration, $blCheckBasePathOnly = false) { $aResult = array($this->getBasePath() => false); - if ((version_compare(phpversion(), '5.2.0', '>=') && - version_compare(phpversion(), '5.2.900', '<') && - function_exists('zend_optimizer_version') - ) || ( - version_compare(phpversion(), '5.3.0', '>=') && - version_compare(phpversion(), '5.6.900', '<') && - function_exists('zend_loader_version') - ) - ) { - $aResult[$this->getBasePath()] = true; + if ((version_compare(phpversion(), '5.2.0', '>=') + && version_compare(phpversion(), '5.2.900', '<') + && function_exists('zend_optimizer_version') + ) || ( + version_compare(phpversion(), '5.3.0', '>=') + && version_compare(phpversion(), '5.6.900', '<') + && function_exists('zend_loader_version') + )) { + if (function_exists('opcache_get_status') + && ($aOpCacheStatus = opcache_get_status()) + && $aOpCacheStatus['opcache_enabled'] + ) { + $aResult[$this->getBasePath()] = null; + } else { + $aResult[$this->getBasePath()] = true; + } } - $aResult = array_merge($aResult, $this->checkInSubDirs(__FUNCTION__)); + if ($blCheckBasePathOnly == false) { + $aResult = array_merge($aResult, $this->checkInSubDirs(__FUNCTION__)); + } return $aResult; } @@ -2004,7 +2453,7 @@ class requTests /** * @return array */ - public function hasIonCubeLoader() + public function hasIonCubeLoader(&$aConfiguration, $blCheckBasePathOnly = false) { $aResult = array($this->getBasePath() => false); @@ -2012,7 +2461,59 @@ class requTests $aResult[$this->getBasePath()] = true; } - $aResult = array_merge($aResult, $this->checkInSubDirs(__FUNCTION__)); + if ($blCheckBasePathOnly == false) { + $aResult = array_merge($aResult, $this->checkInSubDirs(__FUNCTION__)); + } + + return $aResult; + } + + /** + * @return array + */ + public function hasIonCubeOrZendLoader(&$aConfiguration) + { + $oLayout = $this->getBase()->oLayout; + + $aDecoderTexts = array(); + $aDecoderErrorTexts = array(); + foreach (array('hasZendLoaderOptimizer', 'hasIonCubeLoader') as $sDecoderCheck) { + $aReturn = call_user_func_array(array($this, $sDecoderCheck), array($aConfiguration, true)); + if ($aReturn[$this->getBasePath()]) { + $aDecoderTexts[$sDecoderCheck] = $oLayout->translate('availableDecoder_'.$sDecoderCheck); + } elseif ($aReturn[$this->getBasePath()] === null) { + $aDecoderErrorTexts[$sDecoderCheck] = $oLayout->translate('decoderIssue_'.$sDecoderCheck); + } else { + $aDecoderErrorTexts[$sDecoderCheck] = $oLayout->translate('notAvailableDecoder_'.$sDecoderCheck); + } + } + + $sDecoderText = count($aDecoderTexts) ? + sprintf($oLayout->translate('availableDecoder'), implode(' + ', $aDecoderTexts)) : + $oLayout->translate('noDecoderAvailable'); + $aConfiguration['aParams'][1] = $sDecoderText; + + $sDecoderErrorText = count($aDecoderErrorTexts) ? + '
      '.implode('', $aDecoderErrorTexts).'
    ' : + ''; + $aConfiguration['aParams'][2] = $sDecoderErrorText; + + $aZendLoaderResults = $this->hasZendLoaderOptimizer($aConfiguration); + $aIonCubeLoaderResults = $this->hasIonCubeLoader($aConfiguration); + + $aResult = array(); + foreach (array_keys($aZendLoaderResults) as $sPath) { + // transfer meta data + if (strstr($sPath, '@@')) { + $aResult[$sPath] = $aZendLoaderResults[$sPath]; + } elseif ($aIonCubeLoaderResults[$sPath] || $aZendLoaderResults[$sPath]) { + $aResult[$sPath] = true; + } elseif ($aIonCubeLoaderResults[$sPath] === null || $aZendLoaderResults[$sPath] === null) { + $aResult[$sPath] = null; + } else { + $aResult[$sPath] = false; + } + } return $aResult; } @@ -2056,9 +2557,10 @@ class requTransformation $sSelect = "SELECT oxversion as result ". "FROM d3_cfg_mod ". "WHERE oxmodid = 'd3modcfg_lib' LIMIT 1"; - $rResult = mysql_query($sSelect, $this->oCheck->getDb()); - if (is_resource($rResult)) { - $oResult = mysql_fetch_object($rResult); + $rResult = mysqli_query($this->oCheck->getDb(), $sSelect); + + if (is_object($rResult)) { + $oResult = mysqli_fetch_object($rResult); if ($oResult->result) { $sCheckVersion = $oResult->result; } @@ -2104,4 +2606,4 @@ if (isset($_REQUEST['fnc']) && $_REQUEST['fnc']) { $oRequCheck->{$_REQUEST['fnc']}(); } else { $oRequCheck->startCheck(); -} \ No newline at end of file +} diff --git a/setup+doku/changelog.txt b/setup+doku/changelog.txt index b1e8647..dca5570 100644 --- a/setup+doku/changelog.txt +++ b/setup+doku/changelog.txt @@ -1,3 +1,12 @@ +=> 2.1.0.0 +- Datenbank-Tabelle auf InnoDb geändert +- Tabellenindizes für optimierte Abfragen ergänzt +- Löschabfragen wegen mglw. hoher Datenbanklast begrenzt +- Besuchereinträge wurden um Seitendetails ergänzt +- Auswertung im Backend lässt sich zwischen bisheriger und neuer Gruppierung umschalten +- Auswertung im Frontend entfernt (#6828) +- fehlerhafte Übersetzung korrigiert (#6827) + => 2.0.1.1 - Precheck für PHP 5.5 und 5.6 angepasst