From 16efdddf1f2de70c129b8b9f79439c431d3f9a60 Mon Sep 17 00:00:00 2001 From: Daniel Seifert Date: Fri, 19 Oct 2018 15:59:48 +0200 Subject: [PATCH] add 4.0.0.2 (ionCube for PHP 7.1 - 7.2) --- README.md | 36 +- changelog.md | 269 +- composer.json | 88 +- docs/Precheck/d3precheck.php | 5214 ++++++++--------- .../Precheck/modules/d3/contenttabs/.htaccess | 22 +- .../Application/Controller/Admin/.htaccess | 22 +- .../Controller/Admin/d3precheckinfolder.php | 394 +- .../modules/d3/contenttabs/Setup/.htaccess | 22 +- .../contenttabs/Setup/d3precheckinfolder.php | 394 +- .../d3/contenttabs/d3precheckinfolder.php | 394 +- .../Controller/Admin/contentTabList.php | 309 +- .../Controller/Admin/contentTabs.php | 483 +- src/Application/Controller/Admin/settings.php | 44 +- src/Application/Controller/Admin/support.php | 38 +- src/Application/Model/contentTabs.php | 548 +- .../translations/de/d3_contenttabs_lang.php | 24 +- .../views/admin/de/d3_contenttabs_lang.php | 101 +- .../views/admin/tpl/contentTabList.tpl | 340 +- .../views/admin/tpl/contentTabs.tpl | 418 +- .../views/admin/tpl/contentTabsBase.tpl | 26 +- .../blocks/details_tabs_longdescription.tpl | 126 +- .../views/tpl/d3contenttabs_tab1.tpl | 24 +- src/IntelliSenseHelper.php | 20 +- .../d3_oxwarticledetails_contenttabs.php | 67 +- .../Model/d3_oxarticle_longtexts.php | 91 +- src/Setup/setupWizard.php | 1700 +++--- src/menu.xml | 22 +- src/metadata.php | 176 +- src/out/mobile/src/css/d3mobile.css | 40 +- 29 files changed, 5741 insertions(+), 5711 deletions(-) diff --git a/README.md b/README.md index 1e7b213..39c52f9 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,18 @@ -# D³ Content Tabs für OXID eShop -Erweiterung der Produktdetailsseite mit weiteren "Tabs". -Dies ermöglicht es viele Produktionformationen sauber und übersichtlich auszulisten. - -## Systemanforderungen: -- installierter OXID eShop -- PHP-Version, für die Installationspakete verfügbar sind -- Installation via Composer -- ionCubeLoader -- D3 Modul Connector - -Die jeweils geforderten Versionen und sonstige Anforderungen entnehmen -Sie bitte der Dokumentation im docs-Verzeichnis dieses Paketes. - -## Installation: - -Verwenden Sie zur Installation bitte immer unser Quellenverzeichnis unter https://satis.oxidmodule.com. -Eine detaillierte Installationsanleitung finden Sie im docs-Verzeichnis dieses Pakets. +# D³ Content Tabs für OXID eShop +Erweiterung der Produktdetailsseite mit weiteren "Tabs". +Dies ermöglicht es viele Produktionformationen sauber und übersichtlich auszulisten. + +## Systemanforderungen: +- installierter OXID eShop +- PHP-Version, für die Installationspakete verfügbar sind +- Installation via Composer +- ionCubeLoader +- D3 Modul Connector + +Die jeweils geforderten Versionen und sonstige Anforderungen entnehmen +Sie bitte der Dokumentation im docs-Verzeichnis dieses Paketes. + +## Installation: + +Verwenden Sie zur Installation bitte immer unser Quellenverzeichnis unter https://satis.oxidmodule.com. +Eine detaillierte Installationsanleitung finden Sie im docs-Verzeichnis dieses Pakets. diff --git a/changelog.md b/changelog.md index a0a335a..0bd591f 100644 --- a/changelog.md +++ b/changelog.md @@ -1,132 +1,137 @@ -# Changelog -All notable changes to this project will be documented in this file. - -## 4.0.0.1 (2018-03-01) -- Exception im Admin unter /Content Tabs/Tabverwaltung/Stamm/ - -## 4.0.0.0 (2018-03-01) -- Kompatibilität und Support ab Oxid 6.0.0 -- Integration eines eigenen Admin-Bereich "D³ Content Tabs" -- Titel und Langtexte der Tabs werden in einer eigenen Tabelle gespeichert -- Langtexte haben eine "Aktiv" - Option erhalten, welche im Frontend zusätzlich geprüft wird -- Altlasten und unnötige Dateien entfernt -- Umstellung auf Namespaces -- Grundinstallation via Composer - -## 3.2.0.1 (2016-12-19) -- Support für Apache 2.4 -- Paketbereitstellung für ionCube - -## 3.2.0.0 (2016-07-22) -- drop: techn. Support für Shopversionen 4.7.x eingestellt -- add: Freigabe für 4.10.x -- add: Prüfung auf gültige Modul-Dateien implementiert -- add feature: Support für Oxid-Theme Flow - -## 3.1.0.2 (2015-10-07) -- bugfix: "Shop offline" Anzeige nach der Wahl einer Variante im Frontend -- bugfix: gepflegte Tab-Inhalte wurden nicht angezeigt - -## 3.1.0.1 (2015-09-03) -- automatische Installation aufgeteilt, Anlegen der Datenbankfelder erfolgt "step by step" -- Übernahme Moduleigener Templates in copy_this und Verweis zur Überladung siehe FAQ -- fehlende Übersetzungen im Shopadmin nachgetragen -- Modulfreigabe für php5.5 und php5.6 -- Aktualisierung Vorabprüfung und Installationsanleitung - -## 3.1.0.0 (2014-11-12) -- support for mobile-themes -- adjustment of the structure -- update precheck - -## 3.0.1.0 (2014-08-08) -- Module compatible with Shopvesion 4.8.7 -- Show Message in Backend if Module is not active -- rename module-tab-Templates -- adjustment of the structure -- delete deprecated files in autoupdate -- fix module entrys in shopconfiguration - -## 3.0.0.3 (2014-05-05) -- Update Precheck - -## 3.0.0.2 (2014-03-18) -- bugfix for saving longdesc in admin - -## 3.0.0.1 (2013-02-22) -- bugfix when module is inactive, tabs will be shown in frontend - -## 3.0.0.0 (2013-02-19) -- restructured for 4.7 / 5.0 - -## 2.4.6.2 (2013-06-27) -- add funktionality for Edition EE -- add Versioncheck in oxarticle-extension - till 4.5.x other method for getting Longdescription than in 4.6.x - -## 2.4.6.1 (2013-03-12) -- bugfix in update.sql - -## 2.4.6.0 (2013-02-01) -- tab content moved to templates, add extendable blocks - -## 2.4.5.0 (2012-09-05) -- added 4.6.0 functionality - -## 2.4.4 (2012-05-31) -- bug fix: javaScript fallback causes shop-in-tab-problem - -## 2.4.3 (2011-11-02) -- added templates for 451 - 454 -- added javaScript fallback for non js user - -## 2.4.2 (2011-09-19) -- bug fix price doesn't save -- bug fix showed empty tabs - -## 2.4.1 (2011-08-16) -- inheritance implemented -- bug in save function fixed - -## 2.4.0 (2011-07-19) -- restructured -- removed Ajax lib, switched to jQuery -- removed ox_cmp module -- renamed fields (from oxlongdescXXX to d3longdescXXX) in database -- added 4.5.0 templates - -## 2.1 (2009-11-13) -- Xajax-Implementierung au neues Intergrationsschema umgestellt -- langtext- und templatebasierte Versionen zusammengeführt -- Fallback-Funktion für Nicht-JavaScript-Einsatz -- Langtexte in einem Admin-Tab zusammengefaßt -- Langtext mehrsprachig verfügbar - -## 2.0 (2009-08-26) -- auf PE4 portiert - -## 1.1 (2008-09-22) -- Fallback-Funktion für Nicht-JavaScript-Einsatz (tpl) -- Attribute und Bewertungen stehen nun ebenfalls zur Verfügung (tpl) - -## 1.0 (2008-09-12) -- Grundfunktion zum Modul komplettiert -- Scriptbasis ist aktuelles Xajax-Integrationsschema - - -[3.2.0.0]: https://blog.oxidmodule.com/archives/610-Neues-Update-fuer-Modul-Content-Tabs-auf-Version-3.2.0.0.html -[3.1.0.2]: https://blog.oxidmodule.com/archives/541-Neuer-Patch-fuer-Modul-Content-Tabs-auf-Version-3.1.0.2.html -[3.1.0.1]: https://blog.oxidmodule.com/archives/539-Neues-Update-fuer-Modul-Content-Tabs-auf-Version-3.1.0.1.html -[3.1.0.0]: https://blog.oxidmodule.com/archives/473-Neues-Update-fuer-Modul-Content-Tabs-auf-Version-3.1.0.0.html -[3.0.1.0]: https://blog.oxidmodule.com/archives/441-Neues-Update-fuer-Modul-Content-Tabs-auf-Version-3.0.1.0.html -[3.0.0.2]: https://blog.oxidmodule.com/archives/389-Neuer-Patch-fuer-Modul-Content-Tabs-auf-Version-3.0.0.2.html -[3.0.0.0]: https://blog.oxidmodule.com/archives/251-Neues-Upgrade-fuer-Modul-Content-Tabs-auf-Version-3.0.0.0.html -[2.4.6.2]: https://blog.oxidmodule.com/archives/290-Neuer-Patch-fuer-Modul-Content-Tabs-auf-Version-2.4.6.2.html -[2.4.6.0]: https://blog.oxidmodule.com/archives/246-Neues-Update-fuer-Modul-Content-Tabs-auf-Version-2.4.6.0.html -[2.4.5.0]: https://blog.oxidmodule.com/archives/211-Neuer-Patch-fuer-Modul-Content-Tabs-auf-Version-2.4.5.0.html -[2.4.4.0]: https://blog.oxidmodule.com/archives/188-Neuer-Patch-fuer-Modul-Content-Tabs-auf-Version-2.4.4.html -[2.4.3.0]: https://blog.oxidmodule.com/archives/144-Neues-Patch-fuer-Modul-Content-Tabs-auf-Version-2.4.3.html -[2.4.2.0]: https://blog.oxidmodule.com/archives/130-Neues-Patch-fuer-Modul-Content-Tabs-auf-Version-2.4.2.html -[2.4.0.0]: https://blog.oxidmodule.com/archives/116-Update-Content-Tabs-fuer-OXID-PE-4.5.html -[2.0.0.0]: https://blog.oxidmodule.com/archives/28-Modul-Content-Tabs.html - +# Changelog +All notable changes to this project will be documented in this file. + +## 4.0.0.2 (2018-10-19) +- Freigabe für OXID 6.1.x +- Fehlerhinweise eingefügt, wenn Langtexte nicht ausreichend befüllt sind +- bugfix: Schreibschutz für Langtexte an Artikelvarianten entfernt + +## 4.0.0.1 (2018-03-01) +- Exception im Admin unter /Content Tabs/Tabverwaltung/Stamm/ + +## 4.0.0.0 (2018-03-01) +- Kompatibilität und Support ab Oxid 6.0.0 +- Integration eines eigenen Admin-Bereich "D³ Content Tabs" +- Titel und Langtexte der Tabs werden in einer eigenen Tabelle gespeichert +- Langtexte haben eine "Aktiv" - Option erhalten, welche im Frontend zusätzlich geprüft wird +- Altlasten und unnötige Dateien entfernt +- Umstellung auf Namespaces +- Grundinstallation via Composer + +## 3.2.0.1 (2016-12-19) +- Support für Apache 2.4 +- Paketbereitstellung für ionCube + +## 3.2.0.0 (2016-07-22) +- drop: techn. Support für Shopversionen 4.7.x eingestellt +- add: Freigabe für 4.10.x +- add: Prüfung auf gültige Modul-Dateien implementiert +- add feature: Support für Oxid-Theme Flow + +## 3.1.0.2 (2015-10-07) +- bugfix: "Shop offline" Anzeige nach der Wahl einer Variante im Frontend +- bugfix: gepflegte Tab-Inhalte wurden nicht angezeigt + +## 3.1.0.1 (2015-09-03) +- automatische Installation aufgeteilt, Anlegen der Datenbankfelder erfolgt "step by step" +- Übernahme Moduleigener Templates in copy_this und Verweis zur Überladung siehe FAQ +- fehlende Übersetzungen im Shopadmin nachgetragen +- Modulfreigabe für php5.5 und php5.6 +- Aktualisierung Vorabprüfung und Installationsanleitung + +## 3.1.0.0 (2014-11-12) +- support for mobile-themes +- adjustment of the structure +- update precheck + +## 3.0.1.0 (2014-08-08) +- Module compatible with Shopvesion 4.8.7 +- Show Message in Backend if Module is not active +- rename module-tab-Templates +- adjustment of the structure +- delete deprecated files in autoupdate +- fix module entrys in shopconfiguration + +## 3.0.0.3 (2014-05-05) +- Update Precheck + +## 3.0.0.2 (2014-03-18) +- bugfix for saving longdesc in admin + +## 3.0.0.1 (2013-02-22) +- bugfix when module is inactive, tabs will be shown in frontend + +## 3.0.0.0 (2013-02-19) +- restructured for 4.7 / 5.0 + +## 2.4.6.2 (2013-06-27) +- add funktionality for Edition EE +- add Versioncheck in oxarticle-extension + till 4.5.x other method for getting Longdescription than in 4.6.x + +## 2.4.6.1 (2013-03-12) +- bugfix in update.sql + +## 2.4.6.0 (2013-02-01) +- tab content moved to templates, add extendable blocks + +## 2.4.5.0 (2012-09-05) +- added 4.6.0 functionality + +## 2.4.4 (2012-05-31) +- bug fix: javaScript fallback causes shop-in-tab-problem + +## 2.4.3 (2011-11-02) +- added templates for 451 - 454 +- added javaScript fallback for non js user + +## 2.4.2 (2011-09-19) +- bug fix price doesn't save +- bug fix showed empty tabs + +## 2.4.1 (2011-08-16) +- inheritance implemented +- bug in save function fixed + +## 2.4.0 (2011-07-19) +- restructured +- removed Ajax lib, switched to jQuery +- removed ox_cmp module +- renamed fields (from oxlongdescXXX to d3longdescXXX) in database +- added 4.5.0 templates + +## 2.1 (2009-11-13) +- Xajax-Implementierung au neues Intergrationsschema umgestellt +- langtext- und templatebasierte Versionen zusammengeführt +- Fallback-Funktion für Nicht-JavaScript-Einsatz +- Langtexte in einem Admin-Tab zusammengefaßt +- Langtext mehrsprachig verfügbar + +## 2.0 (2009-08-26) +- auf PE4 portiert + +## 1.1 (2008-09-22) +- Fallback-Funktion für Nicht-JavaScript-Einsatz (tpl) +- Attribute und Bewertungen stehen nun ebenfalls zur Verfügung (tpl) + +## 1.0 (2008-09-12) +- Grundfunktion zum Modul komplettiert +- Scriptbasis ist aktuelles Xajax-Integrationsschema + + +[3.2.0.0]: https://blog.oxidmodule.com/archives/610-Neues-Update-fuer-Modul-Content-Tabs-auf-Version-3.2.0.0.html +[3.1.0.2]: https://blog.oxidmodule.com/archives/541-Neuer-Patch-fuer-Modul-Content-Tabs-auf-Version-3.1.0.2.html +[3.1.0.1]: https://blog.oxidmodule.com/archives/539-Neues-Update-fuer-Modul-Content-Tabs-auf-Version-3.1.0.1.html +[3.1.0.0]: https://blog.oxidmodule.com/archives/473-Neues-Update-fuer-Modul-Content-Tabs-auf-Version-3.1.0.0.html +[3.0.1.0]: https://blog.oxidmodule.com/archives/441-Neues-Update-fuer-Modul-Content-Tabs-auf-Version-3.0.1.0.html +[3.0.0.2]: https://blog.oxidmodule.com/archives/389-Neuer-Patch-fuer-Modul-Content-Tabs-auf-Version-3.0.0.2.html +[3.0.0.0]: https://blog.oxidmodule.com/archives/251-Neues-Upgrade-fuer-Modul-Content-Tabs-auf-Version-3.0.0.0.html +[2.4.6.2]: https://blog.oxidmodule.com/archives/290-Neuer-Patch-fuer-Modul-Content-Tabs-auf-Version-2.4.6.2.html +[2.4.6.0]: https://blog.oxidmodule.com/archives/246-Neues-Update-fuer-Modul-Content-Tabs-auf-Version-2.4.6.0.html +[2.4.5.0]: https://blog.oxidmodule.com/archives/211-Neuer-Patch-fuer-Modul-Content-Tabs-auf-Version-2.4.5.0.html +[2.4.4.0]: https://blog.oxidmodule.com/archives/188-Neuer-Patch-fuer-Modul-Content-Tabs-auf-Version-2.4.4.html +[2.4.3.0]: https://blog.oxidmodule.com/archives/144-Neues-Patch-fuer-Modul-Content-Tabs-auf-Version-2.4.3.html +[2.4.2.0]: https://blog.oxidmodule.com/archives/130-Neues-Patch-fuer-Modul-Content-Tabs-auf-Version-2.4.2.html +[2.4.0.0]: https://blog.oxidmodule.com/archives/116-Update-Content-Tabs-fuer-OXID-PE-4.5.html +[2.0.0.0]: https://blog.oxidmodule.com/archives/28-Modul-Content-Tabs.html + diff --git a/composer.json b/composer.json index 0456287..a5e58e8 100644 --- a/composer.json +++ b/composer.json @@ -1,44 +1,44 @@ -{ - "name": "d3/contenttabs", - "description": "Extended description module for OXID eShop.", - "type": "oxideshop-module", - "keywords": [ - "oxid", - "modules", - "eShop", - "d3", - "tabs", - "details" - ], - "authors": [ - { - "name": "D3 Data Development (Inh. Thomas Dartsch)", - "email": "info@shopmodule.com", - "homepage": "http://www.d3data.de", - "role": "Owner" - } - ], - "support": { - "email": "support@shopmodule.com" - }, - "homepage": "https://www.oxidmodule.com/", - "license": [ - "proprietary" - ], - "extra": { - "oxideshop": { - "source-directory": "/src", - "target-directory": "d3/contenttabs" - } - }, - "require": { - "php": "7.1 - 7.2", - "oxid-esales/oxideshop-metapackage-ce": "~6.0.1", - "d3/modcfg": "~5.1" - }, - "autoload": { - "psr-4": { - "D3\\Contenttabs\\": "../../../source/modules/d3/contenttabs" - } - } -} +{ + "name": "d3/contenttabs", + "description": "Extended description module for OXID eShop.", + "type": "oxideshop-module", + "keywords": [ + "oxid", + "modules", + "eShop", + "d3", + "tabs", + "details" + ], + "authors": [ + { + "name": "D3 Data Development (Inh. Thomas Dartsch)", + "email": "info@shopmodule.com", + "homepage": "http://www.d3data.de", + "role": "Owner" + } + ], + "support": { + "email": "support@shopmodule.com" + }, + "homepage": "https://www.oxidmodule.com/", + "license": [ + "proprietary" + ], + "extra": { + "oxideshop": { + "source-directory": "/src", + "target-directory": "d3/contenttabs" + } + }, + "require": { + "php": "7.1 - 7.2", "ext-ionCube-Loader": "*", + "oxid-esales/oxideshop-metapackage-ce": "~6.0.1 || ~6.1.0", + "d3/modcfg": "^5.1.0.000" + }, + "autoload": { + "psr-4": { + "D3\\Contenttabs\\": "../../../source/modules/d3/contenttabs" + } + } +} diff --git a/docs/Precheck/d3precheck.php b/docs/Precheck/d3precheck.php index f749f62..8262a2c 100644 --- a/docs/Precheck/d3precheck.php +++ b/docs/Precheck/d3precheck.php @@ -1,2609 +1,2605 @@ - - * @link http://www.oxidmodule.com - */ - -/** - * Alle Anforderungen sind über $this->_aCheck konfigurierbar. Manche Anforderungen haben dazu noch weitergehende - * Informationen. Die Struktur dieser Requirementbeschreibungen: - * - * array( - * 'blExec' => 1, // obligatorisch: 0 = keine Prüfung, 1 = Püfung wird ausgeführt - * 'aParams' => array(...), // optional, Inhalt ist von jeweiliger Prüfung abhängig - * ) - * - * "Desc1": Diese Struktur kann allein eine Bedingung beschreiben. Wenn mehrere dieser Bedingungen - * nötig sind (z.B. bei unterschiedlichen Bibliotheksanforderungen), kann diese Struktur als - * Arrayelemente auch mehrfach genannt werden (kaskadierbar). Grundsätzlich sind alle Requirements - * kaskadierbar, jedoch ergibt dies nicht bei allen Sinn. :) Eine Kaskadierung sieht so aus: - * - * array( - * array( - * 'blExec' => 1, - * ... - * ), - * array( - * 'blExec' => 1, - * ... - * ) - * ) - * - * Unbedingt zu vermeiden sind Änderungen in der Scriptlogik, da diese bei Updates nur schwer zu übernehmen sind. - */ - -class requConfig -{ - public $sModName = 'D³ Content Tabs'; - - public $sModId = 'd3contenttabs'; - - public $sModVersion = '4.0.0.1'; - - /********************** check configuration section ************************/ - - public $aCheck = array( - // kleinste erlaubte PHP-Version - 'hasMinPhpVersion' => array( - 'blExec' => 0, - 'aParams' => array( - 'version' => '5.6.0' - ) - ), - - // größte erlaubte PHP-Version - 'hasMaxPhpVersion' => array( - 'blExec' => 0, - 'aParams' => array( - 'version' => '7.1.200' - ) - ), - - // PHP-Version zwischen 'from' und 'to' - 'hasFromToPhpVersion' => array( - 'blExec' => 1, - 'aParams' => array( - 'from' => '5.6.0', - 'to' => '7.2.900', - ) - ), - - // benötigt Zend Optimizer (PHP 5.2) bzw. Zend Guard Loader (> PHP 5.2) - 'hasZendLoaderOptimizer' => array( - 'blExec' => 0, - ), - - // benötigt IonCubeLoader - 'hasIonCubeLoader' => array( - 'blExec' => 1, - ), - - // benötigt Zend Decoder oder IonCubeLoader - 'hasIonCubeOrZendLoader' => array( - 'blExec' => 0, - ), - - // benötigte PHP-Extension (kaskadierbar (siehe "Desc1")) - 'hasExtension' => array( - array( - 'blExec' => 0, - 'aParams' => array( - 'type' => 'curl', - ), - ), - array( - 'blExec' => 0, - 'aParams' => array( - 'type' => 'soap' - ), - ), - ), - - // benötigte cURL-Version - 'hasMinCurlVersion' => array( - 'blExec' => 0, - 'aParams' => array( - 'version' => '7.26.0', - ), - ), - - // benötigte OpenSSL-Version (Angabe in Versionsformat) - 'hasMinOpenSSLVersion' => array( - 'blExec' => 0, - 'aParams' => array( - 'version' => '1.0.1.5', - ), - ), - - // minimal benötigte Shopversion (editionsgetrennt), wird (sofern möglich) Remote aktualisiert - 'hasMinShopVersion' => array( - 'blExec' => 1, - 'aParams' => array( - 'PE' => '6.0.0', - 'CE' => '6.0.0', - 'EE' => '6.0.0' - ), - ), - - // maximal verwendbare Shopversion (editionsgetrennt), wird (sofern möglich) Remote aktualisiert - 'hasMaxShopVersion' => array( - 'blExec' => 0, - 'aParams' => array( - 'PE' => '6.0.0', - 'CE' => '6.0.0', - 'EE' => '6.0.0' - ), - ), - - // verfügbar für diese Shopeditionen, wird (sofern möglich) Remote aktualisiert - 'isShopEdition' => array( - 'blExec' => 1, - 'aParams' => array( - array( - 'PE', - 'EE', - 'CE', - ), - ), - ), - - // benötigt Modul-Connector - 'hasModCfg' => array( - 'blExec' => 1 - ), - - // benötigt mindestens diese Erweiterungen / Version lt. d3_cfg_mod (kaskadierbar (siehe "Desc1")) - 'hasMinModCfgVersion' => array( - array( - 'blExec' => 1, - 'aParams' => array( - 'id' => 'd3modcfg_lib', - 'name' => 'Modul-Connector', - 'version' => '5.1.0.0', - ), - ), - ), - - // verwendbar bis zu diesen Erweiterungen / Version lt. d3_cfg_mod (kaskadierbar (siehe "Desc1")) - 'hasMaxModCfgVersion' => array( - array( - 'blExec' => 0, - 'aParams' => array( - 'id' => 'd3modcfg_lib', - 'name' => 'Modul-Connector', - 'version' => '5.1.0.0', - ), - ), - ), - - // benötigt neuen Lizenzschlüssel - 'requireNewLicence' => array( - array( - 'blExec' => 1, - 'aParams' => array( - 'checkVersion' => true, // soll Versionsnummer des installierten Moduls gegengeprüft werden? - 'remainingDigits' => 2, // zu prüfende Stellen für neue Lizenz - ), - ), - ), - ); -} - -/********* don't change content from here **********************/ - -date_default_timezone_set('Europe/Berlin'); - -/** - * Class requcheck - */ -class requCheck -{ - public $sVersion = '4.10.2'; - - protected $_db = false; - - public $dbHost; - - public $dbUser; - - public $dbPwd; - - public $dbName; - - /** @var requConfig */ - public $oConfig; - - /** @var requLayout */ - public $oLayout; - - protected $_sInFolderFileName = 'd3precheckinfolder.php'; - - public $sVersionTag = '@@version@@'; - - /********************** functional section ************************/ - - public $blGlobalResult = true; - - /** - * - */ - public function __construct() - { - $this->oConfig = new requConfig(); - $this->oLayout = new requLayout($this, $this->oConfig); - $this->oRemote = new requRemote(); - } - - /** - * @param string $sName - * @param array $aArguments - */ - public function __call ($sName, $aArguments) - { - $this->oLayout->{$sName}($aArguments); - } - - public function startCheck() - { - $this->oLayout->getHTMLHeader(); - - $oCheckTransformation = new requTransformation($this); - $this->oConfig->aCheck = $oCheckTransformation->transformCheckList($this->oConfig->aCheck); - - $this->_runThroughChecks($this->oConfig->aCheck); - - $this->oLayout->getHTMLFooter(); - } - - /** - * traversable requirement check - * - * @param $aCheckList - * @param string $sForceCheckType - */ - protected function _runThroughChecks($aCheckList, $sForceCheckType = '') - { - foreach ($aCheckList as $sCheckType => $aConf) { - if (array_key_exists('blExec', $aConf)) { - if ($aConf['blExec']) { - if (strlen($sForceCheckType)) { - $sCheckType = $sForceCheckType; - } - $this->displayCheck($sCheckType, $aConf); - } - } else { - $this->_runThroughChecks($aConf, $sCheckType); - } - } - } - - /** - * @param $sMethodName - * @param null $aArguments - * - * @return array - */ - public function checkInSubDirs($sMethodName, $aArguments = null) - { - $sFolder = '.'; - - $aCheckScripts = $this->_walkThroughDirs($sFolder); - $aReturn = $this->_checkScripts($aCheckScripts, $sMethodName, $aArguments); - - return $aReturn; - } - - /** - * @param $sFolder - * - * @return array - */ - protected function _walkThroughDirs($sFolder) - { - $aIgnoreDirItems = array('.', '..'); - $aCheckScripts = array(); - - try { - /** @var SplFileInfo $oFileInfo */ - $oIterator = new RecursiveDirectoryIterator($sFolder); - - foreach ($oIterator as $oFileInfo) { - if (in_array($oFileInfo->getFileName(), $aIgnoreDirItems)) { - continue; - } - if ($oFileInfo->isDir()) { - $aCheckScripts = array_merge($aCheckScripts, $this->_walkThroughDirs($oFileInfo->getRealPath())); - } elseif ($oFileInfo->isFile()) { - if (strtolower($oFileInfo->getFilename()) == $this->_sInFolderFileName) { - $aCheckScripts[] = str_replace('\\', '/', $oFileInfo->getRealPath()); - } - } - } - } catch (UnexpectedValueException $oEx) { - sprintf($this->oLayout->translate('unableExecuteDirectoryIterator'), $oEx->getMessage()); - $this->addMessage( - sprintf($this->oLayout->translate('unableExecuteDirectoryIterator'), $oEx->getMessage()) - ); - } - - return $aCheckScripts; - } - - public function addMessage($sMessage) - { - $this->aMessages[md5($sMessage)] = $sMessage; - } - - public function getMessages() - { - return $this->aMessages; - } - - /** - * @param $aScriptList - * @param $sMethodName - * @param $aArguments - * - * @return array - */ - protected function _checkScripts($aScriptList, $sMethodName, $aArguments) - { - $aReturn = array(); - - foreach ($aScriptList as $sScriptPath) { - $sUrl = $this->_getFolderCheckUrl( - $sScriptPath, - $sMethodName, - $aArguments - ); - - $sVersionUrl = $this->_getFolderCheckUrl( - $sScriptPath, - 'getVersion', - array() - ); - - $sContent = serialize(null); - $sVersion = serialize(null); - - if ($this->_hasCurl()) { - $sContent = $this->_getContentByCurl($sUrl); - $sVersion = $this->_getContentByCurl($sVersionUrl); - } elseif ($this->_hasAllowUrlFopen()) { - $sContent = file_get_contents($sUrl); - $sVersion = file_get_contents($sVersionUrl); - } - - $sBasePath = $this->getBasePath($sScriptPath); - $aReturn[$sBasePath] = unserialize($sContent); - $aReturn[$this->sVersionTag][$sBasePath] = unserialize($sVersion); - } - - return $aReturn; - } - - /** - * @return bool - */ - protected function _hasCurl() - { - if (extension_loaded('curl') && function_exists('curl_init')) { - return true; - } - - return false; - } - - /** - * @return bool - */ - protected function _hasAllowUrlFopen() - { - if (ini_get('allow_url_fopen')) { - return true; - } - - return false; - } - - /** - * @param $sUrl - * - * @return bool|mixed - */ - protected function _getContentByCurl($sUrl) - { - $iTimeOut = 5; - $ch = curl_init(); - $sCurl_URL = preg_replace('@^((http|https)://)@', '', $sUrl); - - curl_setopt($ch, CURLOPT_URL, $sCurl_URL); - curl_setopt($ch, CURLOPT_HEADER, 0); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $iTimeOut); - curl_setopt($ch, CURLOPT_TIMEOUT, $iTimeOut); - curl_setopt($ch, CURLOPT_POST, 0); - $sContent = curl_exec($ch); - curl_close($ch); - - if (false == $sContent || - strstr(strtolower($sContent), strtolower('Request Entity Too Large')) || - strstr(strtolower($sContent), strtolower('not allow request data with POST requests')) - ) { - return false; - } - - return $sContent; - } - - /** - * @param $sScriptPath - * @param $sMethodName - * @param $aArguments - * - * @return string - */ - protected function _getFolderCheckUrl($sScriptPath, $sMethodName, $aArguments) - { - $sBaseDir = str_replace( - array(basename($_SERVER['SCRIPT_FILENAME']), '\\'), - array('', '/'), - realpath($_SERVER['SCRIPT_FILENAME']) - ); - $sUrlAdd = str_replace($sBaseDir, '', $sScriptPath); - $sBaseUrl = 'http://' . $_SERVER['HTTP_HOST'] . str_replace( - basename($_SERVER['SCRIPT_NAME']), - '', - $_SERVER['SCRIPT_NAME'] - ); - - $sUrl = $sBaseUrl . $sUrlAdd . '?fnc=' . $sMethodName . '¶ms=' . urlencode(serialize($aArguments)); - - return $sUrl; - } - - /** - * @param null $sFolder - * - * @return mixed - */ - public function getBasePath($sFolder = null) - { - if (!$sFolder) { - $sFolder = $_SERVER['SCRIPT_FILENAME']; - } - - $sScriptFileName = str_replace('\\', '/', realpath($_SERVER['SCRIPT_FILENAME'])); - $sSearch = substr(str_replace(basename($sScriptFileName), '', $sScriptFileName), 0, -1); - - $sFolder = str_replace('\\', '/', realpath($sFolder)); - - return str_replace(array(basename($sFolder), $sSearch), '', $sFolder); - } - - /** - * @return string - */ - public function getVersion() - { - return $this->sVersion; - } - - /** - * @param $mResult - * - * @return bool - */ - protected function _hasFalseInResult($mResult) - { - if (is_array($mResult)) { - foreach ($mResult as $blResult) { - if (false === $blResult) { - $this->blGlobalResult = false; - - return true; - } - } - - return false; - } - - if (false === $mResult) { - $this->blGlobalResult = false; - - return true; - } - - return false; - } - - /** - * @param $mResult - * - * @return bool - */ - protected function _hasNullInResult($mResult) - { - if (is_array($mResult)) { - foreach ($mResult as $blResult) { - if ($blResult === null) { - $this->blGlobalResult = false; - - return true; - } - } - - return false; - } - - if ($mResult === null) { - $this->blGlobalResult = false; - return true; - } - - return false; - } - - /** - * @param $mResult - * - * @return bool - */ - protected function _hasNoticeInResult($mResult) - { - if (is_array($mResult)) { - foreach ($mResult as $blResult) { - if ($blResult === 'notice') { - return true; - } - } - - return false; - } - - if ($mResult === 'notice') { - return true; - } - - return false; - } - - /********************** conversion function section ************************/ - - /** - * @param $mParam - */ - public function aTos(&$mParam) - { - if (is_array($mParam)) { - $mParam = implode($this->oLayout->translate('or'), $mParam); - } - } - - /** - * @return string - */ - public function getLang() - { - if (isset($_REQUEST['lang'])) { - return strtolower($_REQUEST['lang']); - } - - return 'de'; - } - - /** - * @return bool|resource - */ - public function getDb() - { - if (!$this->_db) { - if (file_exists('config.inc.php')) { - require_once('config.inc.php'); - ini_set('error_reporting', E_ALL^E_NOTICE); - $this->_db = mysqli_connect($this->dbHost, $this->dbUser, $this->dbPwd, $this->dbName); - } - } - - return $this->_db; - } - - /** - * @param $version - * @param int $iUnsetPart - * - * @return string - */ - public function versionToInt($version, $iUnsetPart = 0) - { - $match = explode('.', $version); - - return sprintf( - '%d%03d%03d%03d', - $this->_getVersionDigit($match[0], $iUnsetPart), - $this->_getVersionDigit($match[1], $iUnsetPart), - $this->_getVersionDigit($match[2], $iUnsetPart), - $this->_getVersionDigit($match[3], $iUnsetPart) - ); - } - - /** - * @param $sMatch - * @param $iUnsetPart - * - * @return int - */ - protected function _getVersionDigit($sMatch, $iUnsetPart) - { - return intval($sMatch !== null ? $sMatch : $iUnsetPart); - } - - /********************** layout function section ************************/ - - public function deleteme() - { - $sFolder = '.'; - - $this->_checkDelFilesInDir($sFolder); - $this->_delFile($_SERVER['SCRIPT_FILENAME']); - - if (is_file($_SERVER['SCRIPT_FILENAME'])) { - exit($this->oLayout->translate('unableDeleteFile')); - } else { - exit($this->oLayout->translate('goodBye')); - } - } - - /** - * @param $sFolder - */ - protected function _checkDelFilesInDir($sFolder) - { - $aIgnoreDirItems = array('.', '..'); - - /** @var SplFileInfo $oFileInfo */ - foreach (new RecursiveDirectoryIterator($sFolder) as $oFileInfo) { - if (!in_array($oFileInfo->getFileName(), $aIgnoreDirItems) && $oFileInfo->isDir()) { - $this->_checkDelFilesInDir($oFileInfo->getRealPath()); - } elseif ($oFileInfo->isFile()) { - if (strtolower($oFileInfo->getFilename()) == $this->_sInFolderFileName) { - $this->_delFile(str_replace('\\', '/', $oFileInfo->getRealPath())); - } - } - } - } - - /** - * @param $sPath - */ - protected function _delFile($sPath) - { - unlink($sPath); - } - - /** - * @param $sCheckType - * @param $aConfiguration - */ - public function displayCheck($sCheckType, &$aConfiguration) - { - $sGenCheckType = preg_replace("@(\_[0-9]$)@", "", $sCheckType); - $oTests = new requTests($this, $this->oConfig, $this->getDb(), $this->oRemote); - if (method_exists($oTests, $sGenCheckType)) { - $this->_checkResult($oTests, $sGenCheckType, $sCheckType, $aConfiguration); - } else { - $this->oLayout->getUncheckableItem($sCheckType, $aConfiguration); - $this->blGlobalResult = false; - } - } - - /** - * @param $oTests - * @param $sGenCheckType - * @param $sCheckType - * @param $aConfiguration - */ - protected function _checkResult($oTests, $sGenCheckType, $sCheckType, $aConfiguration) - { - $mResult = $oTests->{$sGenCheckType}($aConfiguration); - $sElementId = (md5($sGenCheckType . serialize($aConfiguration))); - - if ($this->_hasNoticeInResult($mResult)) { - $this->oLayout->getUnknownItem($mResult, $sElementId, $sCheckType, $aConfiguration); - } elseif ($this->_hasNullInResult($mResult)) { - $this->oLayout->getUnknownItem($mResult, $sElementId, $sCheckType, $aConfiguration); - } elseif ($this->_hasFalseInResult($mResult)) { - $this->oLayout->getNoSuccessItem($mResult, $sElementId, $sCheckType, $aConfiguration); - } else { - $this->oLayout->getSuccessItem($mResult, $sElementId, $sCheckType, $aConfiguration); - } - } - - public function showinfo() - { - phpinfo(); - } -} - -/** - * Class requLayout - */ -class requLayout -{ - public $oBase; - public $oConfig; - - /** - * @param requCheck $oBase - * @param requConfig $oConfig - */ - public function __construct(requCheck $oBase, requConfig $oConfig) - { - $this->oBase = $oBase; - $this->oConfig = $oConfig; - } - - public function getHTMLHeader() - { - $sScriptName = $_SERVER['SCRIPT_NAME']; - $sTranslRequCheck = $this->translate('RequCheck'); - $sModName = $this->oConfig->sModName; - $sModVersion = $this->oConfig->sModVersion; - - echo <<< EOT - - - - - $sTranslRequCheck "$sModName" $sModVersion - - - - - - -
- - - - - - -
-EOT; - echo "

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

'; - echo '

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

' . PHP_EOL; - - return; - } - - public function getHTMLFooter() - { - $sScriptName = $_SERVER['SCRIPT_NAME']; - $sTranslShopPhpInfo = $this->translate('showPhpInfo'); - $sTranslDependent = $this->translate('dependentoffurther'); - - if (count($this->oBase->getMessages())) { - echo ''; - } - - if ($this->oBase->blGlobalResult) { - echo '

' . $this->translate('globalSuccess') . '' . - $this->translate('deleteFile1') . $sScriptName . $this->translate('deleteFile2') . '

'; - } else { - echo '

' . $this->translate('globalNotSuccess') . '' . - $this->translate('deleteFile1') . $sScriptName . $this->translate('deleteFile2') . '

'; - } - - echo <<< EOT - $sTranslDependent
-

- - - $sTranslShopPhpInfo - - -

- - - -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 - * @param $sCheckType - * @param $aConfiguration - */ - public function getNoSuccessItem($aResult, $sElementId, $sCheckType, $aConfiguration) - { - $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; - - $this->getSubDirItems($aResult, $sElementId); - } - - /** - * @param $aResult - * @param $sElementId - * @param $sCheckType - * @param $aConfiguration - */ - public function getSuccessItem($aResult, $sElementId, $sCheckType, $aConfiguration) - { - $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; - - $this->getSubDirItems($aResult, $sElementId); - } - - /** - * @param $aResult - * @param $sElementId - * @param $sCheckType - * @param $aConfiguration - */ - public function getUnknownItem($aResult, $sElementId, $sCheckType, $aConfiguration) - { - $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; - - $this->getSubDirItems($aResult, $sElementId); - } - - /** - * @param $sCheckType - * @param $aConfiguration - */ - public function getUncheckableItem($sCheckType, $aConfiguration) - { - echo '
' . - $this->translate($sCheckType, $aConfiguration) . ' (' . $this->translate('RequNotCheckable') . ')' . - $this->_addDescBox($sCheckType.'_DESC', $aConfiguration) . - '
' . PHP_EOL; - } - - /** - * @param $aResult - * @param $sElementId - */ - public function getSubDirItems($aResult, $sElementId) - { - if (is_array($aResult) && count($aResult)) { - echo '' . PHP_EOL; - } - } - - /** - * @param $aResult - * @param $sElementId - * - * @return string - */ - protected function _addToggleScript($aResult, $sElementId) - { - if (is_array($aResult) && count($aResult)) { - $sScript = "
+
"; - } else { - $sScript = ""; - } - - return $sScript; - } - - /** - * @param $sTextIdent - * @param $aConfiguration - * - * @return string - */ - protected function _addDescBox($sTextIdent, $aConfiguration) - { - $sContent = "
?". - "
". - "
".$this->translate($sTextIdent, $aConfiguration)."
". - "
"; - - return $sContent; - } - - /** - * @param $sIdent - * @param array $aConfiguration - * - * @return mixed|string - */ - public function translate($sIdent, $aConfiguration = array()) - { - $sGenIdent = preg_replace("@(\_[0-9]$)@", "", $sIdent); - $oTranslations = new requTranslations(); - $aTransl = $oTranslations->getTranslations(); - - if (isset($aConfiguration['aParams']) && is_array($aConfiguration['aParams'])) { - array_walk($aConfiguration['aParams'], array($this->oBase, 'aTos'), $sIdent); - } - - if (isset($aTransl[$this->oBase->getLang()][$sGenIdent]) - && ($sTranslation = $aTransl[$this->oBase->getLang()][$sGenIdent]) - ) { - if (isset($aConfiguration['aParams'])) { - return vsprintf($sTranslation, $aConfiguration['aParams']); - } else { - return $sTranslation; - } - } else { - return $sGenIdent; - } - } - - public function getPngButton() - { - $sImg = "iVBORw0KGgoAAAANSUhEUgAABDgAAAAWCAYAAAAl+SzaAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAB". - "MpJREFUeNrs3Y1O4zgUhuFY4hbb2ZthRjtczOz0Ght7cZwfQ5u2E4K0a55XiNDUXyWcT+ZwfGyHw+HQvZI6AACAT+J0OgW9AAAAtn". - "A8Hh/JWYSnbkxuvAYeeg0AAAAAAPynuJevOB6P+ZKe6sYvLy96DgAA7M7z87NOAAAAm7iVq8gxRs5p5CTH03Tz758/uzAUc7x+Hy4". - "pf71ex9fDj2leyxLG1vnNELpmdJPqo21a7afy+/MIj/AIj7zVhS/seWPD4zoAAIAtxJhW44+cy/jx/ftw/2kRxDEQSd0Uraah/RKV". - "lLfK+/kDS0T7eieGZnTdA33QfeF+CpFHeIRHeORSF1Lw3I0Nd3UAAACbEhwprscfadnma05wpL7v8v0Sh4QiLimREqWEt7mSmK9xn". - "LlrSBe6fdq02k9D1oxHeIRHeORCFz13Y8NtHQAAwNYER+zX44+q3Zzg6GOcbw6haqhmXG5MvuQPiw3q9mrTaj/xCI/wCI9c13juxo". - "Y/0wEAANxNcPTxbvzxLsHRd7mEo8y+pJIFCWEupy2XMTcSxjKQUMqSl1mb/79urzbN9hOP8AiP8MgV3Zf2vLHhIR0AAMBWcr5iNf6". - "o4owlwdGPCY68hiUsZbRh2DGsWkz7/mUaVl83oxu3R/xwm1b7KfEIj/AIj1zRDfc9d2PDTR0AAMA2hgqOtfijWqOybDKaExzj6pVp". - "zWyYG04zdGn5vByohVC924ou7NSm3X7iER7hER55r/P3w9jw6NgAAADwp+SCjPX442oFR5URWeaY5pKPsmNpmI+SnctN5zKRVnR7t". - "Wm1nwKP8AiP8MiKznM3NqzrAAAANic4zuf1+ONaBce576dQZAhMplPepvWzYdn6vSoBCUNJSCkPaUS3V5tm+4lHeIRHeORS97U9b2". - "x4RAcAALA5wZEPRVmJP1K4ckxsPJ/H9SzjOvpuEc11INP805gtWQ6Ka0gXdmrTaD8NGTMe4REe4ZFrOs/d2HBLBwAAsJHzuV+PP6q". - "JlKqCI3ZdvaZliVGm3MiYKZm3EJuvXera0aW0T5tG+2kKYHmER3iER2pdU8/Pc/+0sQEAAGALec/Q9fjjSgVH358v/zFZJNXy6ukY". - "uFQqREZBK7q0U5tm+4lHeIRHeOSqLnnuxoa7YwMAAMAWzvF8M/64THDEOB+xEsYIJlV7d5R1tdNGHsMnlvW2I63opirrj7Zptp86H". - "uERHuGRS92X9ryx4cGxAQAAYBv5mNi1+OP6HhzDMbEVad5JrKoxrdbfzlFa155urzYt9lPgER7hER658bt47saGVR0AAMA28ikqj8". - "QfVQVH3705ceU1KEm5qmM+0y7N8crwOqY5a5Ja0sWd2jTaTykmHuERHuGRS52/H8aGuzoAAIBtxCGIWok/riU4Yl8EZVOwEpSUG9X". - "62XmRS1w+oV5z24RurzaN9tO0QR6P8AiP8MgbnedubLitAwAA2EqfExo34o+LBMevX7+6b9/+KkFItYZlmI0tP1XBS3UE3LhNeju6". - "vdq02k8dj/AIj/DIhW48W8NzNzbcHBsAAAC2MGypsRJ//P7n9/J/yOFwGO6fTie9BgAAPgvrVAAAwFZuzpgcj8fh+jQGHGm6AQAAs". - "DcmUgAAwFYezFeEfwUYAAoCUXB0RZrTAAAAAElFTkSuQmCC"; - header("Content-type: image/png"); - echo base64_decode($sImg); - exit; - } - - public function getPngLogo() - { - $sImg = "iVBORw0KGgoAAAANSUhEUgAAADMAAAA0CAYAAAAnpACSAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAE". - "IxJREFUeNq8Wgl4VNXZfu+dLZkkk5BA9kACYQlB2aIga6myuIEtFX+kLW1BJVT/akVrRds+rVqRX2lLRSsal5/nUaCgtmhi8BeaUh". - "Al7EYTIWyGQPZlMsnM3Lnn/865dzJ3biaLVnsfDpk59yzf++3fOSMxxvANPlZqUdQs1FRqXmq+Ac7NpbaI2jxqQ6nZqDVR+z9qr1H". - "71DxB+nfBPHYYSHUCK8fATl+HUZtK7Wpqo1SGeZ0BQCEYFolQETSrhDJ6d4rax9Q+pFa18SQ8HX6aHAcszUUS9T3U0IU1710ASqid". - "dwNuBciMARbSDjcQtDQnnnj7HNYuGvY1gqHnW9RWBBi+f7kT+LwVKG8AjlDj38+0AR1EiJ1kk0XEZFAbO4gQJwOj44F0+m6TsYvWK". - "KKWQOQUvVwFPHCAxNBlZDs1psk30wXsv4XWi8VvqefXXwcYWg6FRPy8racBzsXjjQxtXim4sra5bKCG6X3QCLOR4lxBwGakS1g+Ch". - "hORN5FcttWpSumpCunZADEH5L2iATa71bAaUUW9XzxVcEs4yCq2zD9qaMML1QQXQGdaMmwYW8PM41RQxwvmgu0+yU8Qap7uUMbN59". - "UykUKXF4P0J5hgD4gi5qTjuW6DQkDHehDfMNvLnbgvp/vV7GdpKEGdA5aTMRiAIAQDj6HJHR7rgyHBc+T/a16jaQzNFbYB0FDXa0H". - "C0a+QSrrD82J1qj3G73NQJ6buTT+eppdf+cehuauCCCCLDeDkcwAWM8xjA+T8JcKxp3FKu4oFGLUOZJEpyJNIqKfpP4F/kBI9bLIW". - "UxIErPLvozNFLb5sOmRgwwbj6kaMbIUrjJMJzIIRooAUOpNzwzdAcMX+hfvlFC6UEaCQ8K0N4FGrzbVQuM+InuZNBjruOcLzpL7Ab". - "LSr2LT0lIVG8tpBZnpxDOtwfgX4X2snz5z4y8swaYRfWM2+fhkaS/3gotyqE/RVGnrAgHkz6daQ0D6A8Mlsvm24gDerSYgNhaZiP4". - "avvq4giFCgkdJzZa+MAv442zCQxby9hmgK4C7c+MxZCBgZtJam24tVvBmlS4RhoERaH6nRhpvkg4FKfipKXrj32nPjy+p+NsZ9d4W". - "L16noPvTu/OBuSSt/z1BaUCNoPN2c7phfhJoqbLfk1qVconwEUw3DEm3L1Xq3W0x9Ix0TDLnHTpwzZ5W5MsYP1gCqTSsxN5jFK+KT". - "gbweiW1ChXzhksoXmh7lkx11Vvz8fxsCsaXOsVKI/sD84t3z6pYu5fkaZdCXJUkLSbQd56aWCQz5ZLJ57Juwn3csFV9jaDDCeoEfX". - "+owIbceGmT3qseqmOri44oWjam8vmWoMt4iYJk/Pb5WPdpi/h+vC8wszwKHrpzt08zRE4Ql4LEwqL39httGJckD8in8yleUhs7sfV". - "sG8MFN0PJ2QB2nAp0A/RrXmzrU+VK2YOTrWlXJEmr7y2w4C0ac90wGQ8UWPmwe1+pCCg/GmvZnO7EOovmPZ19gSn8w2E/LraomlRU". - "g6fSmc0lMi1NRopTmjCAeB+UFN80YfQgiUeGoSvzLXMrm9nsxw76sOWYQvmbirxEy3i3j5Vtr1Jqbx1lXbBhtq3wd9Nsi2JteIfmP". - "Per/b53HCKuWZafa2dYuduLD74XtYHo2UKdDeY4c2t1K9s2qsgj7E8I3Kw11AZFEYdXRlOKIZEp4tzsHT4Rdny6vrtINdq8DA76nE". - "BjaygtSaIi4Hu5FhSfU9FFBs6Xeusm+xKyka1PH/LjUJ2KN25w8PlLlhd3bR8WL2Goy4qV4yxxtxd72/laL893pNK0R4/Vq6t/VOL". - "F0Ysqdi6OwndyLb+i/t+ZwXxw127vnBdIMkJXI5kAETwxRcZHy5x8Y/L+8NyyywdKNZBNEfm2kTJON6nYVulHTryMKekyTjWrpGYS". - "8pOtKK9jcJPX4uBHJkhYP8M2nta4Z8Nh/4r9NQG8OM+BeIf0Z+qjZAluPceglBJ5LV62nIeIHxZ3IaDncwUZRMtSJ1dBXn74g2AyP". - "H72Re5LHtS2q707bNLtFRNstGnUe/RtAe96eJ8PWS4Z01IlJJIEslwWzsEMPWequ39P16Wq5gAmJVuQ6LTgIAFqpkienyhhIsWRZW". - "Oskzv87FD28x1IiqHsOd+GkYNkwYxOkmJFYwDnyda2fKrgXLMalkJxs65cGUMZtHw9fS0J2sxtB2oDqG0OaFLpLcOhtaani9WOBrs". - "mEEH5SZoRE5ApRNiHfHOeBA6mdOTpOVH/omGbHz/Q9Wqak+HaDF5sSeRAJMTSmLdPKeWLcq3/s+E6x5of7PTg4fqApgnBPCyo7rJJ". - "9fkQkvLm4z48OSuqkIORdYBPFx33adT2E6XzNS92LLhgLXmnd6sV7D6naA6k3IsrX2xHXlE7xtDfJX/zTP/7aeWVtddEbeK2aJd5c". - "cZQ5w5QUAzgRL1wZe9clWKBhTNS1uOZVU9tJC2ARgzUtNZrn/hBWrWQawOnLLexk2FnpU+P9KrWVL0xHSB9jqINsuPlcP9O72Ta6I". - "GrHXz28rLzCmW8ZOjkEWrIS23/xIuFW9txsFYpXJpnX9alcAdBCkBuKI8YMzpRrFeV5ZIwhNRMeB/VkD2YswlVDX0moLXNCg5fFgy". - "5lq805RSpV1eXakozQh5MW4QhJ0HmBsonng9iibNrHo6e5E4S+4l6xRDhma4aDH85Is4xttwx3i4pKhMSaupUcdktInGHhazYaWEh". - "5jHdylUWYm7QWQXfiX6GDy8KrZjFt5q274ISmsQMC+iDxV/i2NQ0UTy9T3Pag2AoNqDdKzbJqyHCLrUEQioRlC6BO3rJL9IVeuzbK". - "rzYd8GHzFgJmXGCEVHcEfkUfT+oBimo4RIS/dDX1hi274Koz/K5Axj+aYMSLo1IyRZNLEgT/uKk8e2JOiVY3ow7SfrPWITii/ClkA". - "pZtXHKt4dZyVMBu075hI3fMsqeQK6X1C8oDUOKFFbMRfBMNKShQ0xwceoyq5uVUKTv45mcIsB8ZOzjbjR4znW+lajmQUAyJQYEMI3". - "AUHfxmvfdAU5ffLQMa7SkxQyiodFDYDyqyWP1TxN/39wpbIY7R8R+wYmQ+phIxEhESZJTEHnW+CrZKWvSJuY3dhhUwpjpUN+0DMGI". - "E7F2SbzxikyABaU66bNGJZwRPQrSCBWqTm9rl+CIg+9gc3sD4VxgekWJUJYbbZMQL7JoLQ8KPpfd3bXu0MpGv67v4SUCp2/BCB6ks". - "WtyqlW84XbmJ5A6eXNLT3t1G5HCj6UkYwkSQdXoq0870pA5GCWaK7MaiFCHsO4Jg0klXJonazKudY4MftONLhflXNccqfUb0iCdEi". - "L427kOpMeJYHuwneyCM2bEIC2UT820pdPcubsqO00luYEh3bWP2rPaoC82jSMqB+PmXuVMAzOkMSaVI0/GOWrXLLjZCGZ6lk2YTks". - "Xw1kuGWbkHmcbw9oZMVydVq/bx30f6bWdZwxM0EhgZleQO7/YpIiz25DxM5PNs8jaRovEOwThPv5/3XDOpUAf0Z+4Oz5VFEgvw7Cd". - "iHYNQsbjqgiI32+I1Dz4UeBcPT0Gs7MdfMyr1w53YA595mVEdVNASJWeG3dUdA7gnEANxa4wV60iMVqg6+CSqbwy2TpLGxDpiEjrv". - "zpD6Pwhs29QNOv/1t5q0nmeoAU0I3GRY1g3LwF3XhXLpbL4klv1pMVS8kiAp2TYxHYFGfZC8oDLNvyjLfycofusTYrgBGAoxTU3nq". - "w5plYO5vDkdLsehCTzyZwYzA147BBbjxgjDpzH8BsLfD5miBX/PTMOIxKtGE2fx6fakRpneYberW/wqJeaPAGUVXfiDIWBRfkxmDb". - "UMZyEt+mON5vQyYshrviqGgIhzEENnTWHqZehwCKveGWKoO0MB1PGCXGS3/fwRU14eEuLt5BbFnrZ404kWTPs55aMc4LaOPrcoo8r". - "XfxGY+WDM1y42OrDsYteECjUk/smIHzfNa8dcaP0kw5DVduLvZj/Gg2aNGdOjlDjUr7oZ8mxFszKtqOkwoNgmDZG7/GpNsRoLqPRD". - "GZLeTsWXxnbvPGA+4nPyYhvGBklJMklQCUvPr7QiaM1XRgcQw6EjGXr7ckjaNr9JVWdhT/ZWq/t91VvImhabJSM8WnCBMqs+sHR2n". - "uuiXu85AQVdxZTZUa6MGuYgxP4qtn4+fPI2/XYdqwdflKNFkocm1u9WDIhFh2Ur2TGyGij6Gwho+FG/8xNSYXkhje9Wu7Gqh31+jF". - "vX1Ge9X3MQPZ3x4w4Ks/lYl6dBouz12dmRz3u4pt7TekIcW1iukB+JOKC5BaPX/B2B7RaovGmPCc2Lx7CjYnfnUzmHpxaweEa79Sf". - "72rEP6o6Q0cprD+6+5Aa0baiIE4cQRlPZ87EOeR/fndczMxXPmwVV1lBjsmkBukihcN8vYWv91RupN1jKY7MaqE0o5pc9p7TnaRuX". - "uw82aHZRlCVVaPn6hFA+pYKacyEoVEYM0QwusR81PTcfTPjZ76yv8WwicaV1TvqqG6hOtvSvxZwT+4iPa5u8uOzOj/aOgIhB8TVSt". - "bT9+50KZzT3QeO/YmMnFXhVBe3ij/xGGM+neGlkbK2uBG/L2nQ6lvzxVAk8RuPXoMMUAz1u3lymJs1EGrsY4aBkhR+tyOCG9VWOdH". - "YuzqLskspjzsx88F5gKZd//C1gxDH3XBADVV0YOFltKqGru/CxhjuMSVT9A5O6C7F1fCC0Fh4ITzCh0V+vRX9VyoH8mAQSKRbgJJY". - "u/yHjd9NoRw9SDALJ5gZozALVw9jqmGu9LqBm3I/4x1ON1NgcJyGdflDdK2aOQh5yfb3j9d61/d3pfHsD69y4Z7rEvkhsYGDhvMAY". - "3ltrtG736H3iyUjk4xSCkoNxvMIA1hfAFdkReGZRcnCxr1KeKSIBOYUqdt31t+cjGtyozUJhXE/Aje7uWzipvlkxaiW5kOTsLXR82". - "SGCOfZxnuFWbyEeKS6wbeTHyoO5LLpLdLHNcWFw5Cf6dAlFEG/zX2RiOhxCYWBXVIhHAgv6fb8LBtpLutTlXW+x/nhiBLAgMDw5+n". - "4KPnRsp/lYPrIGHHvFvn2DF/t2m+gjVxwOuWGx9fmYmyK49mqOt8veiO4v0uWx0iU979LElo+fZAmIfVrJraPGorvN2loNPbdNxx5". - "KY4n/3nac3dfxA7kxugZCoJLX1qWgUdvTtESTkWNcIJi0vkw2zGU0oz19GbmrEXRwPxgWiL23puDnCT7w6WfuX/Z7y3Ql/i5Cc+vC". - "mta/Mt+vOUCdp9s1wKaBaHAJvXyK4w+k0jDxIBWoU7KceLF72diYmb0Xu61XtjftC070U6GLyMlzhqGe3Sy/d/6VdMqX4A9V/xJO/". - "60pwF7PneD+fXfYMkSvvTDdBA0dSKp1E9IGsunJCIuSv7liwean+QXWLQfvikw4oiZ2l2kCetP13vx+qEWvHygUTvQ0AnrBiYhdDF". - "rVCk9/0uItWJpQYIAcUV6NI/qfxTS+FdTJT+rs1m+eTDBx6ar353tXnXpR2c94O3QeQ9qWv3ooBjVTIkmJ8ZG4FxUzbqiLUgmABMy". - "ojBleAymZDsxJNZayu9wqO3+bfHl1iQq5PgtwX8ajPFJ039IN4faWP36Llb/WaOs5yc+PcNt1a/6+I94PuBnCF8HAf8vwADS7GaT0". - "D4fMwAAAABJRU5ErkJggg=="; - header("Content-type: image/png"); - echo base64_decode($sImg); - exit; - } - - public function getGifBg() - { - $sImg = "R0lGODlhCgAyANUAANHo+pfK85rM8/X6/vb6/v///5jL85bJ8+Hv/KbS9dzt+87m+qTR9fH4/er1/b7e+MTh+P3+/63V9u/3/". - "dfq+rnc97fa96DP9Nns+53N9LLY9tTp+sHg+Mzl+cfi+OPx/Pv9/7DX9p/O9Oz2/bTZ9uXy/KLQ9Pj7/ujz/bzd9/7+//r8//P5/s". - "nj+ZvM897u+6nT9avU9qvU9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAAKADIAAAb". - "FwINwSAwYj0iDcskUOJ9Ql3RKzVivWJF2y714v2CTeExmmM/ohHrNhrnf8Jh8PpdJ7vh8aM/va/6AgSSDhIUWh4iJFYuMjSmPkJEP". - "k5SVHJeYmRCbnJ0en6ChLaOkpR2nqKkLq6ytAK+wsRuztLUUt7i5GLu8vQq/wMEvw8TFCMfIyR/LzM0lz9DRKNPU1Q7X2Nkj29zdE". - "9/g4Q3j5OUs5+jpA+vs7QTv8PEn8/T1K/f4+SD7/P0R/wADqhhIsGCBgwgTBgEAOw=="; - header("Content-type: image/Gif"); - echo base64_decode($sImg); - exit; - } - - public function getGifDe() - { - $sImg = "R0lGODlhEgANAIQZAAAAABAFBhEGBhIGBhQHBxUHCCYNDZQqH5QrI9c4M+M4M9w9M+g/MuNDM/BFM99tI+t3H+CyDerIB+zIB". - "uzKBurLCPfcAPfgAPjlAP///////////////////////////ywAAAAAEgANAAAFVaARCGRpmoExAGzrvsBAwHRLFHVdIEfv/8ADou". - "EoGo9IR2PBaDqfUMYioahar1hF4gHper9gyKOCKZvPaExFcmm73/CLZGKp2+94yyRCmfj/gIAUESEAOw=="; - header("Content-type: image/Gif"); - echo base64_decode($sImg); - exit; - } - - public function getGifEn() - { - $sImg = "R0lGODlhEgANAOfRANzd6P9LQP7//93e6ba32v8HB/J4ef//+/85Of8fFVddwP8aFq+13P8aFPr////f3f8XE/n//62s3fQuL". - "AIDj6ys3uHZ5P8uLOjp793f6dbX6uvBxsyasurCx/9fXcadtS88r+Da5EZHr+Hi7A0NlUVGqcjR9MKaunh5x/8REQAAkv9IP/9BPn". - "h6wi4/td3c5uLl7P8PD7vO9aGSw7bM9uDh6UpLsf8hFv/f3PPx9/Dx9DFCuMDE4cHF4/sAANPU3ufp8JSDvuVocf8ODvz8+/xRTPQ". - "gG+PM0ZSWzs/R476+4ujp8v8/PurO0uPZ3//u5fQCAOPj6nFxxf8UE8rM4P/w5YGM18PH4/79/ExUuP3//4CAxqmo3KaZxv7+/Rcs". - "tO3v89XW6fS8waOj2snM7Nra7Ccon+no9v03OFJZvuK2xBEipP89Ov8dE+be4u3u8/w3OOVocv8sKv8EBOjo9+/u+Kap15SFvgwRl". - "ba327uXteHh7tvc5yo3q9XX5SQ4uU5MrtjW5qaVxvDS2f8DA+Tj6vr6/j1FtVlgvL+euvHw9v+rqe7u+XKJ1ebn7p2x7CUmnvb2+d". - "PW8P8cEc/P4efn8/38/5Ws66mYx/ccGNfY5vh0d927zSUlov96ev88OgAAjmmA09rb5v+xsPF5eMnR8i0upuuAgvEyLx0rq97f6cu". - "nwEBIuO/Aw/9/fuTm6vn5+vTEyM7P5rq63BESlf+Fgv8fF8SWsOfp7+2rrvX1+La23RgmqLe43PPV2vdydhcnqIWQ2BEgoube4wAS". - "n82atOHj6uTT2f97etKjuf9dWsSduZyb08fJ4fn5+/z8/f+ZAP///////////////////////////////////////////////////". - "/////////////////////////////////////////////////////////////////////////////////////////////////////". - "///////////////////////////////////ywAAAAAEgANAAAI/gB/YHCkig+AAVGGuSmUAYCoEbpgGXsFY8kWM7T6JEI14QMIEpB". - "aVNIBRBOSOtEqmAK27EabYqk6jYl2hpksKnjSmIgmqdEqWw2ShSITrZQCFXb8IDpkRdGBCLGmpBDj4ECOYKyyXHFyyoCQX8hceShQ". - "QFktT5viGCDV5AgUaHDjypXrI9exIgHYwEHA5MIcQnJYIEDzKcCKVi+63BE0CMeTUTGGLKrywBemIDMCJVnz5ZIWATI4LYCghoaAa". - "I/+EGNAqQQXQ4xQuDiRYBKHHVLoWJIAaFaNZkSU2KAgTI+RTLd4gRKxC0uZPQPAvAnTiwCPEB02WOiRh4CGZ15wAgUEADs="; - header("Content-type: image/Gif"); - echo base64_decode($sImg); - exit; - } -} - -/** - * Class requTranslations - */ -class requTranslations -{ - /** - * @return array - */ - public function getTranslations() - { - return array( - 'de' => array( - 'RequCheck' => 'Mindestanforderungsprüfung', - 'ExecNotice' => 'Führen Sie diese Prüfung immer aus dem Stammverzeichnis '. - '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 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 '. - 'als %1$s.
'. - '
Die passende PHP-Version '. - '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 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". '. - '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.
'. - '
Die passende PHP-Version '. - '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 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". '. - '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 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". '. - '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 '. - 'auf Ihrem Server vorhanden.
'. - '
Das Modul kann ohne die '. - '%1$s-Erweiterung nicht ausgeführt werden. Fragen Sie bei Ihrem Serverprovider nach der '. - 'Installation dieser Erweiterung.
'. - '
Ü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.
', - '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 '. - 'passender Version installiert.
'. - '
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 kontaktieren Sie uns bitte über '. - 'support@shopmodule.com.
', - 'hasMaxShopVersion' => 'maximal Shop Version %1$s', - 'hasMaxShopVersion_DESC' => '
Das Modul ist bis zur Shopversion %1$s freigegeben.
'. - '
Die Shopsoftware ist in '. - 'passender Version installiert.
'. - '
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 kontaktieren Sie uns bitte über '. - 'support@shopmodule.com.
', - 'hasMinModCfgVersion' => '%2$s (ModCfg-Eintrag "%1$s") mindestens in Version %3$s', - 'hasMinModCfgVersion_DESC' => '
Das Modul benötigt die Zusatzsoftware "%2$s" mindestens in '. - 'Version %3$s
'. - '
Die Software ist in '. - 'passender Version installiert.
'. - '
Die Zusatzsoftware ist '. - 'möglicherweise gar nicht oder in falscher Version installiert. Bitte installieren Sie die '. - 'Zusatzsoftware, bevor Sie diese Installation fortsetzen.
'. - '
Bei Fragen kontaktieren Sie uns bitte über '. - 'support@shopmodule.com.
', - 'hasMaxModCfgVersion' => '%2$s (ModCfg-Eintrag "%1$s") maximal in Version %3$s', - 'hasMaxModCfgVersion_DESC' => '
Das Modul benötigt die Zusatzsoftware "%2$s" höchstens '. - 'in Version %3$s
'. - '
Die Software ist in '. - 'passender Version installiert.
'. - '
Die Zusatzsoftware ist '. - 'möglicherweise gar nicht oder in falscher Version installiert. Bitte installieren Sie die '. - 'Zusatzsoftware, bevor Sie diese Installation fortsetzen.
'. - '
Bei Fragen kontaktieren Sie uns bitte über '. - 'support@shopmodule.com.
', - 'requireNewLicence' => 'bisheriger Lizenzschlüssel kann verwendet werden', - 'requireNewLicence_DESC' => '
Diese Prüfung versucht zu ermitteln, ob Sie für den '. - 'Einsatz dieses Moduls einen aktuellen Lizenzschlüssel benötigen:
'. - '
Sie haben für dieses '. - 'Modul einen Lizenzschlüssel hinterlegt, der wahrscheinlich auch für die neue '. - 'Modulversion geeignet ist.
'. - '
Sie benötigen '. - 'für dieses Modul wahrscheinlich einen neuen Lizenzschlüssel. Haben Sie diesen schon '. - 'vorliegen, führen Sie die Installation aus und tragen den Lizenzschlüssel dann im '. - 'Adminbereich Ihres Shops ein. Ansonsten können Sie den Lizenzschlüssel in unserem Shop '. - 'www.oxidmodule.com erwerben oder '. - 'sich ebenfalls im Adminbereich Ihres Shops einen kostenfreien Test-Lizenzschlüssel '. - 'erstellen.
'. - '
Für Details wenden Sie sich bitte an '. - 'buchhaltung@shopmodule.com.
', - 'hasModCfg' => 'Modul-'. - 'Connector installiert', - 'hasModCfg_DESC' => '
Das Modul erfordert zwingend den D3 Modul-Connector.
'. - '
Der Modul-Connector ist '. - 'installiert.
'. - '
Das Modul kann ohne den Modul-'. - '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 kontaktieren Sie uns bitte über '. - 'support@shopmodule.com.
', - 'isShopEdition' => 'ist Shopedition %1$s', - 'isShopEdition_DESC' => '
Das Modul erfordert eine dieser Shopeditionen: %1$s
'. - '
Der Shop ist in der '. - 'passenden Edition installiert.
'. - '
Das Modul kann in Ihrer '. - 'Shopedition nicht ausgeführt werden. Bitte fragen Sie nach einer Modulversion für Ihre '. - 'Shopedition.
'. - '
Bei Fragen kontaktieren Sie uns bitte über '. - 'support@shopmodule.com.
', - 'hasZendLoaderOptimizer' => 'Zend Optimizer (PHP 5.2) oder Zend Guard Loader (PHP 5.3, 5.4, 5.5, 5.6) '. - 'installiert (auf passendes Zend-Installationspaket achten!)', - 'hasZendLoaderOptimizer_DESC' => '
Das Modul erfordert (je nach PHP-Version) den Zend Optimizer '. - '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". '. - '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.
'. - '
Ü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.
', - '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 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.', - 'showPhpInfo' => 'PHPinfo anzeigen', - 'dependentoffurther' => '* abhängig von ungeprüften Voraussetzungen', - 'oneandonedescription' => '** geprüft wurde das Ausführungsverzeichnis, '. - 'providerabhängig müssen Unterverzeichnisse separat geprüft werden (z.B. bei 1&1)', - 'or' => ' oder ', - 'toggleswitch' => 'Klick für Details zur Prüfung', - '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', - 'ExecNotice' => 'Execute this check script in the root directory of your shop. In this '. - 'case only checks can executed succesfully.', - 'RequSucc' => 'condition is fulfilled', - 'RequNotSucc' => 'condition isn\'t fulfilled', - 'RequUnknown' => 'condition unclear, see notes in help text', - 'RequNotCheckable' => 'condition isn\'t checkable', - 'hasMinPhpVersion' => 'at least PHP version %1$s', - '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' => '
    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'=> '
    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' => '
    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' => '
    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' => '
    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' => '
    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' => '
    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' => '
    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 or orange marked '. - 'conditions.

    ', - 'deleteFile1' => 'Please delete this file after use on your server! Click here, to delete this file.', - 'showPhpInfo' => 'show PHPinfo', - 'dependentoffurther' => '* dependent of further unchecked conditions', - 'oneandonedescription' => '** this check use execution directory only, provider dependend '. - 'subdirectories have to check separately (e.g. at 1&1)', - 'or' => ' or ', - '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.
  • ', - ), - ); - } -} - -/** - * Class requRemote - */ -class requRemote -{ - public $blUseRemote = true; - - public $oModuleData; - - /** - * @param $sModId - * @param $sModVersion - * @param $sShopEdition - * - * @return bool|array - */ - public function getShopEdition($sModId, $sModVersion, $sShopEdition) - { - $sUrl = "moduleversion/"; - $sUrl .= 'modid/' . urlencode($sModId) . '/'; - $sUrl .= 'forcemodversion/' . urlencode($sModVersion) . '/'; - $sUrl .= 'edition/' . urlencode($sShopEdition) . '/'; - - /** @var stdClass $oModuleData */ - $oModuleData = $this->_getRemoteServerData($sUrl); - - if ($oModuleData->status == 'OK' && isset($oModuleData->moduleversion->compatible_release)) { - return explode(',', $oModuleData->moduleversion->compatible_release->shopedition); - } - - return false; - } - - /** - * @param $sModId - * @param $sModVersion - * @param $sShopEdition - * - * @return bool|string - */ - public function getMinShopVersion($sModId, $sModVersion, $sShopEdition) - { - $sUrl = "moduleversion/"; - $sUrl .= 'modid/' . urlencode($sModId) . '/'; - $sUrl .= 'forcemodversion/' . urlencode($sModVersion) . '/'; - $sUrl .= 'edition/' . urlencode($sShopEdition) . '/'; - - /** @var stdClass $oModuleData */ - $oModuleData = $this->_getRemoteServerData($sUrl); - - if ($oModuleData->status == 'OK' && isset($oModuleData->moduleversion->compatible_release)) { - return $this->shortenVersion($oModuleData->moduleversion->compatible_release->fromshopversion); - } - - return false; - } - - /** - * @param $sModId - * @param $sModVersion - * @param $sShopEdition - * - * @return bool|string - */ - public function getMaxShopVersion($sModId, $sModVersion, $sShopEdition) - { - $sUrl = "moduleversion/"; - $sUrl .= 'modid/' . urlencode($sModId) . '/'; - $sUrl .= 'forcemodversion/' . urlencode($sModVersion) . '/'; - $sUrl .= 'edition/' . urlencode($sShopEdition) . '/'; - - /** @var stdClass $oModuleData */ - $oModuleData = $this->_getRemoteServerData($sUrl); - - if ($oModuleData->status == 'OK' && isset($oModuleData->moduleversion->compatible_release)) { - return $this->shortenVersion($oModuleData->moduleversion->compatible_release->toshopversion); - } - - return false; - } - - /** - * @param $sUrl - * - * @return stdClass - */ - protected function _getRemoteServerData($sUrl) - { - if (isset($this->oModuleData[$sUrl])) { - return $this->oModuleData[$sUrl]; - } - - $oFailureData = new stdClass(); - $oFailureData->status = 'NOK'; - - if (false === $this->blUseRemote) { - return $oFailureData; - } - $sHost = "http://update.oxidmodule.com"; - $sData = $this->curlConnect($sHost . '/serialized/' . $sUrl); - $oData = unserialize($sData); - - if (false == $oData) { - return $oFailureData; - } - $this->oModuleData[$sUrl] = $oData; - - return $this->oModuleData[$sUrl]; - } - - /** - * @param $sFilePath - * - * @return string - */ - public function curlConnect($sFilePath) - { - $sContent = ''; - - if (($ch = $this->_hasCurl())) { - $sCurl_URL = preg_replace('@^((http|https)://)@', '', $sFilePath); - curl_setopt($ch, CURLOPT_URL, $sCurl_URL); - if ($_SERVER['HTTP_USER_AGENT']) { - curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); - } - curl_setopt($ch, CURLOPT_HEADER, 0); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_TIMEOUT, 1); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); - curl_setopt($ch, CURLOPT_POST, 0); - $sContent = curl_exec($ch); - } - - return $sContent; - } - - /** - * @return null|resource - */ - protected function _hasCurl() - { - if (extension_loaded('curl') - && function_exists('curl_init') - && function_exists('curl_exec') - ) { - return curl_init(); - } - - return null; - } - - /** - * @param $sVersion - * - * @return string - */ - public function shortenVersion($sVersion) - { - $aVersion = explode('.', $sVersion); - - unset($aVersion[3]); - - return implode('.', $aVersion); - } -} - -/** - * Class requTests - * contains test functions - */ -class requTests -{ - public $oBase; - public $oDb; - public $oConfig; - public $blGlobalResult = false; - - /** - * @param requCheck $oCheckInstance - * @param requConfig $oConfig - * @param $oDb - * @param requRemote $oRemote - */ - public function __construct(requCheck $oCheckInstance, requConfig $oConfig, $oDb, requRemote $oRemote) - { - $this->oBase = $oCheckInstance; - $this->oConfig = $oConfig; - $this->oDb = $oDb; - $this->oRemote = $oRemote; - } - - /** - * @return requCheck - */ - public function getBase() - { - return $this->oBase; - } - - public function getDb() - { - return $this->oDb; - } - - /** - * @return string - */ - public function getBasePath() - { - return $this->getBase()->getBasePath(); - } - - /** - * @param bool $blResult - */ - public function setGlobalResult($blResult) - { - $this->getBase()->blGlobalResult = $blResult; - } - - /** - * @param $sMethodName - * @param null $aArguments - * - * @return array - */ - public function checkInSubDirs($sMethodName, $aArguments = null) - { - return $this->getBase()->checkInSubDirs($sMethodName, $aArguments); - } - - /** - * @param $aConfiguration - * - * @return array - */ - public function hasMinPhpVersion(&$aConfiguration) - { - $aResult = array($this->getBasePath() => false); - - if (version_compare(phpversion(), $aConfiguration['aParams']['version'], '>=')) { - $aResult[$this->getBasePath()] = true; - } - - $aResult = array_merge($aResult, $this->checkInSubDirs(__FUNCTION__, $aConfiguration['aParams'])); - - return $aResult; - } - - /** - * @param $aConfiguration - * - * @return array - */ - public function hasFromToPhpVersion(&$aConfiguration) - { - $aResult = array($this->getBasePath() => false); - - if ((version_compare(phpversion(), $aConfiguration['aParams']['from'], '>=')) && - (version_compare(phpversion(), $aConfiguration['aParams']['to'], '<')) - ) { - $aResult[$this->getBasePath()] = true; - } - - $aResult = array_merge($aResult, $this->checkInSubDirs(__FUNCTION__, $aConfiguration['aParams'])); - - return $aResult; - } - - /** - * @param $aConfiguration - * - * @return array - */ - public function hasMaxPhpVersion(&$aConfiguration) - { - $aResult = array($this->getBasePath() => false); - - if (version_compare(phpversion(), $aConfiguration['aParams']['version'], '<=')) { - $aResult[$this->getBasePath()] = true; - } - - $aResult = array_merge($aResult, $this->checkInSubDirs(__FUNCTION__, $aConfiguration['aParams'])); - - return $aResult; - } - - /** - * @param $aConfiguration - * - * @return array - */ - public function hasExtension(&$aConfiguration) - { - $aResult = array($this->getBasePath() => false); - - if (extension_loaded($aConfiguration['aParams']['type'])) { - $aResult[$this->getBasePath()] = true; - } - - $aResult = array_merge($aResult, $this->checkInSubDirs(__FUNCTION__, $aConfiguration['aParams'])); - - 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 - * - * @return bool - */ - public function hasMinShopVersion(&$aConfiguration) - { - if ($this->getDb()) { - $sField = 'oxversion'; - $sSelect = "SELECT " . $sField . " FROM oxshops WHERE 1 ORDER BY oxversion ASC LIMIT 1"; - $rResult = mysqli_query($this->getDb(), $sSelect); - $oResult = mysqli_fetch_object($rResult); - - $oEditionResult = $this->_getShopEdition(); - $sEdition = strtoupper($oEditionResult->oxedition); - - $mMinRemoteVersion = $this->oRemote->getMinShopVersion( - $this->oConfig->sModId, - $this->oConfig->sModVersion, - $sEdition - ); - - if ($mMinRemoteVersion) { - $aConfiguration['aParams'] = array('version' => $mMinRemoteVersion); - } else { - $aConfiguration['aParams'] = array('version' => $aConfiguration['aParams'][$sEdition]); - } - - if (version_compare($oResult->oxversion, $aConfiguration['aParams']['version'], '>=')) { - return true; - } - } - - return false; - } - - /** - * @param $aConfiguration - * - * @return bool - */ - public function hasMaxShopVersion(&$aConfiguration) - { - if ($this->getDb()) { - $sField = 'oxversion'; - $sSelect = "SELECT " . $sField . " FROM oxshops WHERE 1 ORDER BY oxversion DESC LIMIT 1"; - $rResult = mysqli_query($this->getDb(), $sSelect); - $oResult = mysqli_fetch_object($rResult); - - $oEditionResult = $this->_getShopEdition(); - $sEdition = strtoupper($oEditionResult->oxedition); - - $mMaxRemoteVersion = $this->oRemote->getMaxShopVersion( - $this->oConfig->sModId, - $this->oConfig->sModVersion, - $sEdition - ); - - if ($mMaxRemoteVersion) { - $aConfiguration['aParams'] = array('version' => $mMaxRemoteVersion); - } else { - $aConfiguration['aParams'] = array('version' => $aConfiguration['aParams'][$sEdition]); - } - - if (version_compare($oResult->oxversion, $aConfiguration['aParams']['version'], '<=')) { - return true; - } - } - - return false; - } - - /** - * @param $aConfiguration - * - * @return bool - */ - public function isShopEdition(&$aConfiguration) - { - if ($this->getDb()) { - $oResult = $this->_getShopEdition(); - - $mRemoteShopEditions = $this->oRemote->getShopEdition( - $this->oConfig->sModId, - $this->oConfig->sModVersion, - $oResult->oxedition - ); - - if (is_array($mRemoteShopEditions)) { - $aConfiguration['aParams'][0] = $mRemoteShopEditions; - } - - if (in_array(strtoupper($oResult->oxedition), $aConfiguration['aParams'][0])) { - $aConfiguration['aParams'][0] = strtoupper($oResult->oxedition); - return true; - } - } - - return false; - } - - /** - * @return bool|object|stdClass - */ - protected function _getShopEdition() - { - if ($this->getDb()) { - $sField = 'oxedition'; - $sSelect = "SELECT " . $sField . " FROM oxshops WHERE 1 LIMIT 1"; - $rResult = mysqli_query($this->getDb(), $sSelect); - $oResult = mysqli_fetch_object($rResult); - - return $oResult; - } - - return false; - } - - /** - * @return bool - */ - public function hasModCfg() - { - if ($this->getDb()) { - $sModId = 'd3modcfg_lib'; - $sSelect = "SELECT 1 as result FROM d3_cfg_mod WHERE oxmodid = '" . $sModId . "' LIMIT 1"; - $rResult = mysqli_query($this->getDb(), $sSelect); - if (is_object($rResult)) { - $oResult = mysqli_fetch_object($rResult); - - if ((bool) $oResult->result == true) { - return true; - } - } - } - - return false; - } - - /** - * @param $aConfiguration - * - * @return bool|int - */ - public function hasMinModCfgVersion(&$aConfiguration) - { - if ($this->getDb()) { - $sSelect = "SELECT IF ". - "(INET_ATON(oxversion) >= INET_ATON('" . $aConfiguration['aParams']['version'] . "'), 1, 0) AS result ". - "FROM d3_cfg_mod ". - "WHERE - oxmodid = '" . $aConfiguration['aParams']['id'] . "' AND - oxversion != 'basic' - ORDER BY oxversion ASC LIMIT 1"; - - $rResult = mysqli_query($this->getDb(), $sSelect); - $oResult = mysqli_fetch_object($rResult); - $blReturn = (bool)$oResult->result; - - if (false == $blReturn) { - $this->setGlobalResult(false); - } - - return $blReturn; - } - - $this->setGlobalResult(false); - - return false; - } - - /** - * @param $aConfiguration - * - * @return bool|int - */ - public function hasMaxModCfgVersion(&$aConfiguration) - { - if ($this->getDb()) { - $sSelect = "SELECT - IF (INET_ATON(oxversion) <= INET_ATON('" . $aConfiguration['aParams']['version'] . "'), 1, 0) AS result - FROM d3_cfg_mod WHERE - oxmodid = '" . $aConfiguration['aParams']['id'] . "' AND - oxversion != 'basic' - ORDER BY oxversion ASC LIMIT 1"; - - $rResult = mysqli_query($this->getDb(), $sSelect); - $oResult = mysqli_fetch_object($rResult); - $blResult = (bool)$oResult->result; - - if (false == $blResult) { - $this->setGlobalResult(false); - } - - return $blResult; - } - - $this->setGlobalResult(false); - - return false; - } - - /** - * @param $aConfiguration - * - * @return bool - */ - public function requireNewLicence(&$aConfiguration) - { - if ($this->getDb()) { - $sSelect = "SELECT - oxversion as oxversion - FROM d3_cfg_mod WHERE - oxmodid = '" . $this->oConfig->sModId . "' - ORDER BY oxversion ASC LIMIT 1"; - - $rResult = mysqli_query($this->getDb(), $sSelect); - $oResult = mysqli_fetch_object($rResult); - - if (isset($oResult) - && is_object($oResult) - && isset($oResult->oxversion) - && isset($aConfiguration['aParams']['checkVersion']) - ) { - $sInstalledVersion = $this->_getConvertedVersion( - $oResult->oxversion, - $aConfiguration['aParams']['remainingDigits'] - ); - $sNewVersion = $this->_getConvertedVersion( - $this->oConfig->sModVersion, - $aConfiguration['aParams']['remainingDigits'] - ); - if (version_compare($sInstalledVersion, $sNewVersion, '>=')) { - return true; - } - } - } - - return 'notice'; - } - - /** - * cut not used version digits - * @param string $sVersion - * @param int $iRemainingDigits - * - * @return string - */ - protected function _getConvertedVersion($sVersion, $iRemainingDigits) - { - $aInstalledVersion = explode('.', $sVersion); - return implode('.', array_slice($aInstalledVersion, 0, $iRemainingDigits)); - } - - /** - * @return array - */ - 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') - )) { - if (function_exists('opcache_get_status') - && ($aOpCacheStatus = opcache_get_status()) - && $aOpCacheStatus['opcache_enabled'] - ) { - $aResult[$this->getBasePath()] = null; - } else { - $aResult[$this->getBasePath()] = true; - } - } - - if ($blCheckBasePathOnly == false) { - $aResult = array_merge($aResult, $this->checkInSubDirs(__FUNCTION__)); - } - - return $aResult; - } - - /** - * @return array - */ - public function hasIonCubeLoader(&$aConfiguration, $blCheckBasePathOnly = false) - { - $aResult = array($this->getBasePath() => false); - - if (function_exists('ioncube_loader_version')) { - $aResult[$this->getBasePath()] = true; - } - - 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; - } -} - -/** - * Class requTransformation - */ -class requTransformation -{ - public $oCheck; - - /** - * @param requCheck $oCheck - */ - public function __construct(requCheck $oCheck) - { - $this->oCheck = $oCheck; - } - - /** - * @param $aCheckList - */ - public function transformCheckList($aCheckList) - { - $this->_removeDeprecatedLibs($aCheckList['hasMinModCfgVersion']); - $this->_removeDeprecatedLibs($aCheckList['hasMaxModCfgVersion']); - - return $aCheckList; - } - - /** - * @param array $aCheck - */ - protected function _removeDeprecatedLibs(&$aCheck) - { - $blDelOldLibs = false; - $sCheckVersion = 0; - - if (is_array($aCheck)) { - $sSelect = "SELECT oxversion as result ". - "FROM d3_cfg_mod ". - "WHERE oxmodid = 'd3modcfg_lib' LIMIT 1"; - $rResult = mysqli_query($this->oCheck->getDb(), $sSelect); - - if (is_object($rResult)) { - $oResult = mysqli_fetch_object($rResult); - if ($oResult->result) { - $sCheckVersion = $oResult->result; - } - } - - foreach ($aCheck as $aModCfgCheck) { - if (isset($aModCfgCheck['aParams']['id']) && - strtolower($aModCfgCheck['aParams']['id']) == 'd3modcfg_lib' && - version_compare($sCheckVersion, '4.0.0.0', '>=') - ) { - $blDelOldLibs = true; - } - } - - reset($aCheck); - - if ($blDelOldLibs) { - $aOldLibs = array('d3install_lib', 'd3log_lib', 'd3clrtmp_lib'); - foreach ($aCheck as $sKey => $aModCfgCheck) { - if (isset($aModCfgCheck['aParams']['id']) && - in_array(strtolower($aModCfgCheck['aParams']['id']), $aOldLibs) - ) { - unset($aCheck[$sKey]); - } - } - } - } - } -} - -/** - * @param $mVar - */ -function dumpvar($mVar) -{ - echo "
    ";
    -    print_r($mVar);
    -    echo "
    "; -} - -$oRequCheck = new requcheck; -if (isset($_REQUEST['fnc']) && $_REQUEST['fnc']) { - $oRequCheck->{$_REQUEST['fnc']}(); -} else { - $oRequCheck->startCheck(); -} + + * @link http://www.oxidmodule.com + */ + +/** + * Alle Anforderungen sind über $this->_aCheck konfigurierbar. Manche Anforderungen haben dazu noch weitergehende + * Informationen. Die Struktur dieser Requirementbeschreibungen: + * + * array( + * 'blExec' => 1, // obligatorisch: 0 = keine Prüfung, 1 = Püfung wird ausgeführt + * 'aParams' => array(...), // optional, Inhalt ist von jeweiliger Prüfung abhängig + * ) + * + * "Desc1": Diese Struktur kann allein eine Bedingung beschreiben. Wenn mehrere dieser Bedingungen + * nötig sind (z.B. bei unterschiedlichen Bibliotheksanforderungen), kann diese Struktur als + * Arrayelemente auch mehrfach genannt werden (kaskadierbar). Grundsätzlich sind alle Requirements + * kaskadierbar, jedoch ergibt dies nicht bei allen Sinn. :) Eine Kaskadierung sieht so aus: + * + * array( + * array( + * 'blExec' => 1, + * ... + * ), + * array( + * 'blExec' => 1, + * ... + * ) + * ) + * + * Unbedingt zu vermeiden sind Änderungen in der Scriptlogik, da diese bei Updates nur schwer zu übernehmen sind. + */ + +class requConfig +{ + public $sModName = 'D³ Content Tabs'; + + public $sModId = 'd3contenttabs'; + + public $sModVersion = '4.0.0.2'; + + /********************** check configuration section ************************/ + + public $aCheck = array( + // kleinste erlaubte PHP-Version + 'hasMinPhpVersion' => array( + 'blExec' => 0, + 'aParams' => array( + 'version' => '5.6.0' + ) + ), + + // größte erlaubte PHP-Version + 'hasMaxPhpVersion' => array( + 'blExec' => 0, + 'aParams' => array( + 'version' => '7.1.200' + ) + ), + + // PHP-Version zwischen 'from' und 'to' + 'hasFromToPhpVersion' => array( + 'blExec' => 1, + 'aParams' => array( + 'from' => '5.6.0', + 'to' => '7.2.900', + ) + ), + + // benötigt Zend Optimizer (PHP 5.2) bzw. Zend Guard Loader (> PHP 5.2) + 'hasZendLoaderOptimizer' => array( + 'blExec' => 0, + ), + + // benötigt IonCubeLoader + 'hasIonCubeLoader' => array( + 'blExec' => 1, + ), + + // benötigt Zend Decoder oder IonCubeLoader + 'hasIonCubeOrZendLoader' => array( + 'blExec' => 0, + ), + + // benötigte PHP-Extension (kaskadierbar (siehe "Desc1")) + 'hasExtension' => array( + array( + 'blExec' => 0, + 'aParams' => array( + 'type' => 'curl', + ), + ), + array( + 'blExec' => 0, + 'aParams' => array( + 'type' => 'soap' + ), + ), + ), + + // benötigte cURL-Version + 'hasMinCurlVersion' => array( + 'blExec' => 0, + 'aParams' => array( + 'version' => '7.26.0', + ), + ), + + // benötigte OpenSSL-Version (Angabe in Versionsformat) + 'hasMinOpenSSLVersion' => array( + 'blExec' => 0, + 'aParams' => array( + 'version' => '1.0.1.5', + ), + ), + + // minimal benötigte Compilationversion (editionsgetrennt), wird (sofern möglich) Remote aktualisiert + 'hasMinShopVersion' => array( + 'blExec' => 1, + 'aParams' => array( + 'PE' => '6.0.0', + 'CE' => '6.0.0', + 'EE' => '6.0.0' + ), + ), + + // maximal verwendbare Compilationversion (editionsgetrennt), wird (sofern möglich) Remote aktualisiert + 'hasMaxShopVersion' => array( + 'blExec' => 0, + 'aParams' => array( + 'PE' => '6.0.0', + 'CE' => '6.0.0', + 'EE' => '6.0.0' + ), + ), + + // verfügbar für diese Shopeditionen, wird (sofern möglich) Remote aktualisiert + 'isShopEdition' => array( + 'blExec' => 1, + 'aParams' => array( + array( + 'PE', + 'EE', + 'CE', + ), + ), + ), + + // benötigt Modul-Connector + 'hasModCfg' => array( + 'blExec' => 1 + ), + + // benötigt mindestens diese Erweiterungen / Version lt. d3_cfg_mod (kaskadierbar (siehe "Desc1")) + 'hasMinModCfgVersion' => array( + array( + 'blExec' => 1, + 'aParams' => array( + 'id' => 'd3modcfg_lib', + 'name' => 'Modul-Connector', + 'version' => '5.1.0.0', + ), + ), + ), + + // verwendbar bis zu diesen Erweiterungen / Version lt. d3_cfg_mod (kaskadierbar (siehe "Desc1")) + 'hasMaxModCfgVersion' => array( + array( + 'blExec' => 0, + 'aParams' => array( + 'id' => 'd3modcfg_lib', + 'name' => 'Modul-Connector', + 'version' => '5.1.0.0', + ), + ), + ), + + // benötigt neuen Lizenzschlüssel + 'requireNewLicence' => array( + array( + 'blExec' => 1, + 'aParams' => array( + 'checkVersion' => true, // soll Versionsnummer des installierten Moduls gegengeprüft werden? + 'remainingDigits' => 2, // zu prüfende Stellen für neue Lizenz + ), + ), + ), + ); +} + +/********* don't change content from here **********************/ + +date_default_timezone_set('Europe/Berlin'); + +/** + * Class requcheck + */ +class requCheck +{ + public $sVersion = '5.0.0'; + + protected $_db = false; + + public $dbHost; + + public $dbUser; + + public $dbPwd; + + public $dbName; + + /** @var requConfig */ + public $oConfig; + + /** @var requLayout */ + public $oLayout; + + protected $_sInFolderFileName = 'd3precheckinfolder.php'; + + public $sVersionTag = '@@version@@'; + + /********************** functional section ************************/ + + public $blGlobalResult = true; + + /** + * + */ + public function __construct() + { + $this->oConfig = new requConfig(); + $this->oLayout = new requLayout($this, $this->oConfig); + $this->oRemote = new requRemote(); + } + + /** + * @param string $sName + * @param array $aArguments + */ + public function __call ($sName, $aArguments) + { + $this->oLayout->{$sName}($aArguments); + } + + public function startCheck() + { + $this->oLayout->getHTMLHeader(); + + $oCheckTransformation = new requTransformation($this); + $this->oConfig->aCheck = $oCheckTransformation->transformCheckList($this->oConfig->aCheck); + + $this->_runThroughChecks($this->oConfig->aCheck); + + $this->oLayout->getHTMLFooter(); + } + + /** + * traversable requirement check + * + * @param $aCheckList + * @param string $sForceCheckType + */ + protected function _runThroughChecks($aCheckList, $sForceCheckType = '') + { + foreach ($aCheckList as $sCheckType => $aConf) { + if (array_key_exists('blExec', $aConf)) { + if ($aConf['blExec']) { + if (strlen($sForceCheckType)) { + $sCheckType = $sForceCheckType; + } + $this->displayCheck($sCheckType, $aConf); + } + } else { + $this->_runThroughChecks($aConf, $sCheckType); + } + } + } + + /** + * @param $sMethodName + * @param null $aArguments + * + * @return array + */ + public function checkInSubDirs($sMethodName, $aArguments = null) + { + $sFolder = '.'; + + $aCheckScripts = $this->_walkThroughDirs($sFolder); + $aReturn = $this->_checkScripts($aCheckScripts, $sMethodName, $aArguments); + + return $aReturn; + } + + /** + * @param $sFolder + * + * @return array + */ + protected function _walkThroughDirs($sFolder) + { + $aIgnoreDirItems = array('.', '..'); + $aCheckScripts = array(); + + try { + /** @var SplFileInfo $oFileInfo */ + $oIterator = new RecursiveDirectoryIterator($sFolder); + + foreach ($oIterator as $oFileInfo) { + if (in_array($oFileInfo->getFileName(), $aIgnoreDirItems)) { + continue; + } + if ($oFileInfo->isDir()) { + $aCheckScripts = array_merge($aCheckScripts, $this->_walkThroughDirs($oFileInfo->getRealPath())); + } elseif ($oFileInfo->isFile()) { + if (strtolower($oFileInfo->getFilename()) == $this->_sInFolderFileName) { + $aCheckScripts[] = str_replace('\\', '/', $oFileInfo->getRealPath()); + } + } + } + } catch (UnexpectedValueException $oEx) { + sprintf($this->oLayout->translate('unableExecuteDirectoryIterator'), $oEx->getMessage()); + $this->addMessage( + sprintf($this->oLayout->translate('unableExecuteDirectoryIterator'), $oEx->getMessage()) + ); + } + + return $aCheckScripts; + } + + public function addMessage($sMessage) + { + $this->aMessages[md5($sMessage)] = $sMessage; + } + + public function getMessages() + { + return $this->aMessages; + } + + /** + * @param $aScriptList + * @param $sMethodName + * @param $aArguments + * + * @return array + */ + protected function _checkScripts($aScriptList, $sMethodName, $aArguments) + { + $aReturn = array(); + + foreach ($aScriptList as $sScriptPath) { + $sUrl = $this->_getFolderCheckUrl( + $sScriptPath, + $sMethodName, + $aArguments + ); + + $sVersionUrl = $this->_getFolderCheckUrl( + $sScriptPath, + 'getVersion', + array() + ); + + $sContent = serialize(null); + $sVersion = serialize(null); + + if ($this->_hasCurl()) { + $sContent = $this->_getContentByCurl($sUrl); + $sVersion = $this->_getContentByCurl($sVersionUrl); + } elseif ($this->_hasAllowUrlFopen()) { + $sContent = file_get_contents($sUrl); + $sVersion = file_get_contents($sVersionUrl); + } + + $sBasePath = $this->getBasePath($sScriptPath); + $aReturn[$sBasePath] = unserialize($sContent); + $aReturn[$this->sVersionTag][$sBasePath] = unserialize($sVersion); + } + + return $aReturn; + } + + /** + * @return bool + */ + protected function _hasCurl() + { + if (extension_loaded('curl') && function_exists('curl_init')) { + return true; + } + + return false; + } + + /** + * @return bool + */ + protected function _hasAllowUrlFopen() + { + if (ini_get('allow_url_fopen')) { + return true; + } + + return false; + } + + /** + * @param $sUrl + * + * @return bool|mixed + */ + protected function _getContentByCurl($sUrl) + { + $iTimeOut = 5; + $ch = curl_init(); + $sCurl_URL = preg_replace('@^((http|https)://)@', '', $sUrl); + + curl_setopt($ch, CURLOPT_URL, $sCurl_URL); + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $iTimeOut); + curl_setopt($ch, CURLOPT_TIMEOUT, $iTimeOut); + curl_setopt($ch, CURLOPT_POST, 0); + $sContent = curl_exec($ch); + curl_close($ch); + + if (false == $sContent || + strstr(strtolower($sContent), strtolower('Request Entity Too Large')) || + strstr(strtolower($sContent), strtolower('not allow request data with POST requests')) + ) { + return false; + } + + return $sContent; + } + + /** + * @param $sScriptPath + * @param $sMethodName + * @param $aArguments + * + * @return string + */ + protected function _getFolderCheckUrl($sScriptPath, $sMethodName, $aArguments) + { + $sBaseDir = str_replace( + array(basename($_SERVER['SCRIPT_FILENAME']), '\\'), + array('', '/'), + realpath($_SERVER['SCRIPT_FILENAME']) + ); + $sUrlAdd = str_replace($sBaseDir, '', $sScriptPath); + $sBaseUrl = 'http://' . $_SERVER['HTTP_HOST'] . str_replace( + basename($_SERVER['SCRIPT_NAME']), + '', + $_SERVER['SCRIPT_NAME'] + ); + + $sUrl = $sBaseUrl . $sUrlAdd . '?fnc=' . $sMethodName . '¶ms=' . urlencode(serialize($aArguments)); + + return $sUrl; + } + + /** + * @param null $sFolder + * + * @return mixed + */ + public function getBasePath($sFolder = null) + { + if (!$sFolder) { + $sFolder = $_SERVER['SCRIPT_FILENAME']; + } + + $sScriptFileName = str_replace('\\', '/', realpath($_SERVER['SCRIPT_FILENAME'])); + $sSearch = substr(str_replace(basename($sScriptFileName), '', $sScriptFileName), 0, -1); + + $sFolder = str_replace('\\', '/', realpath($sFolder)); + + return str_replace(array(basename($sFolder), $sSearch), '', $sFolder); + } + + /** + * @return string + */ + public function getVersion() + { + return $this->sVersion; + } + + /** + * @param $mResult + * + * @return bool + */ + protected function _hasFalseInResult($mResult) + { + if (is_array($mResult)) { + foreach ($mResult as $blResult) { + if (false === $blResult) { + $this->blGlobalResult = false; + + return true; + } + } + + return false; + } + + if (false === $mResult) { + $this->blGlobalResult = false; + + return true; + } + + return false; + } + + /** + * @param $mResult + * + * @return bool + */ + protected function _hasNullInResult($mResult) + { + if (is_array($mResult)) { + foreach ($mResult as $blResult) { + if ($blResult === null) { + $this->blGlobalResult = false; + + return true; + } + } + + return false; + } + + if ($mResult === null) { + $this->blGlobalResult = false; + return true; + } + + return false; + } + + /** + * @param $mResult + * + * @return bool + */ + protected function _hasNoticeInResult($mResult) + { + if (is_array($mResult)) { + foreach ($mResult as $blResult) { + if ($blResult === 'notice') { + return true; + } + } + + return false; + } + + if ($mResult === 'notice') { + return true; + } + + return false; + } + + /********************** conversion function section ************************/ + + /** + * @param $mParam + */ + public function aTos(&$mParam) + { + if (is_array($mParam)) { + $mParam = implode($this->oLayout->translate('or'), $mParam); + } + } + + /** + * @return string + */ + public function getLang() + { + if (isset($_REQUEST['lang'])) { + return strtolower($_REQUEST['lang']); + } + + return 'de'; + } + + /** + * @return bool|resource + */ + public function getDb() + { + if (!$this->_db) { + if (file_exists('config.inc.php')) { + require_once('config.inc.php'); + ini_set('error_reporting', E_ALL^E_NOTICE); + $this->_db = mysqli_connect($this->dbHost, $this->dbUser, $this->dbPwd, $this->dbName); + } + } + + return $this->_db; + } + + /** + * @param $version + * @param int $iUnsetPart + * + * @return string + */ + public function versionToInt($version, $iUnsetPart = 0) + { + $match = explode('.', $version); + + return sprintf( + '%d%03d%03d%03d', + $this->_getVersionDigit($match[0], $iUnsetPart), + $this->_getVersionDigit($match[1], $iUnsetPart), + $this->_getVersionDigit($match[2], $iUnsetPart), + $this->_getVersionDigit($match[3], $iUnsetPart) + ); + } + + /** + * @param $sMatch + * @param $iUnsetPart + * + * @return int + */ + protected function _getVersionDigit($sMatch, $iUnsetPart) + { + return intval($sMatch !== null ? $sMatch : $iUnsetPart); + } + + /********************** layout function section ************************/ + + public function deleteme() + { + $sFolder = '.'; + + $this->_checkDelFilesInDir($sFolder); + $this->_delFile($_SERVER['SCRIPT_FILENAME']); + + if (is_file($_SERVER['SCRIPT_FILENAME'])) { + exit($this->oLayout->translate('unableDeleteFile')); + } else { + exit($this->oLayout->translate('goodBye')); + } + } + + /** + * @param $sFolder + */ + protected function _checkDelFilesInDir($sFolder) + { + $aIgnoreDirItems = array('.', '..'); + + /** @var SplFileInfo $oFileInfo */ + foreach (new RecursiveDirectoryIterator($sFolder) as $oFileInfo) { + if (!in_array($oFileInfo->getFileName(), $aIgnoreDirItems) && $oFileInfo->isDir()) { + $this->_checkDelFilesInDir($oFileInfo->getRealPath()); + } elseif ($oFileInfo->isFile()) { + if (strtolower($oFileInfo->getFilename()) == $this->_sInFolderFileName) { + $this->_delFile(str_replace('\\', '/', $oFileInfo->getRealPath())); + } + } + } + } + + /** + * @param $sPath + */ + protected function _delFile($sPath) + { + unlink($sPath); + } + + /** + * @param $sCheckType + * @param $aConfiguration + */ + public function displayCheck($sCheckType, &$aConfiguration) + { + $sGenCheckType = preg_replace("@(\_[0-9]$)@", "", $sCheckType); + $oTests = new requTests($this, $this->oConfig, $this->getDb(), $this->oRemote); + if (method_exists($oTests, $sGenCheckType)) { + $this->_checkResult($oTests, $sGenCheckType, $sCheckType, $aConfiguration); + } else { + $this->oLayout->getUncheckableItem($sCheckType, $aConfiguration); + $this->blGlobalResult = false; + } + } + + /** + * @param $oTests + * @param $sGenCheckType + * @param $sCheckType + * @param $aConfiguration + */ + protected function _checkResult($oTests, $sGenCheckType, $sCheckType, $aConfiguration) + { + $mResult = $oTests->{$sGenCheckType}($aConfiguration); + $sElementId = (md5($sGenCheckType . serialize($aConfiguration))); + + if ($this->_hasNoticeInResult($mResult)) { + $this->oLayout->getUnknownItem($mResult, $sElementId, $sCheckType, $aConfiguration); + } elseif ($this->_hasNullInResult($mResult)) { + $this->oLayout->getUnknownItem($mResult, $sElementId, $sCheckType, $aConfiguration); + } elseif ($this->_hasFalseInResult($mResult)) { + $this->oLayout->getNoSuccessItem($mResult, $sElementId, $sCheckType, $aConfiguration); + } else { + $this->oLayout->getSuccessItem($mResult, $sElementId, $sCheckType, $aConfiguration); + } + } + + public function showinfo() + { + phpinfo(); + } +} + +/** + * Class requLayout + */ +class requLayout +{ + public $oBase; + public $oConfig; + + /** + * @param requCheck $oBase + * @param requConfig $oConfig + */ + public function __construct(requCheck $oBase, requConfig $oConfig) + { + $this->oBase = $oBase; + $this->oConfig = $oConfig; + } + + public function getHTMLHeader() + { + $sScriptName = $_SERVER['SCRIPT_NAME']; + $sTranslRequCheck = $this->translate('RequCheck'); + $sModName = $this->oConfig->sModName; + $sModVersion = $this->oConfig->sModVersion; + + echo <<< EOT + + + + + $sTranslRequCheck "$sModName" $sModVersion + + + + + + + +EOT; + echo "

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

    '; + echo '

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

    ' . PHP_EOL; + + return; + } + + public function getHTMLFooter() + { + $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') . '' . + $this->translate('deleteFile1') . $sScriptName . $this->translate('deleteFile2') . '

    '; + } else { + echo '

    ' . $this->translate('globalNotSuccess') . '' . + $this->translate('deleteFile1') . $sScriptName . $this->translate('deleteFile2') . '

    '; + } + + echo <<< EOT + $sTranslDependent
    +

    + + + $sTranslShopPhpInfo + + +

    + + + +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 + * @param $sCheckType + * @param $aConfiguration + */ + public function getNoSuccessItem($aResult, $sElementId, $sCheckType, $aConfiguration) + { + $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; + + $this->getSubDirItems($aResult, $sElementId); + } + + /** + * @param $aResult + * @param $sElementId + * @param $sCheckType + * @param $aConfiguration + */ + public function getSuccessItem($aResult, $sElementId, $sCheckType, $aConfiguration) + { + $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; + + $this->getSubDirItems($aResult, $sElementId); + } + + /** + * @param $aResult + * @param $sElementId + * @param $sCheckType + * @param $aConfiguration + */ + public function getUnknownItem($aResult, $sElementId, $sCheckType, $aConfiguration) + { + $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; + + $this->getSubDirItems($aResult, $sElementId); + } + + /** + * @param $sCheckType + * @param $aConfiguration + */ + public function getUncheckableItem($sCheckType, $aConfiguration) + { + echo '
    ' . + $this->translate($sCheckType, $aConfiguration) . ' (' . $this->translate('RequNotCheckable') . ')' . + $this->_addDescBox($sCheckType.'_DESC', $aConfiguration) . + '
    ' . PHP_EOL; + } + + /** + * @param $aResult + * @param $sElementId + */ + public function getSubDirItems($aResult, $sElementId) + { + if (is_array($aResult) && count($aResult)) { + echo '' . PHP_EOL; + } + } + + /** + * @param $aResult + * @param $sElementId + * + * @return string + */ + protected function _addToggleScript($aResult, $sElementId) + { + if (is_array($aResult) && count($aResult)) { + $sScript = "
    +
    "; + } else { + $sScript = ""; + } + + return $sScript; + } + + /** + * @param $sTextIdent + * @param $aConfiguration + * + * @return string + */ + protected function _addDescBox($sTextIdent, $aConfiguration) + { + $sContent = "
    ?". + "
    ". + "
    ".$this->translate($sTextIdent, $aConfiguration)."
    ". + "
    "; + + return $sContent; + } + + /** + * @param $sIdent + * @param array $aConfiguration + * + * @return mixed|string + */ + public function translate($sIdent, $aConfiguration = array()) + { + $sGenIdent = preg_replace("@(\_[0-9]$)@", "", $sIdent); + $oTranslations = new requTranslations(); + $aTransl = $oTranslations->getTranslations(); + + if (isset($aConfiguration['aParams']) && is_array($aConfiguration['aParams'])) { + array_walk($aConfiguration['aParams'], array($this->oBase, 'aTos'), $sIdent); + } + + if (isset($aTransl[$this->oBase->getLang()][$sGenIdent]) + && ($sTranslation = $aTransl[$this->oBase->getLang()][$sGenIdent]) + ) { + if (isset($aConfiguration['aParams'])) { + return vsprintf($sTranslation, $aConfiguration['aParams']); + } else { + return $sTranslation; + } + } else { + return $sGenIdent; + } + } + + public function getPngButton() + { + $sImg = "iVBORw0KGgoAAAANSUhEUgAABDgAAAAWCAYAAAAl+SzaAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAB". + "MpJREFUeNrs3Y1O4zgUhuFY4hbb2ZthRjtczOz0Ght7cZwfQ5u2E4K0a55XiNDUXyWcT+ZwfGyHw+HQvZI6AACAT+J0OgW9AAAAtn". + "A8Hh/JWYSnbkxuvAYeeg0AAAAAAPynuJevOB6P+ZKe6sYvLy96DgAA7M7z87NOAAAAm7iVq8gxRs5p5CTH03Tz758/uzAUc7x+Hy4". + "pf71ex9fDj2leyxLG1vnNELpmdJPqo21a7afy+/MIj/AIj7zVhS/seWPD4zoAAIAtxJhW44+cy/jx/ftw/2kRxDEQSd0Uraah/RKV". + "lLfK+/kDS0T7eieGZnTdA33QfeF+CpFHeIRHeORSF1Lw3I0Nd3UAAACbEhwprscfadnma05wpL7v8v0Sh4QiLimREqWEt7mSmK9xn". + "LlrSBe6fdq02k9D1oxHeIRHeORCFz13Y8NtHQAAwNYER+zX44+q3Zzg6GOcbw6haqhmXG5MvuQPiw3q9mrTaj/xCI/wCI9c13juxo". + "Y/0wEAANxNcPTxbvzxLsHRd7mEo8y+pJIFCWEupy2XMTcSxjKQUMqSl1mb/79urzbN9hOP8AiP8MgV3Zf2vLHhIR0AAMBWcr5iNf6". + "o4owlwdGPCY68hiUsZbRh2DGsWkz7/mUaVl83oxu3R/xwm1b7KfEIj/AIj1zRDfc9d2PDTR0AAMA2hgqOtfijWqOybDKaExzj6pVp". + "zWyYG04zdGn5vByohVC924ou7NSm3X7iER7hER55r/P3w9jw6NgAAADwp+SCjPX442oFR5URWeaY5pKPsmNpmI+SnctN5zKRVnR7t". + "Wm1nwKP8AiP8MiKznM3NqzrAAAANic4zuf1+ONaBce576dQZAhMplPepvWzYdn6vSoBCUNJSCkPaUS3V5tm+4lHeIRHeORS97U9b2". + "x4RAcAALA5wZEPRVmJP1K4ckxsPJ/H9SzjOvpuEc11INP805gtWQ6Ka0gXdmrTaD8NGTMe4REe4ZFrOs/d2HBLBwAAsJHzuV+PP6q". + "JlKqCI3ZdvaZliVGm3MiYKZm3EJuvXera0aW0T5tG+2kKYHmER3iER2pdU8/Pc/+0sQEAAGALec/Q9fjjSgVH358v/zFZJNXy6ukY". + "uFQqREZBK7q0U5tm+4lHeIRHeOSqLnnuxoa7YwMAAMAWzvF8M/64THDEOB+xEsYIJlV7d5R1tdNGHsMnlvW2I63opirrj7Zptp86H". + "uERHuGRS92X9ryx4cGxAQAAYBv5mNi1+OP6HhzDMbEVad5JrKoxrdbfzlFa155urzYt9lPgER7hER658bt47saGVR0AAMA28ikqj8". + "QfVQVH3705ceU1KEm5qmM+0y7N8crwOqY5a5Ja0sWd2jTaTykmHuERHuGRS52/H8aGuzoAAIBtxCGIWok/riU4Yl8EZVOwEpSUG9X". + "62XmRS1w+oV5z24RurzaN9tO0QR6P8AiP8MgbnedubLitAwAA2EqfExo34o+LBMevX7+6b9/+KkFItYZlmI0tP1XBS3UE3LhNeju6". + "vdq02k8dj/AIj/DIhW48W8NzNzbcHBsAAAC2MGypsRJ//P7n9/J/yOFwGO6fTie9BgAAPgvrVAAAwFZuzpgcj8fh+jQGHGm6AQAAs". + "DcmUgAAwFYezFeEfwUYAAoCUXB0RZrTAAAAAElFTkSuQmCC"; + header("Content-type: image/png"); + echo base64_decode($sImg); + exit; + } + + public function getPngLogo() + { + $sImg = "iVBORw0KGgoAAAANSUhEUgAAADMAAAA0CAYAAAAnpACSAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAE". + "IxJREFUeNq8Wgl4VNXZfu+dLZkkk5BA9kACYQlB2aIga6myuIEtFX+kLW1BJVT/akVrRds+rVqRX2lLRSsal5/nUaCgtmhi8BeaUh". + "Al7EYTIWyGQPZlMsnM3Lnn/865dzJ3biaLVnsfDpk59yzf++3fOSMxxvANPlZqUdQs1FRqXmq+Ac7NpbaI2jxqQ6nZqDVR+z9qr1H". + "71DxB+nfBPHYYSHUCK8fATl+HUZtK7Wpqo1SGeZ0BQCEYFolQETSrhDJ6d4rax9Q+pFa18SQ8HX6aHAcszUUS9T3U0IU1710ASqid". + "dwNuBciMARbSDjcQtDQnnnj7HNYuGvY1gqHnW9RWBBi+f7kT+LwVKG8AjlDj38+0AR1EiJ1kk0XEZFAbO4gQJwOj44F0+m6TsYvWK". + "KKWQOQUvVwFPHCAxNBlZDs1psk30wXsv4XWi8VvqefXXwcYWg6FRPy8racBzsXjjQxtXim4sra5bKCG6X3QCLOR4lxBwGakS1g+Ch". + "hORN5FcttWpSumpCunZADEH5L2iATa71bAaUUW9XzxVcEs4yCq2zD9qaMML1QQXQGdaMmwYW8PM41RQxwvmgu0+yU8Qap7uUMbN59". + "UykUKXF4P0J5hgD4gi5qTjuW6DQkDHehDfMNvLnbgvp/vV7GdpKEGdA5aTMRiAIAQDj6HJHR7rgyHBc+T/a16jaQzNFbYB0FDXa0H". + "C0a+QSrrD82J1qj3G73NQJ6buTT+eppdf+cehuauCCCCLDeDkcwAWM8xjA+T8JcKxp3FKu4oFGLUOZJEpyJNIqKfpP4F/kBI9bLIW". + "UxIErPLvozNFLb5sOmRgwwbj6kaMbIUrjJMJzIIRooAUOpNzwzdAcMX+hfvlFC6UEaCQ8K0N4FGrzbVQuM+InuZNBjruOcLzpL7Ab". + "LSr2LT0lIVG8tpBZnpxDOtwfgX4X2snz5z4y8swaYRfWM2+fhkaS/3gotyqE/RVGnrAgHkz6daQ0D6A8Mlsvm24gDerSYgNhaZiP4". + "avvq4giFCgkdJzZa+MAv442zCQxby9hmgK4C7c+MxZCBgZtJam24tVvBmlS4RhoERaH6nRhpvkg4FKfipKXrj32nPjy+p+NsZ9d4W". + "L16noPvTu/OBuSSt/z1BaUCNoPN2c7phfhJoqbLfk1qVconwEUw3DEm3L1Xq3W0x9Ix0TDLnHTpwzZ5W5MsYP1gCqTSsxN5jFK+KT". + "gbweiW1ChXzhksoXmh7lkx11Vvz8fxsCsaXOsVKI/sD84t3z6pYu5fkaZdCXJUkLSbQd56aWCQz5ZLJ57Juwn3csFV9jaDDCeoEfX". + "+owIbceGmT3qseqmOri44oWjam8vmWoMt4iYJk/Pb5WPdpi/h+vC8wszwKHrpzt08zRE4Ql4LEwqL39httGJckD8in8yleUhs7sfV". + "sG8MFN0PJ2QB2nAp0A/RrXmzrU+VK2YOTrWlXJEmr7y2w4C0ac90wGQ8UWPmwe1+pCCg/GmvZnO7EOovmPZ19gSn8w2E/LraomlRU". + "g6fSmc0lMi1NRopTmjCAeB+UFN80YfQgiUeGoSvzLXMrm9nsxw76sOWYQvmbirxEy3i3j5Vtr1Jqbx1lXbBhtq3wd9Nsi2JteIfmP". + "Per/b53HCKuWZafa2dYuduLD74XtYHo2UKdDeY4c2t1K9s2qsgj7E8I3Kw11AZFEYdXRlOKIZEp4tzsHT4Rdny6vrtINdq8DA76nE". + "BjaygtSaIi4Hu5FhSfU9FFBs6Xeusm+xKyka1PH/LjUJ2KN25w8PlLlhd3bR8WL2Goy4qV4yxxtxd72/laL893pNK0R4/Vq6t/VOL". + "F0Ysqdi6OwndyLb+i/t+ZwXxw127vnBdIMkJXI5kAETwxRcZHy5x8Y/L+8NyyywdKNZBNEfm2kTJON6nYVulHTryMKekyTjWrpGYS". + "8pOtKK9jcJPX4uBHJkhYP8M2nta4Z8Nh/4r9NQG8OM+BeIf0Z+qjZAluPceglBJ5LV62nIeIHxZ3IaDncwUZRMtSJ1dBXn74g2AyP". + "H72Re5LHtS2q707bNLtFRNstGnUe/RtAe96eJ8PWS4Z01IlJJIEslwWzsEMPWequ39P16Wq5gAmJVuQ6LTgIAFqpkienyhhIsWRZW". + "Oskzv87FD28x1IiqHsOd+GkYNkwYxOkmJFYwDnyda2fKrgXLMalkJxs65cGUMZtHw9fS0J2sxtB2oDqG0OaFLpLcOhtaani9WOBrs". + "mEEH5SZoRE5ApRNiHfHOeBA6mdOTpOVH/omGbHz/Q9Wqak+HaDF5sSeRAJMTSmLdPKeWLcq3/s+E6x5of7PTg4fqApgnBPCyo7rJJ". + "9fkQkvLm4z48OSuqkIORdYBPFx33adT2E6XzNS92LLhgLXmnd6sV7D6naA6k3IsrX2xHXlE7xtDfJX/zTP/7aeWVtddEbeK2aJd5c". + "cZQ5w5QUAzgRL1wZe9clWKBhTNS1uOZVU9tJC2ARgzUtNZrn/hBWrWQawOnLLexk2FnpU+P9KrWVL0xHSB9jqINsuPlcP9O72Ta6I". + "GrHXz28rLzCmW8ZOjkEWrIS23/xIuFW9txsFYpXJpnX9alcAdBCkBuKI8YMzpRrFeV5ZIwhNRMeB/VkD2YswlVDX0moLXNCg5fFgy". + "5lq805RSpV1eXakozQh5MW4QhJ0HmBsonng9iibNrHo6e5E4S+4l6xRDhma4aDH85Is4xttwx3i4pKhMSaupUcdktInGHhazYaWEh". + "5jHdylUWYm7QWQXfiX6GDy8KrZjFt5q274ISmsQMC+iDxV/i2NQ0UTy9T3Pag2AoNqDdKzbJqyHCLrUEQioRlC6BO3rJL9IVeuzbK". + "rzYd8GHzFgJmXGCEVHcEfkUfT+oBimo4RIS/dDX1hi274Koz/K5Axj+aYMSLo1IyRZNLEgT/uKk8e2JOiVY3ow7SfrPWITii/ClkA". + "pZtXHKt4dZyVMBu075hI3fMsqeQK6X1C8oDUOKFFbMRfBMNKShQ0xwceoyq5uVUKTv45mcIsB8ZOzjbjR4znW+lajmQUAyJQYEMI3". + "AUHfxmvfdAU5ffLQMa7SkxQyiodFDYDyqyWP1TxN/39wpbIY7R8R+wYmQ+phIxEhESZJTEHnW+CrZKWvSJuY3dhhUwpjpUN+0DMGI". + "E7F2SbzxikyABaU66bNGJZwRPQrSCBWqTm9rl+CIg+9gc3sD4VxgekWJUJYbbZMQL7JoLQ8KPpfd3bXu0MpGv67v4SUCp2/BCB6ks". + "WtyqlW84XbmJ5A6eXNLT3t1G5HCj6UkYwkSQdXoq0870pA5GCWaK7MaiFCHsO4Jg0klXJonazKudY4MftONLhflXNccqfUb0iCdEi". + "L427kOpMeJYHuwneyCM2bEIC2UT820pdPcubsqO00luYEh3bWP2rPaoC82jSMqB+PmXuVMAzOkMSaVI0/GOWrXLLjZCGZ6lk2YTks". + "Xw1kuGWbkHmcbw9oZMVydVq/bx30f6bWdZwxM0EhgZleQO7/YpIiz25DxM5PNs8jaRovEOwThPv5/3XDOpUAf0Z+4Oz5VFEgvw7Cd". + "iHYNQsbjqgiI32+I1Dz4UeBcPT0Gs7MdfMyr1w53YA595mVEdVNASJWeG3dUdA7gnEANxa4wV60iMVqg6+CSqbwy2TpLGxDpiEjrv". + "zpD6Pwhs29QNOv/1t5q0nmeoAU0I3GRY1g3LwF3XhXLpbL4klv1pMVS8kiAp2TYxHYFGfZC8oDLNvyjLfycofusTYrgBGAoxTU3nq". + "w5plYO5vDkdLsehCTzyZwYzA147BBbjxgjDpzH8BsLfD5miBX/PTMOIxKtGE2fx6fakRpneYberW/wqJeaPAGUVXfiDIWBRfkxmDb". + "UMZyEt+mON5vQyYshrviqGgIhzEENnTWHqZehwCKveGWKoO0MB1PGCXGS3/fwRU14eEuLt5BbFnrZ404kWTPs55aMc4LaOPrcoo8r". + "XfxGY+WDM1y42OrDsYteECjUk/smIHzfNa8dcaP0kw5DVduLvZj/Gg2aNGdOjlDjUr7oZ8mxFszKtqOkwoNgmDZG7/GpNsRoLqPRD". + "GZLeTsWXxnbvPGA+4nPyYhvGBklJMklQCUvPr7QiaM1XRgcQw6EjGXr7ckjaNr9JVWdhT/ZWq/t91VvImhabJSM8WnCBMqs+sHR2n". + "uuiXu85AQVdxZTZUa6MGuYgxP4qtn4+fPI2/XYdqwdflKNFkocm1u9WDIhFh2Ur2TGyGij6Gwho+FG/8xNSYXkhje9Wu7Gqh31+jF". + "vX1Ge9X3MQPZ3x4w4Ks/lYl6dBouz12dmRz3u4pt7TekIcW1iukB+JOKC5BaPX/B2B7RaovGmPCc2Lx7CjYnfnUzmHpxaweEa79Sf". + "72rEP6o6Q0cprD+6+5Aa0baiIE4cQRlPZ87EOeR/fndczMxXPmwVV1lBjsmkBukihcN8vYWv91RupN1jKY7MaqE0o5pc9p7TnaRuX". + "uw82aHZRlCVVaPn6hFA+pYKacyEoVEYM0QwusR81PTcfTPjZ76yv8WwicaV1TvqqG6hOtvSvxZwT+4iPa5u8uOzOj/aOgIhB8TVSt". + "bT9+50KZzT3QeO/YmMnFXhVBe3ij/xGGM+neGlkbK2uBG/L2nQ6lvzxVAk8RuPXoMMUAz1u3lymJs1EGrsY4aBkhR+tyOCG9VWOdH". + "YuzqLskspjzsx88F5gKZd//C1gxDH3XBADVV0YOFltKqGru/CxhjuMSVT9A5O6C7F1fCC0Fh4ITzCh0V+vRX9VyoH8mAQSKRbgJJY". + "u/yHjd9NoRw9SDALJ5gZozALVw9jqmGu9LqBm3I/4x1ON1NgcJyGdflDdK2aOQh5yfb3j9d61/d3pfHsD69y4Z7rEvkhsYGDhvMAY". + "3ltrtG736H3iyUjk4xSCkoNxvMIA1hfAFdkReGZRcnCxr1KeKSIBOYUqdt31t+cjGtyozUJhXE/Aje7uWzipvlkxaiW5kOTsLXR82". + "SGCOfZxnuFWbyEeKS6wbeTHyoO5LLpLdLHNcWFw5Cf6dAlFEG/zX2RiOhxCYWBXVIhHAgv6fb8LBtpLutTlXW+x/nhiBLAgMDw5+n". + "4KPnRsp/lYPrIGHHvFvn2DF/t2m+gjVxwOuWGx9fmYmyK49mqOt8veiO4v0uWx0iU979LElo+fZAmIfVrJraPGorvN2loNPbdNxx5". + "KY4n/3nac3dfxA7kxugZCoJLX1qWgUdvTtESTkWNcIJi0vkw2zGU0oz19GbmrEXRwPxgWiL23puDnCT7w6WfuX/Z7y3Ql/i5Cc+vC". + "mta/Mt+vOUCdp9s1wKaBaHAJvXyK4w+k0jDxIBWoU7KceLF72diYmb0Xu61XtjftC070U6GLyMlzhqGe3Sy/d/6VdMqX4A9V/xJO/". + "60pwF7PneD+fXfYMkSvvTDdBA0dSKp1E9IGsunJCIuSv7liwean+QXWLQfvikw4oiZ2l2kCetP13vx+qEWvHygUTvQ0AnrBiYhdDF". + "rVCk9/0uItWJpQYIAcUV6NI/qfxTS+FdTJT+rs1m+eTDBx6ar353tXnXpR2c94O3QeQ9qWv3ooBjVTIkmJ8ZG4FxUzbqiLUgmABMy". + "ojBleAymZDsxJNZayu9wqO3+bfHl1iQq5PgtwX8ajPFJ039IN4faWP36Llb/WaOs5yc+PcNt1a/6+I94PuBnCF8HAf8vwADS7GaT0". + "D4fMwAAAABJRU5ErkJggg=="; + header("Content-type: image/png"); + echo base64_decode($sImg); + exit; + } + + public function getGifBg() + { + $sImg = "R0lGODlhCgAyANUAANHo+pfK85rM8/X6/vb6/v///5jL85bJ8+Hv/KbS9dzt+87m+qTR9fH4/er1/b7e+MTh+P3+/63V9u/3/". + "dfq+rnc97fa96DP9Nns+53N9LLY9tTp+sHg+Mzl+cfi+OPx/Pv9/7DX9p/O9Oz2/bTZ9uXy/KLQ9Pj7/ujz/bzd9/7+//r8//P5/s". + "nj+ZvM897u+6nT9avU9qvU9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAAKADIAAAb". + "FwINwSAwYj0iDcskUOJ9Ql3RKzVivWJF2y714v2CTeExmmM/ohHrNhrnf8Jh8PpdJ7vh8aM/va/6AgSSDhIUWh4iJFYuMjSmPkJEP". + "k5SVHJeYmRCbnJ0en6ChLaOkpR2nqKkLq6ytAK+wsRuztLUUt7i5GLu8vQq/wMEvw8TFCMfIyR/LzM0lz9DRKNPU1Q7X2Nkj29zdE". + "9/g4Q3j5OUs5+jpA+vs7QTv8PEn8/T1K/f4+SD7/P0R/wADqhhIsGCBgwgTBgEAOw=="; + header("Content-type: image/Gif"); + echo base64_decode($sImg); + exit; + } + + public function getGifDe() + { + $sImg = "R0lGODlhEgANAIQZAAAAABAFBhEGBhIGBhQHBxUHCCYNDZQqH5QrI9c4M+M4M9w9M+g/MuNDM/BFM99tI+t3H+CyDerIB+zIB". + "uzKBurLCPfcAPfgAPjlAP///////////////////////////ywAAAAAEgANAAAFVaARCGRpmoExAGzrvsBAwHRLFHVdIEfv/8ADou". + "EoGo9IR2PBaDqfUMYioahar1hF4gHper9gyKOCKZvPaExFcmm73/CLZGKp2+94yyRCmfj/gIAUESEAOw=="; + header("Content-type: image/Gif"); + echo base64_decode($sImg); + exit; + } + + public function getGifEn() + { + $sImg = "R0lGODlhEgANAOfRANzd6P9LQP7//93e6ba32v8HB/J4ef//+/85Of8fFVddwP8aFq+13P8aFPr////f3f8XE/n//62s3fQuL". + "AIDj6ys3uHZ5P8uLOjp793f6dbX6uvBxsyasurCx/9fXcadtS88r+Da5EZHr+Hi7A0NlUVGqcjR9MKaunh5x/8REQAAkv9IP/9BPn". + "h6wi4/td3c5uLl7P8PD7vO9aGSw7bM9uDh6UpLsf8hFv/f3PPx9/Dx9DFCuMDE4cHF4/sAANPU3ufp8JSDvuVocf8ODvz8+/xRTPQ". + "gG+PM0ZSWzs/R476+4ujp8v8/PurO0uPZ3//u5fQCAOPj6nFxxf8UE8rM4P/w5YGM18PH4/79/ExUuP3//4CAxqmo3KaZxv7+/Rcs". + "tO3v89XW6fS8waOj2snM7Nra7Ccon+no9v03OFJZvuK2xBEipP89Ov8dE+be4u3u8/w3OOVocv8sKv8EBOjo9+/u+Kap15SFvgwRl". + "ba327uXteHh7tvc5yo3q9XX5SQ4uU5MrtjW5qaVxvDS2f8DA+Tj6vr6/j1FtVlgvL+euvHw9v+rqe7u+XKJ1ebn7p2x7CUmnvb2+d". + "PW8P8cEc/P4efn8/38/5Ws66mYx/ccGNfY5vh0d927zSUlov96ev88OgAAjmmA09rb5v+xsPF5eMnR8i0upuuAgvEyLx0rq97f6cu". + "nwEBIuO/Aw/9/fuTm6vn5+vTEyM7P5rq63BESlf+Fgv8fF8SWsOfp7+2rrvX1+La23RgmqLe43PPV2vdydhcnqIWQ2BEgoube4wAS". + "n82atOHj6uTT2f97etKjuf9dWsSduZyb08fJ4fn5+/z8/f+ZAP///////////////////////////////////////////////////". + "/////////////////////////////////////////////////////////////////////////////////////////////////////". + "///////////////////////////////////ywAAAAAEgANAAAI/gB/YHCkig+AAVGGuSmUAYCoEbpgGXsFY8kWM7T6JEI14QMIEpB". + "aVNIBRBOSOtEqmAK27EabYqk6jYl2hpksKnjSmIgmqdEqWw2ShSITrZQCFXb8IDpkRdGBCLGmpBDj4ECOYKyyXHFyyoCQX8hceShQ". + "QFktT5viGCDV5AgUaHDjypXrI9exIgHYwEHA5MIcQnJYIEDzKcCKVi+63BE0CMeTUTGGLKrywBemIDMCJVnz5ZIWATI4LYCghoaAa". + "I/+EGNAqQQXQ4xQuDiRYBKHHVLoWJIAaFaNZkSU2KAgTI+RTLd4gRKxC0uZPQPAvAnTiwCPEB02WOiRh4CGZ15wAgUEADs="; + header("Content-type: image/Gif"); + echo base64_decode($sImg); + exit; + } +} + +/** + * Class requTranslations + */ +class requTranslations +{ + /** + * @return array + */ + public function getTranslations() + { + return array( + 'de' => array( + 'RequCheck' => 'Mindestanforderungsprüfung', + 'ExecNotice' => 'Führen Sie diese Prüfung immer aus dem Stammverzeichnis '. + '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 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 '. + 'als %1$s.
    '. + '
    Die passende PHP-Version '. + '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 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". '. + '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.
    '. + '
    Die passende PHP-Version '. + '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 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". '. + '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 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". '. + '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 '. + 'auf Ihrem Server vorhanden.
    '. + '
    Das Modul kann ohne die '. + '%1$s-Erweiterung nicht ausgeführt werden. Fragen Sie bei Ihrem Serverprovider nach der '. + 'Installation dieser Erweiterung.
    '. + '
    Ü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.
    ', + '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 '. + 'passender Version installiert.
    '. + '
    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 kontaktieren Sie uns bitte über '. + 'support@shopmodule.com.
    ', + 'hasMaxShopVersion' => 'maximal Shop Version %1$s', + 'hasMaxShopVersion_DESC' => '
    Das Modul ist bis zur Shopversion %1$s freigegeben.
    '. + '
    Die Shopsoftware ist in '. + 'passender Version installiert.
    '. + '
    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 kontaktieren Sie uns bitte über '. + 'support@shopmodule.com.
    ', + 'hasMinModCfgVersion' => '%2$s (ModCfg-Eintrag "%1$s") mindestens in Version %3$s', + 'hasMinModCfgVersion_DESC' => '
    Das Modul benötigt die Zusatzsoftware "%2$s" mindestens in '. + 'Version %3$s
    '. + '
    Die Software ist in '. + 'passender Version installiert.
    '. + '
    Die Zusatzsoftware ist '. + 'möglicherweise gar nicht oder in falscher Version installiert. Bitte installieren Sie die '. + 'Zusatzsoftware, bevor Sie diese Installation fortsetzen.
    '. + '
    Bei Fragen kontaktieren Sie uns bitte über '. + 'support@shopmodule.com.
    ', + 'hasMaxModCfgVersion' => '%2$s (ModCfg-Eintrag "%1$s") maximal in Version %3$s', + 'hasMaxModCfgVersion_DESC' => '
    Das Modul benötigt die Zusatzsoftware "%2$s" höchstens '. + 'in Version %3$s
    '. + '
    Die Software ist in '. + 'passender Version installiert.
    '. + '
    Die Zusatzsoftware ist '. + 'möglicherweise gar nicht oder in falscher Version installiert. Bitte installieren Sie die '. + 'Zusatzsoftware, bevor Sie diese Installation fortsetzen.
    '. + '
    Bei Fragen kontaktieren Sie uns bitte über '. + 'support@shopmodule.com.
    ', + 'requireNewLicence' => 'bisheriger Lizenzschlüssel kann verwendet werden', + 'requireNewLicence_DESC' => '
    Diese Prüfung versucht zu ermitteln, ob Sie für den '. + 'Einsatz dieses Moduls einen aktuellen Lizenzschlüssel benötigen:
    '. + '
    Sie haben für dieses '. + 'Modul einen Lizenzschlüssel hinterlegt, der wahrscheinlich auch für die neue '. + 'Modulversion geeignet ist.
    '. + '
    Sie benötigen '. + 'für dieses Modul wahrscheinlich einen neuen Lizenzschlüssel. Haben Sie diesen schon '. + 'vorliegen, führen Sie die Installation aus und tragen den Lizenzschlüssel dann im '. + 'Adminbereich Ihres Shops ein. Ansonsten können Sie den Lizenzschlüssel in unserem Shop '. + 'www.oxidmodule.com erwerben oder '. + 'sich ebenfalls im Adminbereich Ihres Shops einen kostenfreien Test-Lizenzschlüssel '. + 'erstellen.
    '. + '
    Für Details wenden Sie sich bitte an '. + 'buchhaltung@shopmodule.com.
    ', + 'hasModCfg' => 'Modul-'. + 'Connector installiert', + 'hasModCfg_DESC' => '
    Das Modul erfordert zwingend den D3 Modul-Connector.
    '. + '
    Der Modul-Connector ist '. + 'installiert.
    '. + '
    Das Modul kann ohne den Modul-'. + '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 kontaktieren Sie uns bitte über '. + 'support@shopmodule.com.
    ', + 'isShopEdition' => 'ist Shopedition %1$s', + 'isShopEdition_DESC' => '
    Das Modul erfordert eine dieser Shopeditionen: %1$s
    '. + '
    Der Shop ist in der '. + 'passenden Edition installiert.
    '. + '
    Das Modul kann in Ihrer '. + 'Shopedition nicht ausgeführt werden. Bitte fragen Sie nach einer Modulversion für Ihre '. + 'Shopedition.
    '. + '
    Bei Fragen kontaktieren Sie uns bitte über '. + 'support@shopmodule.com.
    ', + 'hasZendLoaderOptimizer' => 'Zend Optimizer (PHP 5.2) oder Zend Guard Loader (PHP 5.3, 5.4, 5.5, 5.6) '. + 'installiert (auf passendes Zend-Installationspaket achten!)', + 'hasZendLoaderOptimizer_DESC' => '
    Das Modul erfordert (je nach PHP-Version) den Zend Optimizer '. + '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". '. + '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.
    '. + '
    Ü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.
    ', + '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 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.', + 'showPhpInfo' => 'PHPinfo anzeigen', + 'dependentoffurther' => '* abhängig von ungeprüften Voraussetzungen', + 'oneandonedescription' => '** geprüft wurde das Ausführungsverzeichnis, '. + 'providerabhängig müssen Unterverzeichnisse separat geprüft werden (z.B. bei 1&1)', + 'or' => ' oder ', + 'toggleswitch' => 'Klick für Details zur Prüfung', + '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', + 'ExecNotice' => 'Execute this check script in the root directory of your shop. In this '. + 'case only checks can executed succesfully.', + 'RequSucc' => 'condition is fulfilled', + 'RequNotSucc' => 'condition isn\'t fulfilled', + 'RequUnknown' => 'condition unclear, see notes in help text', + 'RequNotCheckable' => 'condition isn\'t checkable', + 'hasMinPhpVersion' => 'at least PHP version %1$s', + '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' => '
    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'=> '
    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' => '
    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' => '
    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' => '
    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' => '
    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' => '
    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' => '
    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 or orange marked '. + 'conditions.

    ', + 'deleteFile1' => 'Please delete this file after use on your server! Click here, to delete this file.', + 'showPhpInfo' => 'show PHPinfo', + 'dependentoffurther' => '* dependent of further unchecked conditions', + 'oneandonedescription' => '** this check use execution directory only, provider dependend '. + 'subdirectories have to check separately (e.g. at 1&1)', + 'or' => ' or ', + '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.
  • ', + ), + ); + } +} + +/** + * Class requRemote + */ +class requRemote +{ + public $blUseRemote = true; + + public $oModuleData; + + /** + * @param $sModId + * @param $sModVersion + * @param $sShopEdition + * + * @return bool|array + */ + public function getShopEdition($sModId, $sModVersion, $sShopEdition) + { + $sUrl = "moduleversion/"; + $sUrl .= 'modid/' . urlencode($sModId) . '/'; + $sUrl .= 'forcemodversion/' . urlencode($sModVersion) . '/'; + $sUrl .= 'edition/' . urlencode($sShopEdition) . '/'; + + /** @var stdClass $oModuleData */ + $oModuleData = $this->_getRemoteServerData($sUrl); + + if ($oModuleData->status == 'OK' && isset($oModuleData->moduleversion->compatible_release)) { + return explode(',', $oModuleData->moduleversion->compatible_release->shopedition); + } + + return false; + } + + /** + * @param $sModId + * @param $sModVersion + * @param $sShopEdition + * + * @return bool|string + */ + public function getMinShopVersion($sModId, $sModVersion, $sShopEdition) + { + $sUrl = "moduleversion/"; + $sUrl .= 'modid/' . urlencode($sModId) . '/'; + $sUrl .= 'forcemodversion/' . urlencode($sModVersion) . '/'; + $sUrl .= 'edition/' . urlencode($sShopEdition) . '/'; + + /** @var stdClass $oModuleData */ + $oModuleData = $this->_getRemoteServerData($sUrl); + + if ($oModuleData->status == 'OK' && isset($oModuleData->moduleversion->compatible_release)) { + return $this->shortenVersion($oModuleData->moduleversion->compatible_release->fromshopversion); + } + + return false; + } + + /** + * @param $sModId + * @param $sModVersion + * @param $sShopEdition + * + * @return bool|string + */ + public function getMaxShopVersion($sModId, $sModVersion, $sShopEdition) + { + $sUrl = "moduleversion/"; + $sUrl .= 'modid/' . urlencode($sModId) . '/'; + $sUrl .= 'forcemodversion/' . urlencode($sModVersion) . '/'; + $sUrl .= 'edition/' . urlencode($sShopEdition) . '/'; + + /** @var stdClass $oModuleData */ + $oModuleData = $this->_getRemoteServerData($sUrl); + + if ($oModuleData->status == 'OK' && isset($oModuleData->moduleversion->compatible_release)) { + return $this->shortenVersion($oModuleData->moduleversion->compatible_release->toshopversion); + } + + return false; + } + + /** + * @param $sUrl + * + * @return stdClass + */ + protected function _getRemoteServerData($sUrl) + { + if (isset($this->oModuleData[$sUrl])) { + return $this->oModuleData[$sUrl]; + } + + $oFailureData = new stdClass(); + $oFailureData->status = 'NOK'; + + if (false === $this->blUseRemote) { + return $oFailureData; + } + $sHost = "http://update.oxidmodule.com"; + $sData = $this->curlConnect($sHost . '/serialized/' . $sUrl); + $oData = unserialize($sData); + + if (false == $oData) { + return $oFailureData; + } + $this->oModuleData[$sUrl] = $oData; + + return $this->oModuleData[$sUrl]; + } + + /** + * @param $sFilePath + * + * @return string + */ + public function curlConnect($sFilePath) + { + $sContent = ''; + + if (($ch = $this->_hasCurl())) { + $sCurl_URL = preg_replace('@^((http|https)://)@', '', $sFilePath); + curl_setopt($ch, CURLOPT_URL, $sCurl_URL); + if ($_SERVER['HTTP_USER_AGENT']) { + curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); + } + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_TIMEOUT, 1); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); + curl_setopt($ch, CURLOPT_POST, 0); + $sContent = curl_exec($ch); + } + + return $sContent; + } + + /** + * @return null|resource + */ + protected function _hasCurl() + { + if (extension_loaded('curl') + && function_exists('curl_init') + && function_exists('curl_exec') + ) { + return curl_init(); + } + + return null; + } + + /** + * @param $sVersion + * + * @return string + */ + public function shortenVersion($sVersion) + { + $aVersion = explode('.', $sVersion); + + unset($aVersion[3]); + + return implode('.', $aVersion); + } +} + +/** + * Class requTests + * contains test functions + */ +class requTests +{ + public $oBase; + public $oDb; + public $oConfig; + public $blGlobalResult = false; + + /** + * @param requCheck $oCheckInstance + * @param requConfig $oConfig + * @param $oDb + * @param requRemote $oRemote + */ + public function __construct(requCheck $oCheckInstance, requConfig $oConfig, $oDb, requRemote $oRemote) + { + $this->oBase = $oCheckInstance; + $this->oConfig = $oConfig; + $this->oDb = $oDb; + $this->oRemote = $oRemote; + } + + /** + * @return requCheck + */ + public function getBase() + { + return $this->oBase; + } + + public function getDb() + { + return $this->oDb; + } + + /** + * @return string + */ + public function getBasePath() + { + return $this->getBase()->getBasePath(); + } + + /** + * @param bool $blResult + */ + public function setGlobalResult($blResult) + { + $this->getBase()->blGlobalResult = $blResult; + } + + /** + * @param $sMethodName + * @param null $aArguments + * + * @return array + */ + public function checkInSubDirs($sMethodName, $aArguments = null) + { + return $this->getBase()->checkInSubDirs($sMethodName, $aArguments); + } + + /** + * @param $aConfiguration + * + * @return array + */ + public function hasMinPhpVersion(&$aConfiguration) + { + $aResult = array($this->getBasePath() => false); + + if (version_compare(phpversion(), $aConfiguration['aParams']['version'], '>=')) { + $aResult[$this->getBasePath()] = true; + } + + $aResult = array_merge($aResult, $this->checkInSubDirs(__FUNCTION__, $aConfiguration['aParams'])); + + return $aResult; + } + + /** + * @param $aConfiguration + * + * @return array + */ + public function hasFromToPhpVersion(&$aConfiguration) + { + $aResult = array($this->getBasePath() => false); + + if ((version_compare(phpversion(), $aConfiguration['aParams']['from'], '>=')) && + (version_compare(phpversion(), $aConfiguration['aParams']['to'], '<')) + ) { + $aResult[$this->getBasePath()] = true; + } + + $aResult = array_merge($aResult, $this->checkInSubDirs(__FUNCTION__, $aConfiguration['aParams'])); + + return $aResult; + } + + /** + * @param $aConfiguration + * + * @return array + */ + public function hasMaxPhpVersion(&$aConfiguration) + { + $aResult = array($this->getBasePath() => false); + + if (version_compare(phpversion(), $aConfiguration['aParams']['version'], '<=')) { + $aResult[$this->getBasePath()] = true; + } + + $aResult = array_merge($aResult, $this->checkInSubDirs(__FUNCTION__, $aConfiguration['aParams'])); + + return $aResult; + } + + /** + * @param $aConfiguration + * + * @return array + */ + public function hasExtension(&$aConfiguration) + { + $aResult = array($this->getBasePath() => false); + + if (extension_loaded($aConfiguration['aParams']['type'])) { + $aResult[$this->getBasePath()] = true; + } + + $aResult = array_merge($aResult, $this->checkInSubDirs(__FUNCTION__, $aConfiguration['aParams'])); + + 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 + * + * @return bool + */ + public function hasMinShopVersion(&$aConfiguration) + { + if ($this->getDb()) { + require_once '../vendor/oxid-esales/oxideshop-ce/source/Core/ShopVersion.php'; + $shopVersion = OxidEsales\EshopCommunity\Core\ShopVersion::getVersion(); + + $oEditionResult = $this->_getShopEdition(); + $sEdition = strtoupper($oEditionResult->oxedition); + + $mMinRemoteVersion = $this->oRemote->getMinShopVersion( + $this->oConfig->sModId, + $this->oConfig->sModVersion, + $sEdition + ); + + if ($mMinRemoteVersion) { + $aConfiguration['aParams'] = array('version' => $mMinRemoteVersion); + } else { + $aConfiguration['aParams'] = array('version' => $aConfiguration['aParams'][$sEdition]); + } + + if (version_compare($shopVersion, $aConfiguration['aParams']['version'], '>=')) { + return true; + } + } + + return false; + } + + /** + * @param $aConfiguration + * + * @return bool + */ + public function hasMaxShopVersion(&$aConfiguration) + { + if ($this->getDb()) { + require_once '../vendor/oxid-esales/oxideshop-ce/source/Core/ShopVersion.php'; + $shopVersion = OxidEsales\EshopCommunity\Core\ShopVersion::getVersion(); + + $oEditionResult = $this->_getShopEdition(); + $sEdition = strtoupper($oEditionResult->oxedition); + + $mMaxRemoteVersion = $this->oRemote->getMaxShopVersion( + $this->oConfig->sModId, + $this->oConfig->sModVersion, + $sEdition + ); + + if ($mMaxRemoteVersion) { + $aConfiguration['aParams'] = array('version' => $mMaxRemoteVersion); + } else { + $aConfiguration['aParams'] = array('version' => $aConfiguration['aParams'][$sEdition]); + } + + if (version_compare($shopVersion, $aConfiguration['aParams']['version'], '<=')) { + return true; + } + } + + return false; + } + + /** + * @param $aConfiguration + * + * @return bool + */ + public function isShopEdition(&$aConfiguration) + { + if ($this->getDb()) { + $oResult = $this->_getShopEdition(); + + $mRemoteShopEditions = $this->oRemote->getShopEdition( + $this->oConfig->sModId, + $this->oConfig->sModVersion, + $oResult->oxedition + ); + + if (is_array($mRemoteShopEditions)) { + $aConfiguration['aParams'][0] = $mRemoteShopEditions; + } + + if (in_array(strtoupper($oResult->oxedition), $aConfiguration['aParams'][0])) { + $aConfiguration['aParams'][0] = strtoupper($oResult->oxedition); + return true; + } + } + + return false; + } + + /** + * @return bool|object|stdClass + */ + protected function _getShopEdition() + { + if ($this->getDb()) { + $sField = 'oxedition'; + $sSelect = "SELECT " . $sField . " FROM oxshops WHERE 1 LIMIT 1"; + $rResult = mysqli_query($this->getDb(), $sSelect); + $oResult = mysqli_fetch_object($rResult); + + return $oResult; + } + + return false; + } + + /** + * @return bool + */ + public function hasModCfg() + { + if ($this->getDb()) { + $sModId = 'd3modcfg_lib'; + $sSelect = "SELECT 1 as result FROM d3_cfg_mod WHERE oxmodid = '" . $sModId . "' LIMIT 1"; + $rResult = mysqli_query($this->getDb(), $sSelect); + if (is_object($rResult)) { + $oResult = mysqli_fetch_object($rResult); + + if ((bool) $oResult->result == true) { + return true; + } + } + } + + return false; + } + + /** + * @param $aConfiguration + * + * @return bool|int + */ + public function hasMinModCfgVersion(&$aConfiguration) + { + if ($this->getDb()) { + $sSelect = "SELECT IF ". + "(INET_ATON(oxversion) >= INET_ATON('" . $aConfiguration['aParams']['version'] . "'), 1, 0) AS result ". + "FROM d3_cfg_mod ". + "WHERE + oxmodid = '" . $aConfiguration['aParams']['id'] . "' AND + oxversion != 'basic' + ORDER BY oxversion ASC LIMIT 1"; + + $rResult = mysqli_query($this->getDb(), $sSelect); + $oResult = mysqli_fetch_object($rResult); + $blReturn = (bool)$oResult->result; + + if (false == $blReturn) { + $this->setGlobalResult(false); + } + + return $blReturn; + } + + $this->setGlobalResult(false); + + return false; + } + + /** + * @param $aConfiguration + * + * @return bool|int + */ + public function hasMaxModCfgVersion(&$aConfiguration) + { + if ($this->getDb()) { + $sSelect = "SELECT + IF (INET_ATON(oxversion) <= INET_ATON('" . $aConfiguration['aParams']['version'] . "'), 1, 0) AS result + FROM d3_cfg_mod WHERE + oxmodid = '" . $aConfiguration['aParams']['id'] . "' AND + oxversion != 'basic' + ORDER BY oxversion ASC LIMIT 1"; + + $rResult = mysqli_query($this->getDb(), $sSelect); + $oResult = mysqli_fetch_object($rResult); + $blResult = (bool)$oResult->result; + + if (false == $blResult) { + $this->setGlobalResult(false); + } + + return $blResult; + } + + $this->setGlobalResult(false); + + return false; + } + + /** + * @param $aConfiguration + * + * @return bool + */ + public function requireNewLicence(&$aConfiguration) + { + if ($this->getDb()) { + $sSelect = "SELECT + oxversion as oxversion + FROM d3_cfg_mod WHERE + oxmodid = '" . $this->oConfig->sModId . "' + ORDER BY oxversion ASC LIMIT 1"; + + $rResult = mysqli_query($this->getDb(), $sSelect); + $oResult = mysqli_fetch_object($rResult); + + if (isset($oResult) + && is_object($oResult) + && isset($oResult->oxversion) + && isset($aConfiguration['aParams']['checkVersion']) + ) { + $sInstalledVersion = $this->_getConvertedVersion( + $oResult->oxversion, + $aConfiguration['aParams']['remainingDigits'] + ); + $sNewVersion = $this->_getConvertedVersion( + $this->oConfig->sModVersion, + $aConfiguration['aParams']['remainingDigits'] + ); + if (version_compare($sInstalledVersion, $sNewVersion, '>=')) { + return true; + } + } + } + + return 'notice'; + } + + /** + * cut not used version digits + * @param string $sVersion + * @param int $iRemainingDigits + * + * @return string + */ + protected function _getConvertedVersion($sVersion, $iRemainingDigits) + { + $aInstalledVersion = explode('.', $sVersion); + return implode('.', array_slice($aInstalledVersion, 0, $iRemainingDigits)); + } + + /** + * @return array + */ + 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') + )) { + if (function_exists('opcache_get_status') + && ($aOpCacheStatus = opcache_get_status()) + && $aOpCacheStatus['opcache_enabled'] + ) { + $aResult[$this->getBasePath()] = null; + } else { + $aResult[$this->getBasePath()] = true; + } + } + + if ($blCheckBasePathOnly == false) { + $aResult = array_merge($aResult, $this->checkInSubDirs(__FUNCTION__)); + } + + return $aResult; + } + + /** + * @return array + */ + public function hasIonCubeLoader(&$aConfiguration, $blCheckBasePathOnly = false) + { + $aResult = array($this->getBasePath() => false); + + if (function_exists('ioncube_loader_version')) { + $aResult[$this->getBasePath()] = true; + } + + 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; + } +} + +/** + * Class requTransformation + */ +class requTransformation +{ + public $oCheck; + + /** + * @param requCheck $oCheck + */ + public function __construct(requCheck $oCheck) + { + $this->oCheck = $oCheck; + } + + /** + * @param $aCheckList + */ + public function transformCheckList($aCheckList) + { + $this->_removeDeprecatedLibs($aCheckList['hasMinModCfgVersion']); + $this->_removeDeprecatedLibs($aCheckList['hasMaxModCfgVersion']); + + return $aCheckList; + } + + /** + * @param array $aCheck + */ + protected function _removeDeprecatedLibs(&$aCheck) + { + $blDelOldLibs = false; + $sCheckVersion = 0; + + if (is_array($aCheck)) { + $sSelect = "SELECT oxversion as result ". + "FROM d3_cfg_mod ". + "WHERE oxmodid = 'd3modcfg_lib' LIMIT 1"; + $rResult = mysqli_query($this->oCheck->getDb(), $sSelect); + + if (is_object($rResult)) { + $oResult = mysqli_fetch_object($rResult); + if ($oResult->result) { + $sCheckVersion = $oResult->result; + } + } + + foreach ($aCheck as $aModCfgCheck) { + if (isset($aModCfgCheck['aParams']['id']) && + strtolower($aModCfgCheck['aParams']['id']) == 'd3modcfg_lib' && + version_compare($sCheckVersion, '4.0.0.0', '>=') + ) { + $blDelOldLibs = true; + } + } + + reset($aCheck); + + if ($blDelOldLibs) { + $aOldLibs = array('d3install_lib', 'd3log_lib', 'd3clrtmp_lib'); + foreach ($aCheck as $sKey => $aModCfgCheck) { + if (isset($aModCfgCheck['aParams']['id']) && + in_array(strtolower($aModCfgCheck['aParams']['id']), $aOldLibs) + ) { + unset($aCheck[$sKey]); + } + } + } + } + } +} + +/** + * @param $mVar + */ +function dumpvar($mVar) +{ + echo "
    ";
    +    print_r($mVar);
    +    echo "
    "; +} + +$oRequCheck = new requcheck; +if (isset($_REQUEST['fnc']) && $_REQUEST['fnc']) { + $oRequCheck->{$_REQUEST['fnc']}(); +} else { + $oRequCheck->startCheck(); +} diff --git a/docs/Precheck/modules/d3/contenttabs/.htaccess b/docs/Precheck/modules/d3/contenttabs/.htaccess index c3c209e..f00ac41 100644 --- a/docs/Precheck/modules/d3/contenttabs/.htaccess +++ b/docs/Precheck/modules/d3/contenttabs/.htaccess @@ -1,11 +1,11 @@ - - - # Apache 2.4 - Require all granted - - - # Apache 2.2 - order deny,allow - allow from all - - + + + # Apache 2.4 + Require all granted + + + # Apache 2.2 + order deny,allow + allow from all + + diff --git a/docs/Precheck/modules/d3/contenttabs/Application/Controller/Admin/.htaccess b/docs/Precheck/modules/d3/contenttabs/Application/Controller/Admin/.htaccess index c3c209e..f00ac41 100644 --- a/docs/Precheck/modules/d3/contenttabs/Application/Controller/Admin/.htaccess +++ b/docs/Precheck/modules/d3/contenttabs/Application/Controller/Admin/.htaccess @@ -1,11 +1,11 @@ - - - # Apache 2.4 - Require all granted - - - # Apache 2.2 - order deny,allow - allow from all - - + + + # Apache 2.4 + Require all granted + + + # Apache 2.2 + order deny,allow + allow from all + + diff --git a/docs/Precheck/modules/d3/contenttabs/Application/Controller/Admin/d3precheckinfolder.php b/docs/Precheck/modules/d3/contenttabs/Application/Controller/Admin/d3precheckinfolder.php index 5a01c98..2bbc9ff 100644 --- a/docs/Precheck/modules/d3/contenttabs/Application/Controller/Admin/d3precheckinfolder.php +++ b/docs/Precheck/modules/d3/contenttabs/Application/Controller/Admin/d3precheckinfolder.php @@ -1,198 +1,198 @@ - - * @link http://www.oxidmodule.com - */ - -date_default_timezone_set('Europe/Berlin'); - -/** - * Class d3PreCheckInFolder - */ -class d3PreCheckInFolder -{ - public $sVersion = '4.10.2'; - - /** - * @return string - */ - public function getVersion() - { - return $this->sVersion; - } - - /** - * @return bool - */ - public function hasMinPhpVersion() - { - $aArgs = func_get_args(); - - if (version_compare(phpversion(), $aArgs[0]['version'], '>=')) { - return true; - } - - return false; - } - - /** - * @return bool - */ - public function hasMaxPhpVersion() - { - $aArgs = func_get_args(); - - if (version_compare(phpversion(), $aArgs[0]['version'], '<=')) { - return true; - } - - return false; - } - - /** - * @return bool - */ - public function hasFromToPhpVersion() - { - $aArgs = func_get_args(); - - if ((version_compare(phpversion(), $aArgs[0]['from'], '>=')) && (version_compare( - phpversion(), - $aArgs[0]['to'], - '<' - )) - ) { - return true; - } - - return false; - } - - /** - * @return bool - */ - public function hasZendLoaderOptimizer() - { - 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'] - ) { - return null; - } else { - return true; - } - } - - return false; - } - - /** - * @return bool - */ - public function hasIonCubeLoader() - { - if (function_exists('ioncube_loader_version')) { - return true; - } - - return false; - } - - /** - * @return bool - */ - public function hasExtension() - { - $aArgs = func_get_args(); - - if (extension_loaded($aArgs[0]['type'])) { - return true; - } - - return false; - } - - /** - * @return bool - */ - public function hasMinCurlVersion() - { - $aArgs = func_get_args(); - - $aCurlVersion = curl_version(); - return version_compare($aCurlVersion['version'], $aArgs[0]['version'], '>='); - } - - /** - * @return bool - */ - public function hasMinOpenSSLVersion() - { - $aArgs = func_get_args(); - return version_compare($this->get_openssl_version_number(true), $aArgs[0]['version'], '>='); - } - - /** - * @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 $mVar - */ -function dumpvar($mVar) -{ - echo "
    ";
    -    print_r($mVar);
    -    echo "
    "; -} - -if (!isset($_SERVER['REMOTE_ADDR']) || !isset($_SERVER['HTTP_USER_AGENT'])) { - $oPreCheck = new d3PreCheckInFolder(); - if (isset($_GET['fnc']) && $_GET['fnc']) { - $aParams = isset($_GET['params']) ? unserialize(stripslashes(urldecode($_GET['params']))) : array(); - echo serialize(call_user_func(array($oPreCheck, $_GET['fnc']), $aParams)); - } + + * @link http://www.oxidmodule.com + */ + +date_default_timezone_set('Europe/Berlin'); + +/** + * Class d3PreCheckInFolder + */ +class d3PreCheckInFolder +{ + public $sVersion = '5.0.0'; + + /** + * @return string + */ + public function getVersion() + { + return $this->sVersion; + } + + /** + * @return bool + */ + public function hasMinPhpVersion() + { + $aArgs = func_get_args(); + + if (version_compare(phpversion(), $aArgs[0]['version'], '>=')) { + return true; + } + + return false; + } + + /** + * @return bool + */ + public function hasMaxPhpVersion() + { + $aArgs = func_get_args(); + + if (version_compare(phpversion(), $aArgs[0]['version'], '<=')) { + return true; + } + + return false; + } + + /** + * @return bool + */ + public function hasFromToPhpVersion() + { + $aArgs = func_get_args(); + + if ((version_compare(phpversion(), $aArgs[0]['from'], '>=')) && (version_compare( + phpversion(), + $aArgs[0]['to'], + '<' + )) + ) { + return true; + } + + return false; + } + + /** + * @return bool + */ + public function hasZendLoaderOptimizer() + { + 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'] + ) { + return null; + } else { + return true; + } + } + + return false; + } + + /** + * @return bool + */ + public function hasIonCubeLoader() + { + if (function_exists('ioncube_loader_version')) { + return true; + } + + return false; + } + + /** + * @return bool + */ + public function hasExtension() + { + $aArgs = func_get_args(); + + if (extension_loaded($aArgs[0]['type'])) { + return true; + } + + return false; + } + + /** + * @return bool + */ + public function hasMinCurlVersion() + { + $aArgs = func_get_args(); + + $aCurlVersion = curl_version(); + return version_compare($aCurlVersion['version'], $aArgs[0]['version'], '>='); + } + + /** + * @return bool + */ + public function hasMinOpenSSLVersion() + { + $aArgs = func_get_args(); + return version_compare($this->get_openssl_version_number(true), $aArgs[0]['version'], '>='); + } + + /** + * @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 $mVar + */ +function dumpvar($mVar) +{ + echo "
    ";
    +    print_r($mVar);
    +    echo "
    "; +} + +if (!isset($_SERVER['REMOTE_ADDR']) || !isset($_SERVER['HTTP_USER_AGENT'])) { + $oPreCheck = new d3PreCheckInFolder(); + if (isset($_GET['fnc']) && $_GET['fnc']) { + $aParams = isset($_GET['params']) ? unserialize(stripslashes(urldecode($_GET['params']))) : array(); + echo serialize(call_user_func(array($oPreCheck, $_GET['fnc']), $aParams)); + } } \ No newline at end of file diff --git a/docs/Precheck/modules/d3/contenttabs/Setup/.htaccess b/docs/Precheck/modules/d3/contenttabs/Setup/.htaccess index c3c209e..f00ac41 100644 --- a/docs/Precheck/modules/d3/contenttabs/Setup/.htaccess +++ b/docs/Precheck/modules/d3/contenttabs/Setup/.htaccess @@ -1,11 +1,11 @@ - - - # Apache 2.4 - Require all granted - - - # Apache 2.2 - order deny,allow - allow from all - - + + + # Apache 2.4 + Require all granted + + + # Apache 2.2 + order deny,allow + allow from all + + diff --git a/docs/Precheck/modules/d3/contenttabs/Setup/d3precheckinfolder.php b/docs/Precheck/modules/d3/contenttabs/Setup/d3precheckinfolder.php index 5a01c98..2bbc9ff 100644 --- a/docs/Precheck/modules/d3/contenttabs/Setup/d3precheckinfolder.php +++ b/docs/Precheck/modules/d3/contenttabs/Setup/d3precheckinfolder.php @@ -1,198 +1,198 @@ - - * @link http://www.oxidmodule.com - */ - -date_default_timezone_set('Europe/Berlin'); - -/** - * Class d3PreCheckInFolder - */ -class d3PreCheckInFolder -{ - public $sVersion = '4.10.2'; - - /** - * @return string - */ - public function getVersion() - { - return $this->sVersion; - } - - /** - * @return bool - */ - public function hasMinPhpVersion() - { - $aArgs = func_get_args(); - - if (version_compare(phpversion(), $aArgs[0]['version'], '>=')) { - return true; - } - - return false; - } - - /** - * @return bool - */ - public function hasMaxPhpVersion() - { - $aArgs = func_get_args(); - - if (version_compare(phpversion(), $aArgs[0]['version'], '<=')) { - return true; - } - - return false; - } - - /** - * @return bool - */ - public function hasFromToPhpVersion() - { - $aArgs = func_get_args(); - - if ((version_compare(phpversion(), $aArgs[0]['from'], '>=')) && (version_compare( - phpversion(), - $aArgs[0]['to'], - '<' - )) - ) { - return true; - } - - return false; - } - - /** - * @return bool - */ - public function hasZendLoaderOptimizer() - { - 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'] - ) { - return null; - } else { - return true; - } - } - - return false; - } - - /** - * @return bool - */ - public function hasIonCubeLoader() - { - if (function_exists('ioncube_loader_version')) { - return true; - } - - return false; - } - - /** - * @return bool - */ - public function hasExtension() - { - $aArgs = func_get_args(); - - if (extension_loaded($aArgs[0]['type'])) { - return true; - } - - return false; - } - - /** - * @return bool - */ - public function hasMinCurlVersion() - { - $aArgs = func_get_args(); - - $aCurlVersion = curl_version(); - return version_compare($aCurlVersion['version'], $aArgs[0]['version'], '>='); - } - - /** - * @return bool - */ - public function hasMinOpenSSLVersion() - { - $aArgs = func_get_args(); - return version_compare($this->get_openssl_version_number(true), $aArgs[0]['version'], '>='); - } - - /** - * @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 $mVar - */ -function dumpvar($mVar) -{ - echo "
    ";
    -    print_r($mVar);
    -    echo "
    "; -} - -if (!isset($_SERVER['REMOTE_ADDR']) || !isset($_SERVER['HTTP_USER_AGENT'])) { - $oPreCheck = new d3PreCheckInFolder(); - if (isset($_GET['fnc']) && $_GET['fnc']) { - $aParams = isset($_GET['params']) ? unserialize(stripslashes(urldecode($_GET['params']))) : array(); - echo serialize(call_user_func(array($oPreCheck, $_GET['fnc']), $aParams)); - } + + * @link http://www.oxidmodule.com + */ + +date_default_timezone_set('Europe/Berlin'); + +/** + * Class d3PreCheckInFolder + */ +class d3PreCheckInFolder +{ + public $sVersion = '5.0.0'; + + /** + * @return string + */ + public function getVersion() + { + return $this->sVersion; + } + + /** + * @return bool + */ + public function hasMinPhpVersion() + { + $aArgs = func_get_args(); + + if (version_compare(phpversion(), $aArgs[0]['version'], '>=')) { + return true; + } + + return false; + } + + /** + * @return bool + */ + public function hasMaxPhpVersion() + { + $aArgs = func_get_args(); + + if (version_compare(phpversion(), $aArgs[0]['version'], '<=')) { + return true; + } + + return false; + } + + /** + * @return bool + */ + public function hasFromToPhpVersion() + { + $aArgs = func_get_args(); + + if ((version_compare(phpversion(), $aArgs[0]['from'], '>=')) && (version_compare( + phpversion(), + $aArgs[0]['to'], + '<' + )) + ) { + return true; + } + + return false; + } + + /** + * @return bool + */ + public function hasZendLoaderOptimizer() + { + 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'] + ) { + return null; + } else { + return true; + } + } + + return false; + } + + /** + * @return bool + */ + public function hasIonCubeLoader() + { + if (function_exists('ioncube_loader_version')) { + return true; + } + + return false; + } + + /** + * @return bool + */ + public function hasExtension() + { + $aArgs = func_get_args(); + + if (extension_loaded($aArgs[0]['type'])) { + return true; + } + + return false; + } + + /** + * @return bool + */ + public function hasMinCurlVersion() + { + $aArgs = func_get_args(); + + $aCurlVersion = curl_version(); + return version_compare($aCurlVersion['version'], $aArgs[0]['version'], '>='); + } + + /** + * @return bool + */ + public function hasMinOpenSSLVersion() + { + $aArgs = func_get_args(); + return version_compare($this->get_openssl_version_number(true), $aArgs[0]['version'], '>='); + } + + /** + * @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 $mVar + */ +function dumpvar($mVar) +{ + echo "
    ";
    +    print_r($mVar);
    +    echo "
    "; +} + +if (!isset($_SERVER['REMOTE_ADDR']) || !isset($_SERVER['HTTP_USER_AGENT'])) { + $oPreCheck = new d3PreCheckInFolder(); + if (isset($_GET['fnc']) && $_GET['fnc']) { + $aParams = isset($_GET['params']) ? unserialize(stripslashes(urldecode($_GET['params']))) : array(); + echo serialize(call_user_func(array($oPreCheck, $_GET['fnc']), $aParams)); + } } \ No newline at end of file diff --git a/docs/Precheck/modules/d3/contenttabs/d3precheckinfolder.php b/docs/Precheck/modules/d3/contenttabs/d3precheckinfolder.php index 5a01c98..2bbc9ff 100644 --- a/docs/Precheck/modules/d3/contenttabs/d3precheckinfolder.php +++ b/docs/Precheck/modules/d3/contenttabs/d3precheckinfolder.php @@ -1,198 +1,198 @@ - - * @link http://www.oxidmodule.com - */ - -date_default_timezone_set('Europe/Berlin'); - -/** - * Class d3PreCheckInFolder - */ -class d3PreCheckInFolder -{ - public $sVersion = '4.10.2'; - - /** - * @return string - */ - public function getVersion() - { - return $this->sVersion; - } - - /** - * @return bool - */ - public function hasMinPhpVersion() - { - $aArgs = func_get_args(); - - if (version_compare(phpversion(), $aArgs[0]['version'], '>=')) { - return true; - } - - return false; - } - - /** - * @return bool - */ - public function hasMaxPhpVersion() - { - $aArgs = func_get_args(); - - if (version_compare(phpversion(), $aArgs[0]['version'], '<=')) { - return true; - } - - return false; - } - - /** - * @return bool - */ - public function hasFromToPhpVersion() - { - $aArgs = func_get_args(); - - if ((version_compare(phpversion(), $aArgs[0]['from'], '>=')) && (version_compare( - phpversion(), - $aArgs[0]['to'], - '<' - )) - ) { - return true; - } - - return false; - } - - /** - * @return bool - */ - public function hasZendLoaderOptimizer() - { - 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'] - ) { - return null; - } else { - return true; - } - } - - return false; - } - - /** - * @return bool - */ - public function hasIonCubeLoader() - { - if (function_exists('ioncube_loader_version')) { - return true; - } - - return false; - } - - /** - * @return bool - */ - public function hasExtension() - { - $aArgs = func_get_args(); - - if (extension_loaded($aArgs[0]['type'])) { - return true; - } - - return false; - } - - /** - * @return bool - */ - public function hasMinCurlVersion() - { - $aArgs = func_get_args(); - - $aCurlVersion = curl_version(); - return version_compare($aCurlVersion['version'], $aArgs[0]['version'], '>='); - } - - /** - * @return bool - */ - public function hasMinOpenSSLVersion() - { - $aArgs = func_get_args(); - return version_compare($this->get_openssl_version_number(true), $aArgs[0]['version'], '>='); - } - - /** - * @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 $mVar - */ -function dumpvar($mVar) -{ - echo "
    ";
    -    print_r($mVar);
    -    echo "
    "; -} - -if (!isset($_SERVER['REMOTE_ADDR']) || !isset($_SERVER['HTTP_USER_AGENT'])) { - $oPreCheck = new d3PreCheckInFolder(); - if (isset($_GET['fnc']) && $_GET['fnc']) { - $aParams = isset($_GET['params']) ? unserialize(stripslashes(urldecode($_GET['params']))) : array(); - echo serialize(call_user_func(array($oPreCheck, $_GET['fnc']), $aParams)); - } + + * @link http://www.oxidmodule.com + */ + +date_default_timezone_set('Europe/Berlin'); + +/** + * Class d3PreCheckInFolder + */ +class d3PreCheckInFolder +{ + public $sVersion = '5.0.0'; + + /** + * @return string + */ + public function getVersion() + { + return $this->sVersion; + } + + /** + * @return bool + */ + public function hasMinPhpVersion() + { + $aArgs = func_get_args(); + + if (version_compare(phpversion(), $aArgs[0]['version'], '>=')) { + return true; + } + + return false; + } + + /** + * @return bool + */ + public function hasMaxPhpVersion() + { + $aArgs = func_get_args(); + + if (version_compare(phpversion(), $aArgs[0]['version'], '<=')) { + return true; + } + + return false; + } + + /** + * @return bool + */ + public function hasFromToPhpVersion() + { + $aArgs = func_get_args(); + + if ((version_compare(phpversion(), $aArgs[0]['from'], '>=')) && (version_compare( + phpversion(), + $aArgs[0]['to'], + '<' + )) + ) { + return true; + } + + return false; + } + + /** + * @return bool + */ + public function hasZendLoaderOptimizer() + { + 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'] + ) { + return null; + } else { + return true; + } + } + + return false; + } + + /** + * @return bool + */ + public function hasIonCubeLoader() + { + if (function_exists('ioncube_loader_version')) { + return true; + } + + return false; + } + + /** + * @return bool + */ + public function hasExtension() + { + $aArgs = func_get_args(); + + if (extension_loaded($aArgs[0]['type'])) { + return true; + } + + return false; + } + + /** + * @return bool + */ + public function hasMinCurlVersion() + { + $aArgs = func_get_args(); + + $aCurlVersion = curl_version(); + return version_compare($aCurlVersion['version'], $aArgs[0]['version'], '>='); + } + + /** + * @return bool + */ + public function hasMinOpenSSLVersion() + { + $aArgs = func_get_args(); + return version_compare($this->get_openssl_version_number(true), $aArgs[0]['version'], '>='); + } + + /** + * @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 $mVar + */ +function dumpvar($mVar) +{ + echo "
    ";
    +    print_r($mVar);
    +    echo "
    "; +} + +if (!isset($_SERVER['REMOTE_ADDR']) || !isset($_SERVER['HTTP_USER_AGENT'])) { + $oPreCheck = new d3PreCheckInFolder(); + if (isset($_GET['fnc']) && $_GET['fnc']) { + $aParams = isset($_GET['params']) ? unserialize(stripslashes(urldecode($_GET['params']))) : array(); + echo serialize(call_user_func(array($oPreCheck, $_GET['fnc']), $aParams)); + } } \ No newline at end of file diff --git a/src/Application/Controller/Admin/contentTabList.php b/src/Application/Controller/Admin/contentTabList.php index cef531e..0d9046b 100644 --- a/src/Application/Controller/Admin/contentTabList.php +++ b/src/Application/Controller/Admin/contentTabList.php @@ -1,158 +1,155 @@ -1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199); ?> -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 -BQbcQSYRjw7DV4nf \ No newline at end of file +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 \ No newline at end of file diff --git a/src/Application/Controller/Admin/contentTabs.php b/src/Application/Controller/Admin/contentTabs.php index 4580dbe..0192f25 100644 --- a/src/Application/Controller/Admin/contentTabs.php +++ b/src/Application/Controller/Admin/contentTabs.php @@ -1,242 +1,245 @@ -1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199); ?> -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 \ No newline at end of file +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 ++x88gx3aaBdWwWIQjSixR7JBURSmKMUz \ No newline at end of file diff --git a/src/Application/Controller/Admin/settings.php b/src/Application/Controller/Admin/settings.php index 872a600..7d609a8 100644 --- a/src/Application/Controller/Admin/settings.php +++ b/src/Application/Controller/Admin/settings.php @@ -1,24 +1,24 @@ -1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199); ?> -HR+cPnSwr8cW0IsklOr1ghBAOKZtaytUNMJo++Xi3BYhtSsLJo3T5zT/qN7aUoHzZEi6bXi6rb1B -CAyQ0zQNBjxbNXyeG+NBFXhfKD2qYUOHyqnygfpxKcctfQ+IAnFWFLMgBifEjY3upY9IPm7XvejH -8mJcFcgmANBxjcgF2rs73xdf/eWFjdr9gal6a7uH7LOq8RWAAlfy/4OpwlLaDfaf+6WkcDh0DtuC -It8F9ChphsBGVq0uNnQgXHBbmEKnqFkC8Whj1IZc3KMhH5HebcITtX2fKK+4PpepA3hDqO9uW9CI -PYsnQCDyvSy/zItnWeYWCxED0eFDf2dy+koe+PpzkY+WKMqzKv0XMRl0q6z6IFT4Zk9WJ725gZ6r -pOzB/RDm6iOsncj7mO94e7nRRhp0EK87qoWBRDcBA39ZmM6I0dN8t0da5YIiloXn2ksao6rwHR/t -pPoaIAR4y+3mOR6cgIn1ikIzW23dZDEF5O2rdKq2SIGtusboEgo7xpqJx6gtkgQrXYykjk5fB/YX -dqzHRi6d6s25ahSv3K/K4rtgubfxtWVjpDx6kEQ8CtOxbDryY9ry7K6SKVdkJsCiFf9FZ10FFwN1 -jbNf3S2TYHxTepRDR/3YekEMJTMxy+SB7h+iOBET4jRUhLLlavXM2Nvs9v+QaygG4s47AD0ShFGp -dMKwVCc6k6SWm9eYS6rTSv2jKU8i/dFNCGtpIsW2hOLHbFN+FY28jbg9Qup1l0TtRpK4rxx9tdlS -zKijWKYc1Rum+b40+hHHk+HNaDV7FqZohqIvLBQW2Lnud/nvTGHJl121UPAQ9P0rz1gWOh4B2QbU -h5Lj59drQeWzLQWwJu+CQsiTWJ17cOfXHUzqgJ0/MT6VduYHhPS/Cbnx9WfvcdUemwS+s53Skx2d -WcerRuvxBeIBBv7wf4GBszFQ5QHn4LhI9i7hQWVU+M1VkL72XWfHYiWVsMznkztM4OZK76W1xmLe -Sq2c3eRHFz77Ld6rbOVrypBhQtlHjbFdBU+pj0sijUhxDDNmVp7wXR6hloQulobtC8iatNJ42d5r -UywU2vJMo7YOeqhtnlk9jdH+gkjXRezR/T11uML10BWnMLmlXAMMQwqMt/M/d0Ca1pLbG5yQAsH8 -wllY/P4xGoSQo5yYfbhCSP1VYTZnLkoKPaczv1wTwqWUAYGAjJvHIX6hKjRfnq4ZQ/JQ2tYvk4Jz -lAogLVTeR4Y4pZzv1Y+EGshU8B/L4v6H1qce979xtn1+Ib8hqb7bUpsmquoaVThx91f0J1kqF/NG -5y5KznYrGGQ/rN8KDPdtehpGZgHK2EJJTxAw9KRrhtmx5kEWVxHPIFJbEsc3lXaJ/bqbc5iVj6DO -9dMu0bxwupCqm1vMD4QqFLNUWcte0Hkop7zmiv/ge13DhMP9dRlgcfbq+9tnT/JfQVSR/eWxonO5 -2+wVlkmb+957Sq+ERTmDZdUEYAYkOEoQAnjiQ3qZGvnIz3QneyEztm== \ No newline at end of file +HR+cP/1mUTzhsq4HSiVi/6ApqHU+egvlYT8vUj2X5/w71kMCcAIQPJCnw9dgsR2F4tTfqxsc5sRL +iGrCo26ZqYOT4h6xENmG/UiGrUYkUQn6URJiPIxI/O0z7wqYMIB8lskiGu3Ubxj9u4sXuy2kBWSq +dGsMq230Yj7Ky8v1mLOGBg8K9Z+7Q1/goPX2P/fQYX4gSDTD3wvgUrJWlDEAhxcIfzrOZWB+0zoW +8CW5Kl8xJ8kkB+xqj4j/iN4XAn6T5cUQxIXo/ZjbwMfpGAblZ3xcC8GI1ZDUQm5McaB9KQjbtsnM +0DIVVIAfMJel0LnNFIOp7jG9L+NLwkosPwCE6ufcb4nVcCL7hKCudIHJt2YANrgrCZHLYrKtYJxn +qpqud6DH8w8co1NDXdABElbNIYmpeRXVkNO2FIXhYOpdB9BVDW9Ocqmow9NdRNzXeKvysN67WMBz +7SFVVtkiMFK6bIhhequjH4uWTEKlpp7ze1XZHI4OhtR9su3PlwHrgcuv0tIu+0n9va1vfaP8CHAk +L8R+HG6XQTToLcqkJxGP89Wp3UcTA93tz4zQsY/yDQPxxoaaLRWEk7xkO+cbmR27Ho7oo/HAw1V0 +h0fJQeyL8oi0QExF2aVRNAmvyUVteP7Cv9rQNpgceW1bVOaL7w+DJTGa6djKXGS5/MNC3fxR/I9K +7b4ETGOSWMk3dH2LfWQPK52jO+YMUpQI/UXXHi0eeFmD/y0YSsAZ5jzLamle9Kj9r4tN4QMO2vcf +OgLOMC5PzNuYHlFVicKpMf1vi7V6WV3cSRvGE3JEIaC7X8h0+3KZKjxHK22r63v7hzEB+6xnMbM4 +KnA4O6542V6tlNGVRNBy3QDH5NKCqpetJT4p5jcE2S4pYDLMOfO1tgJ5PyCT3Z9ZORdF1CoxXfWR +HQz67lo8e4LRgFtNzzSPc3Xq6HU+W3fkWwgbJFDDlN0gn9lye+Tzh8Ll+c3CH1thcsgyI3Z5gq2I +8pQgvrhmbeFBtpiVI0WBbtxelocFXF6dmUM83K7pxcH4OPq/v4HVr6HCH3UigYChnK7iR3/roX3W +GHZTaB+Fih+m7mX6v9jgdXpbA9gTsj9dnIkdwAXblbdtfXSftR8aa0+jee8/JLQgDsSjw1NCn/Xm +XQHmbLp8s5LM21mLjqv4Sqlq9u+3kpwxRBH/UThWq+sqvC2Gp1T4BW/0byRu2B75TPaujKAgBEOB +kKhuBrG1iJ3fRDoDRJLeH2b1GqGJCG6zmitukHJrHXgviK6YGYH2u1NuveqcLdYWRN0OX9Zfejrm +h2s14/yhfu3GQMVHTqSKO8W53ofamjSBcm5Jql7xvLCur/EoI5tpW80YxjWrAq+lyOOmwHEhhSP2 +kViiFpUeRKI+xci+ZY/m+TpqL2DqlNeu1rBOD1UTAR5w3/WFFdkMZ+fXZstwwNynOMw9ZX1hD0nn +tBfmEA65YLL2Fgkrf2UZEO4= \ No newline at end of file diff --git a/src/Application/Controller/Admin/support.php b/src/Application/Controller/Admin/support.php index 4ea331d..57664d6 100644 --- a/src/Application/Controller/Admin/support.php +++ b/src/Application/Controller/Admin/support.php @@ -1,21 +1,21 @@ -1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199); ?> -HR+cPnDWzsPkoCj9TzPYHIqOqI7C/nxwdPoOzSaAZ8pAMQdpPgZ4mSThHhePkjN0NM5daqYexV2A -0hoSHR56sy/lPu/6EAtQcbuxG1HRZtDAHeia4S5ue2Omyz7PVsdflzRdbuSOU79qB3lypdIYhq+X -XqSUaYZXIY0Jw8UkrfuicnTcUFo9BnwqsGE1q0hFHBjEXpMEGJiCOcZZiQDDr9Rn5ewM+JBxZMpx -TkmhUeU83DC4oSxzGBafTs7pbXzbvYmHnLWI8A4evWr5gqHKQ9PadTuGgL5FpsjaPiosEqyV05/v -4kOjiNrrYBK4HjWXm3JlpIX106pWZ9TkfxyApIDThAXMzjcfAu65pXeAdba4HXl78PL8jOJWEUAH -TLbjmr1vNekylhA75/Btf1z7p9cgmXCx7EKb3zUuVKE8zl3LRoQTnETLr9MTP4G2p2o7qTWst/1A -vmpqmx2CPQzsdUXwYLF6lTgKUcVshiMM7MHxwX/svSmS3lBGj7VGvnFfnt8HWO3B30YECFEaiUpl -u1KxDGqelYF4/fJzxqnR+9z4GSJJ1fN5obxveUrqGKUoVg5lT8fUayx9N2dhRXqNaab7c+dllaCj -o1A8t/x2fRB9ZCbuxPByoeqRrQQvnetTA35hla2D4uNMqNlN7/zGQOhE7FiIhMZO7o8BASYP5tWe -/CPq8pOdKq2B2+Sbzpb5/6vYinNGBYfOsOolOuSA1VxS2DWEcaQlYerFMvFgu4HR1cd/dasDBWlB -NpFRasYkTEZbHw/OANp9zWfjJAtkEn6Icog6qOW7ez7ke9yQzIuvih87CTlipBxjy8idqex+a5V/ -1KiUiEtSAQnEj2t1DO6xoXsauV1fm4SKWEp8Ce05G9UnMQQLpp6ouDQ8fooMnwDL24/zBPajgO86 -V5pX9ryqjA8lSDSzaHdZgvCSgUEnmDoAWgVpDxBn2ddlM6mFF+mndGd8S4Bazj0dfFXAuX/n4/sQ -lzOK7TSm6293djwuoUKDzHlOb1OeUsG8snWj10KYziHDTt5nWC4k9OQgr1bvswM9QKa2icsGz7a2 -EBPGL+RiSTubzTQ9Xc+wxZ2o1gXrntb4TZSaEInJs40LHpOEUGi446zpka33QM3h01nODl2YQhBx -OIybOzmmYRxvhRh9157ccnGq9/nD8NrfP52L/10YbbKw5do2U9cnvN+b4X+pc+AslOoOZYJ1WoW5 -4psLFIOmClfD8RhHUGftkqj6DEwtec9x7G== \ No newline at end of file +HR+cPtU7Jun3RRIZ6Z7Qh+qwRzywsgEWVpt+vE8waX8Jxmd7th57gCr99A+ZxA8svPRmshFfCv4X +Hkl0rWYvxMS5PIJH3bZmDNiY6Ws8BDsHWelcj2Yn1y5htEbKZy/ErxU/bqwnA0WeRBxq9Kh3Av41 +5HN5LM/CC4b/5tUfaxT3pI+t8VrrLFyLXDe2/G86Wh8nxjQd49hhoz6jwraS0IuTOQBvAqNGf5Kw +sUIK9y8NBnitc5j0tfNOYLqTD6DSer9LJwIP4GWxPUbgSq2fRum+vZ244WOp+cPR5BMX9Yp59k3f +Le3Jdt8CJJBGqtyu0/Y1j6Y8aZuIbbQ6I10Kd95Slk3ia6X+hXbFoGuYLAk41hBELjwTg/ZpEtpw +QIxQ/HjXxM/xP0xnxFO/P9RFTc20IdD+blMtxeqTMlLOSnE02pW+RoLfbwpnp+nJ7r36taOU8HOL +Tnqx1D2XImMzIDs1hjQ4TjqLo9uPYMiDePgb+IU8y3V0XjuqnMqh3GAGiTZNSet9JdxoIZ7SGmdy +eP9P3JY6gL2zKtWu8XxqIjwiTWT3UC8AAeFXXYYrRZKbbk7yANg65bP1NG9L2TUwDSxyNnOjP/zS +WQpFTOtLSI846vvpbC4AKznU9gxiCqGpANgrLaRuAOnCUdsVYjol95bzRVzSe1nZOKKN+FQi24PQ +3tVijY+z0xr8wfd4/fioa+vQY6Hog7jjSL7sj8r1AK1CgmeiZcIErStDvMM5c5P9cKGJfMwp1QHv +1HxNsRqrO9LcGx5cRSkHtfgIR0CARl8Vl9AhL3dtHvCx2244tdNQL5sQZ2LQJvbGhltfGlM4Jh+d +n5cdbIZ2NfMQYoxgwZI1qcdTOzf9skGCi8CHv79Uwi1ZQQORpqj4B0M+etDxAM/txJJJLVMxKF5a +LQxftfyDPgryYDeXIoPcFLeXyWaF5o4tHHyUBHdj5AX66GSDUqPCbNvkHS14khZlGpMRmEh+JQ1I +lGmQMK/IVVfmdg1ExeuLdA1V0ZWB6fMlLvsS4HgALCcuXNkKNC42CdVC5ryjNpXYrZw6onA6Ns36 +JBbnb42bFKgXOJVqNfsSSY6Vxo5tmv6JQLceQGpeFHv9f8erlz/1CPPKSj6Jla5t3AsGQMnNeQH1 +fb358X4QEMfJ0bWDMR2u65hc2wUgGT/jFhfs4Ba7cW/Dl+UI+HIudt4MnASY0ToQOUnbs5eJRTyN +M9LMQG8afOac6GCpooYwPaSgwm== \ No newline at end of file diff --git a/src/Application/Model/contentTabs.php b/src/Application/Model/contentTabs.php index 8484ecf..7c1b241 100644 --- a/src/Application/Model/contentTabs.php +++ b/src/Application/Model/contentTabs.php @@ -1,277 +1,275 @@ -1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199); ?> -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/src/Application/translations/de/d3_contenttabs_lang.php b/src/Application/translations/de/d3_contenttabs_lang.php index fed6967..10e6800 100644 --- a/src/Application/translations/de/d3_contenttabs_lang.php +++ b/src/Application/translations/de/d3_contenttabs_lang.php @@ -1,12 +1,12 @@ - 'UTF-8', - //Navigation - 'D3_CONTENTTABS_TITLE_1' => 'Beschreibung', - 'D3_CONTENTTABS_TITLE_X' => 'Tab', -); + 'UTF-8', + //Navigation + 'D3_CONTENTTABS_TITLE_1' => 'Beschreibung', + 'D3_CONTENTTABS_TITLE_X' => 'Tab', +); diff --git a/src/Application/views/admin/de/d3_contenttabs_lang.php b/src/Application/views/admin/de/d3_contenttabs_lang.php index 69ed9ed..c01c235 100644 --- a/src/Application/views/admin/de/d3_contenttabs_lang.php +++ b/src/Application/views/admin/de/d3_contenttabs_lang.php @@ -1,50 +1,51 @@ - 'UTF-8', - // Navigation - 'd3mxContentTabs' => ' Content Tabs', - 'd3mxContentTabs_settings' => 'Tabverwaltung', - 'd3mxContentTabs_main' => 'Stamm', - // article-list-fields?! - 'GENERAL_ARTICLE_D3LONGDESCTITLE' => 'Titel 1 ContentTabs', - 'GENERAL_ARTICLE_D3LONGDESC2TITLE' => 'Titel 2 ContentTabs', - 'GENERAL_ARTICLE_D3LONGDESC3TITLE' => 'Titel 3 ContentTabs', - 'GENERAL_ARTICLE_D3LONGDESC4TITLE' => 'Titel 4 ContentTabs', - 'GENERAL_ARTICLE_D3LONGDESC5TITLE' => 'Titel 5 ContentTabs', - 'D3_ARTICLE_MAIN_TITLE_CONTENT_TAB_EDIT' => 'Langtexte des Artikels', - // Admin-Template - 'D3_CONTENT_TABS_FIRST_SELECT_ARTICLE' => 'Bitte erst einen Artikel aus der Liste zum Editieren auswählen.', - 'D3_CONTENT_TABS_TITEL' => 'Tab-Titel', - 'D3_CONTENT_TABS_ARTICLE_VARIANTSELECT' => 'Wechsel zu Variante (Art.-Nr. -- Auswahlname)', - 'D3_CONTENT_TABS_ARTICLE_PARENTARTICLE' => 'Elternartikel', - 'D3_CONTENT_TABS_ARTICLE_GENERAL_LANGUAGE' => 'In Sprache', - 'D3_CONTENT_TABS_ARTICLE_SELECTED_ARTICLE_TO_EDIT' => 'Aktuell editieren Sie den Artikel', - 'D3_CONTENT_TABS_FIELD' => 'Langtext', - 'D3_CONTENT_TABS_ARTICLE_EDITOR_PLAINTEXT_HINT' => 'Anmerkung:
    ' - . 'Bei verwendung eines HTML-Editors, benutzen Sie "Source" anstatt "Design",
    ' - . 'wenn Sie Zeilenumbrüche unverändert übernehmen möchten (z. B. für plaintext E-Mail).', - 'D3_CONTENT_TABS_GENERAL_SAVE_IN' => 'Kopiere in Sprache', - 'D3_CONTENT_TABS_ARTICLE_MAIN_ACTIVE' => 'Aktiv', - 'D3_CONTENT_TABS_ARTICLE_MAIN_ACTIVE_HELP' => 'Beachten Sie bitte, dass der 1. Langtext nur inaktiv ' // - . 'gesetzt werden kann, sofern ein eigener Tab-Titel vergeben wird!', - // Installation - 'D3_CONTENT_TABS_MIGRATED_TABLE_FIELDS' => 'Das Modul bringt ab Version 4.0.0.0 eine eigene ' // - . 'Datenbanktabelle \'d3contenttabs\' mit.
    ' // - . 'In dieser werden zukünftig neue Tab-Inhalte abgelegt und ausgelesen.

    ' // - . 'In Ihrer Shopdatenbank wurden alte Felder (%s) mit Inhalt registriert. ' // - . 'Im Zuge des Updates werden Titel und/oder Content-Tab-Langtexte von %d ' // - . 'alten Feld/ern in die neue Tabelle \'d3contenttabs\' migriert.
    ' // - . 'Anschließend stehen Ihnen dann alle vorhandenen, bereits gepflegten Tab-Inhalte wieder zur Verfügung.

    ' // - . 'Die alten moduleigenenen Datenbankfelder (oxarticles__* und oxartextends__*) werden im Anschluss der ' // - . 'Datenmigration entfernt. Legen Sie bei Bedarf vor Ausführung dieses Schrittes ein Backup der beiden ' // - . 'Datenbanktabellen an!

    ' - . 'Beachten Sie bitte, dass die Migration abhängig vom Umfang der Daten einige Zeit in Anspruch nehmen kann.', - 'D3_CONTENT_TABS_DELETE_TABLE_FIELDS' => 'In diesem Instalationsschritt wird versucht, die in der ' // - . 'Shopdatenbank gefundenen alten Felder zu entfernen.

    ' - . 'Die SQL-Querys die dabei ausgeführt werden lauten wie folgt:
    ', -); + 'UTF-8', + // Navigation + 'd3mxContentTabs' => ' Content Tabs', + 'd3mxContentTabs_settings' => 'Tabverwaltung', + 'd3mxContentTabs_main' => 'Stamm', + // article-list-fields?! + 'GENERAL_ARTICLE_D3LONGDESCTITLE' => 'Titel 1 ContentTabs', + 'GENERAL_ARTICLE_D3LONGDESC2TITLE' => 'Titel 2 ContentTabs', + 'GENERAL_ARTICLE_D3LONGDESC3TITLE' => 'Titel 3 ContentTabs', + 'GENERAL_ARTICLE_D3LONGDESC4TITLE' => 'Titel 4 ContentTabs', + 'GENERAL_ARTICLE_D3LONGDESC5TITLE' => 'Titel 5 ContentTabs', + 'D3_ARTICLE_MAIN_TITLE_CONTENT_TAB_EDIT' => 'Langtexte des Artikels', + // Admin-Template + 'D3_CONTENT_TABS_FIRST_SELECT_ARTICLE' => 'Bitte erst einen Artikel aus der Liste zum Editieren auswählen.', + 'D3_CONTENT_TABS_TITEL' => 'Tab-Titel', + 'D3_CONTENT_TABS_ARTICLE_VARIANTSELECT' => 'Wechsel zu Variante (Art.-Nr. -- Auswahlname)', + 'D3_CONTENT_TABS_ARTICLE_PARENTARTICLE' => 'Elternartikel', + 'D3_CONTENT_TABS_ARTICLE_GENERAL_LANGUAGE' => 'In Sprache', + 'D3_CONTENT_TABS_ARTICLE_SELECTED_ARTICLE_TO_EDIT' => 'Aktuell editieren Sie den Artikel', + 'D3_CONTENT_TABS_FIELD' => 'Langtext', + 'D3_CONTENT_TABS_ARTICLE_EDITOR_PLAINTEXT_HINT' => 'Anmerkung:
    ' + . 'Bei verwendung eines HTML-Editors, benutzen Sie "Source" anstatt "Design",
    ' + . 'wenn Sie Zeilenumbrüche unverändert übernehmen möchten (z. B. für plaintext E-Mail).', + 'D3_CONTENT_TABS_GENERAL_SAVE_IN' => 'Kopiere in Sprache', + 'D3_CONTENT_TABS_ARTICLE_MAIN_ACTIVE' => 'Aktiv', + 'D3_CONTENT_TABS_ARTICLE_MAIN_ACTIVE_HELP' => 'Beachten Sie bitte, dass der 1. Langtext nur inaktiv ' // + . 'gesetzt werden kann, sofern ein eigener Tab-Titel vergeben wird!', + // Installation + 'D3_CONTENT_TABS_MIGRATED_TABLE_FIELDS' => 'Das Modul bringt ab Version 4.0.0.0 eine eigene ' // + . 'Datenbanktabelle \'d3contenttabs\' mit.
    ' // + . 'In dieser werden zukünftig neue Tab-Inhalte abgelegt und ausgelesen.

    ' // + . 'In Ihrer Shopdatenbank wurden alte Felder (%s) mit Inhalt registriert. ' // + . 'Im Zuge des Updates werden Titel und/oder Content-Tab-Langtexte von %d ' // + . 'alten Feld/ern in die neue Tabelle \'d3contenttabs\' migriert.
    ' // + . 'Anschließend stehen Ihnen dann alle vorhandenen, bereits gepflegten Tab-Inhalte wieder zur Verfügung.

    ' // + . 'Die alten moduleigenenen Datenbankfelder (oxarticles__* und oxartextends__*) werden im Anschluss der ' // + . 'Datenmigration entfernt. Legen Sie bei Bedarf vor Ausführung dieses Schrittes ein Backup der beiden ' // + . 'Datenbanktabellen an!

    ' + . 'Beachten Sie bitte, dass die Migration abhängig vom Umfang der Daten einige Zeit in Anspruch nehmen kann.', + 'D3_CONTENT_TABS_DELETE_TABLE_FIELDS' => 'In diesem Instalationsschritt wird versucht, die in der ' // + . 'Shopdatenbank gefundenen alten Felder zu entfernen.

    ' + . 'Die SQL-Querys die dabei ausgeführt werden lauten wie folgt:
    ', + 'D3_CONTENT_TABS_EXC_NOTFILLED_TITLE_CONTENT' => "Der Langtext kann nicht gespeichert werden, da dieser keinen Titel oder Inhalt hat.", +); diff --git a/src/Application/views/admin/tpl/contentTabList.tpl b/src/Application/views/admin/tpl/contentTabList.tpl index 12175c1..49beb80 100644 --- a/src/Application/views/admin/tpl/contentTabList.tpl +++ b/src/Application/views/admin/tpl/contentTabList.tpl @@ -1,170 +1,170 @@ -[{include file="headitem.tpl" title="GENERAL_ADMIN_TITLE"|oxmultilangassign box="list"}] -[{assign var="where" value=$oView->getListFilter()}] - -[{if $readonly}] - [{assign var="readonly" value="readonly disabled"}] -[{else}] - [{assign var="readonly" value=""}] -[{/if}] - -[{capture name="emptyCapture"}] - -[{/capture}] -[{oxscript add=$smarty.capture.d3JavaScriptReload}] - -
    - -
    - -[{include file="pagetabsnippet.tpl"}] - -[{capture name="emptyCapture"}] - -[{/capture}] -[{oxscript add=$smarty.capture.d3JavaScript}] - -[{include file="bottomitem.tpl"}] +[{include file="headitem.tpl" title="GENERAL_ADMIN_TITLE"|oxmultilangassign box="list"}] +[{assign var="where" value=$oView->getListFilter()}] + +[{if $readonly}] + [{assign var="readonly" value="readonly disabled"}] +[{else}] + [{assign var="readonly" value=""}] +[{/if}] + +[{capture name="emptyCapture"}] + +[{/capture}] +[{oxscript add=$smarty.capture.d3JavaScriptReload}] + +
    + +
    + +[{include file="pagetabsnippet.tpl"}] + +[{capture name="emptyCapture"}] + +[{/capture}] +[{oxscript add=$smarty.capture.d3JavaScript}] + +[{include file="bottomitem.tpl"}] diff --git a/src/Application/views/admin/tpl/contentTabs.tpl b/src/Application/views/admin/tpl/contentTabs.tpl index 17cbbe3..fb72c52 100644 --- a/src/Application/views/admin/tpl/contentTabs.tpl +++ b/src/Application/views/admin/tpl/contentTabs.tpl @@ -1,209 +1,209 @@ -[{include file="headitem.tpl" title="GENERAL_ADMIN_TITLE"|oxmultilangassign}] -[{capture name="emptyCapture"}] - -[{/capture}] -[{oxscript add=$smarty.capture.d3JavaScript}] - -[{if $readonly}] - [{assign var="readonly" value="readonly disabled"}] -[{else}] - [{assign var="readonly" value=""}] - [{assign var="canSaveLongtext" value=true}] -[{/if}] - -
    - [{$oViewConf->getHiddenSid()}] - - - - -
    - -[{d3modcfgcheck modid="d3contenttabs"}][{/d3modcfgcheck}] -[{if $mod_d3contenttabs}] - [{if $oxid == "-1"}] -
    - [{oxmultilang ident="D3_CONTENT_TABS_FIRST_SELECT_ARTICLE"}] -
    - [{else}] -
    -
    - [{$oViewConf->getHiddenSid()}] - - - - - - - - - [{if $canSaveLongtext}] - - [{/if}] -
    - - - - - - - - - - [{if $mylist}] - - - - - - - - [{/if}] - [{if $parentarticle}] - - - - - - - - [{/if}] - - - - - - - - - - - - - - - - -
    - [{oxmultilang ident="D3_CONTENT_TABS_ARTICLE_SELECTED_ARTICLE_TO_EDIT"}]: - - [{$edit->oxarticles__oxtitle->value}] - [{if $parentarticle}] - [{$parentarticle->oxarticles__oxtitle->value}] -- [{$edit->oxarticles__oxvarselect->value}] - [{/if}] - - ([{$edit->oxarticles__oxartnum->value}]) - - [{if !$posslang}] - [{oxmultilang ident="D3_CONTENT_TABS_ARTICLE_GENERAL_LANGUAGE"}] - [{foreach from=$languages item=lang}] - [{if $lang->selected}][{$lang->name}][{/if}] - [{/foreach}] - [{/if}] -

    - [{oxmultilang ident="D3_CONTENT_TABS_ARTICLE_VARIANTSELECT"}] - - -

    [{oxmultilang ident="D3_CONTENT_TABS_ARTICLE_PARENTARTICLE"}]: - - [{$parentarticle->oxarticles__oxtitle->value}] ([{$parentarticle->oxarticles__oxartnum->value}]) -

    -
    - - - [{oxmultilang ident="D3_CONTENT_TABS_ARTICLE_MAIN_ACTIVE"}] - [{oxinputhelp ident="D3_CONTENT_TABS_ARTICLE_MAIN_ACTIVE_HELP"}] -
    -
    - -
    -

    - [{oxmultilang ident="D3_CONTENT_TABS_TITEL"}]: - [{assign var='sLongDescTitleField' value=$oView->getLongDescTitleField()}] - - - [{if $posslang}] - [{block name="admin_tabs_language_edit"}] - [{foreach from=$posslang key=lang item=desc}] - [{if $editlanguage == $lang}] - -
    - -
    - [{/if}] - [{/foreach}] - [{/block}] - [{else}] -
    - -
    - [{/if}] -
    -
    - [{block name="admin_article_tabs_editor"}] - [{$editor}] - [{/block}] -
    -
    -
    - [{oxmultilang ident="D3_CONTENT_TABS_ARTICLE_EDITOR_PLAINTEXT_HINT"}] -
    -
    -
    - - [{/if}] -[{else}] -
    - [{oxmultilang ident="D3_CFG_MOD_NOTACTIVE"}] -
    -[{/if}] - -[{include file="d3_cfg_mod_inc.tpl"}] +[{include file="headitem.tpl" title="GENERAL_ADMIN_TITLE"|oxmultilangassign}] +[{capture name="emptyCapture"}] + +[{/capture}] +[{oxscript add=$smarty.capture.d3JavaScript}] + +[{if $readonly}] + [{assign var="readonly" value="readonly disabled"}] +[{else}] + [{assign var="readonly" value=""}] + [{assign var="canSaveLongtext" value=true}] +[{/if}] + +
    + [{$oViewConf->getHiddenSid()}] + + + + +
    + +[{d3modcfgcheck modid="d3contenttabs"}][{/d3modcfgcheck}] +[{if $mod_d3contenttabs}] + [{if $oxid == "-1"}] +
    + [{oxmultilang ident="D3_CONTENT_TABS_FIRST_SELECT_ARTICLE"}] +
    + [{else}] +
    +
    + [{$oViewConf->getHiddenSid()}] + + + + + + + + + [{if $canSaveLongtext}] + + [{/if}] +
    + + + + + + + + + + [{if $mylist}] + + + + + + + + [{/if}] + [{if $parentarticle}] + + + + + + + + [{/if}] + + + + + + + + + + + + + + + + +
    + [{oxmultilang ident="D3_CONTENT_TABS_ARTICLE_SELECTED_ARTICLE_TO_EDIT"}]: + + [{$edit->oxarticles__oxtitle->value}] + [{if $parentarticle}] + [{$parentarticle->oxarticles__oxtitle->value}] -- [{$edit->oxarticles__oxvarselect->value}] + [{/if}] + + ([{$edit->oxarticles__oxartnum->value}]) + + [{if !$posslang}] + [{oxmultilang ident="D3_CONTENT_TABS_ARTICLE_GENERAL_LANGUAGE"}] + [{foreach from=$languages item=lang}] + [{if $lang->selected}][{$lang->name}][{/if}] + [{/foreach}] + [{/if}] +

    + [{oxmultilang ident="D3_CONTENT_TABS_ARTICLE_VARIANTSELECT"}] + + +

    [{oxmultilang ident="D3_CONTENT_TABS_ARTICLE_PARENTARTICLE"}]: + + [{$parentarticle->oxarticles__oxtitle->value}] ([{$parentarticle->oxarticles__oxartnum->value}]) +

    +
    + + + [{oxmultilang ident="D3_CONTENT_TABS_ARTICLE_MAIN_ACTIVE"}] + [{oxinputhelp ident="D3_CONTENT_TABS_ARTICLE_MAIN_ACTIVE_HELP"}] +
    +
    + +
    +

    + [{oxmultilang ident="D3_CONTENT_TABS_TITEL"}]: + [{assign var='sLongDescTitleField' value=$oView->getLongDescTitleField()}] + + + [{if $posslang}] + [{block name="admin_tabs_language_edit"}] + [{foreach from=$posslang key=lang item=desc}] + [{if $editlanguage == $lang}] + +
    + +
    + [{/if}] + [{/foreach}] + [{/block}] + [{else}] +
    + +
    + [{/if}] +
    +
    + [{block name="admin_article_tabs_editor"}] + [{$editor}] + [{/block}] +
    +
    +
    + [{oxmultilang ident="D3_CONTENT_TABS_ARTICLE_EDITOR_PLAINTEXT_HINT"}] +
    +
    +
    + + [{/if}] +[{else}] +
    + [{oxmultilang ident="D3_CFG_MOD_NOTACTIVE"}] +
    +[{/if}] + +[{include file="d3_cfg_mod_inc.tpl"}] diff --git a/src/Application/views/admin/tpl/contentTabsBase.tpl b/src/Application/views/admin/tpl/contentTabsBase.tpl index 41a1c1e..bf6d830 100644 --- a/src/Application/views/admin/tpl/contentTabsBase.tpl +++ b/src/Application/views/admin/tpl/contentTabsBase.tpl @@ -1,13 +1,13 @@ - - - - - [{oxmultilang ident="GENERAL_ADMIN_TITLE"}] - - - - - - - - + + + + + [{oxmultilang ident="GENERAL_ADMIN_TITLE"}] + + + + + + + + diff --git a/src/Application/views/blocks/details_tabs_longdescription.tpl b/src/Application/views/blocks/details_tabs_longdescription.tpl index f40f1a4..24575dd 100644 --- a/src/Application/views/blocks/details_tabs_longdescription.tpl +++ b/src/Application/views/blocks/details_tabs_longdescription.tpl @@ -1,63 +1,63 @@ -[{d3modcfgcheck modid="d3contenttabs"}][{/d3modcfgcheck}] -[{if $mod_d3contenttabs}] - [{assign var='d3Tabs' value=$oView->d3GetTabs()}] - - [{if $d3Tabs}] - [{if $oModCfg_d3contenttabs->isThemeIdMappedTo('flow')}] - [{* FLOW *}] - [{foreach from=$d3Tabs item='tabData' name="tabs" key='current'}] - [{if 'inactive' == $tabData.TAB}] - - [{elseif $tabData.TAB != false}] - [{capture append="tabs"}] - - [{$tabData.TITLE}] - - [{/capture}] - [{capture append="tabsContent"}] -
    - [{if '1' == $tabData.TAB}] - [{include file='d3contenttabs_tab'|cat:$current|cat:'.tpl'}] - [{else}] - [{oxeval var=$tabData.CONTENT}] - [{/if}] -
    - [{/capture}] - [{assign var='blFirstTab' value=false}] - [{else}] - - [{$smarty.block.parent}] - [{/if}] - [{/foreach}] - [{else}] - [{* AZURE *}] - [{foreach from=$d3Tabs item='tabData' name="tabs" key='current'}] - [{if 'inactive' == $tabData.TAB}] - - [{elseif $tabData.TAB != false}] - [{capture append="tabs"}] - - [{$tabData.TITLE}] - - [{/capture}] - [{capture append="tabsContent"}] -
    - [{if '1' == $tabData.TAB}] - [{include file='d3contenttabs_tab'|cat:$current|cat:'.tpl'}] - [{else}] - [{oxeval var=$tabData.CONTENT}] - [{/if}] -
    - [{/capture}] - [{else}] - - [{$smarty.block.parent}] - [{/if}] - [{/foreach}] - [{/if}] - [{else}] - [{$smarty.block.parent}] - [{/if}] -[{else}] - [{$smarty.block.parent}] -[{/if}] +[{d3modcfgcheck modid="d3contenttabs"}][{/d3modcfgcheck}] +[{if $mod_d3contenttabs}] + [{assign var='d3Tabs' value=$oView->d3GetTabs()}] + + [{if $d3Tabs}] + [{if $oModCfg_d3contenttabs->isThemeIdMappedTo('flow')}] + [{* FLOW *}] + [{foreach from=$d3Tabs item='tabData' name="tabs" key='current'}] + [{if 'inactive' == $tabData.TAB}] + + [{elseif $tabData.TAB != false}] + [{capture append="tabs"}] + + [{$tabData.TITLE}] + + [{/capture}] + [{capture append="tabsContent"}] +
    + [{if '1' == $tabData.TAB}] + [{include file='d3contenttabs_tab'|cat:$current|cat:'.tpl'}] + [{else}] + [{oxeval var=$tabData.CONTENT}] + [{/if}] +
    + [{/capture}] + [{assign var='blFirstTab' value=false}] + [{else}] + + [{$smarty.block.parent}] + [{/if}] + [{/foreach}] + [{else}] + [{* AZURE *}] + [{foreach from=$d3Tabs item='tabData' name="tabs" key='current'}] + [{if 'inactive' == $tabData.TAB}] + + [{elseif $tabData.TAB != false}] + [{capture append="tabs"}] + + [{$tabData.TITLE}] + + [{/capture}] + [{capture append="tabsContent"}] +
    + [{if '1' == $tabData.TAB}] + [{include file='d3contenttabs_tab'|cat:$current|cat:'.tpl'}] + [{else}] + [{oxeval var=$tabData.CONTENT}] + [{/if}] +
    + [{/capture}] + [{else}] + + [{$smarty.block.parent}] + [{/if}] + [{/foreach}] + [{/if}] + [{else}] + [{$smarty.block.parent}] + [{/if}] +[{else}] + [{$smarty.block.parent}] +[{/if}] diff --git a/src/Application/views/tpl/d3contenttabs_tab1.tpl b/src/Application/views/tpl/d3contenttabs_tab1.tpl index 6ded2ab..d02fcca 100644 --- a/src/Application/views/tpl/d3contenttabs_tab1.tpl +++ b/src/Application/views/tpl/d3contenttabs_tab1.tpl @@ -1,12 +1,12 @@ -[{block name="d3_details_contenttabs_longdesc1"}] - [{oxeval var=$oDetailsProduct->getLongDescription()}] - [{if $oDetailsProduct->oxarticles__oxexturl->value}] - - [{if $oDetailsProduct->oxarticles__oxurldesc->value}] - [{$oDetailsProduct->oxarticles__oxurldesc->value}] - [{else}] - [{$oDetailsProduct->oxarticles__oxexturl->value}] - [{/if}] - - [{/if}] -[{/block}] +[{block name="d3_details_contenttabs_longdesc1"}] + [{oxeval var=$oDetailsProduct->getLongDescription()}] + [{if $oDetailsProduct->oxarticles__oxexturl->value}] + + [{if $oDetailsProduct->oxarticles__oxurldesc->value}] + [{$oDetailsProduct->oxarticles__oxurldesc->value}] + [{else}] + [{$oDetailsProduct->oxarticles__oxexturl->value}] + [{/if}] + + [{/if}] +[{/block}] diff --git a/src/IntelliSenseHelper.php b/src/IntelliSenseHelper.php index be23cf1..c87e1b7 100644 --- a/src/IntelliSenseHelper.php +++ b/src/IntelliSenseHelper.php @@ -1,11 +1,11 @@ -getProduct(); - - return oxNew(TabsModel::class, $oArticle)->getTabs(); - } -} + + * @link http://www.oxidmodule.com + */ + +namespace D3\Contenttabs\Modules\Application\Component\Widget; + +/** + * Class d3_oxwarticledetails_contenttabs + */ +use D3\Contenttabs\Application\Model\contentTabs as TabsModel; +use OxidEsales\Eshop\Application\Model\Article; + +class d3_oxwarticledetails_contenttabs extends d3_oxwarticledetails_contenttabs_parent +{ + + /** + * @return array|null + */ + public function d3GetTabs() + { + /** + * @var Article + */ + $oArticle = $this->getProduct(); + + return oxNew(TabsModel::class, $oArticle)->getTabs(); + } +} diff --git a/src/Modules/Application/Model/d3_oxarticle_longtexts.php b/src/Modules/Application/Model/d3_oxarticle_longtexts.php index 6092703..965d9aa 100644 --- a/src/Modules/Application/Model/d3_oxarticle_longtexts.php +++ b/src/Modules/Application/Model/d3_oxarticle_longtexts.php @@ -1,38 +1,53 @@ -getId(); - } - if (!$sOXID) { - return parent::delete($sOXID); - } - - oxNew(TabsModel::class, $this)->deleteAllLongtexts($sOXID); - - return parent::delete($sOXID); - } -} + + * @link http://www.oxidmodule.com + */ + +namespace D3\Contenttabs\Modules\Application\Model; + +use D3\Contenttabs\Application\Model\contentTabs as TabsModel; + +/** + * Article manager. + * Creates fully detailed article object, with such information as VAT, + * discounts, etc. + * + */ +class d3_oxarticle_longtexts extends d3_oxarticle_longtexts_parent +{ + /** + * Deletes record and other information related to this article such as images from DB, + * also removes variants. Returns true if entry was deleted. + * + * @param string $sOXID Article id + * + * @throws \Exception + * + * @return bool + */ + public function delete($sOXID = null) + { + if (!$sOXID) { + $sOXID = $this->getId(); + } + if (!$sOXID) { + return parent::delete($sOXID); + } + + oxNew(TabsModel::class, $this)->deleteAllLongtexts($sOXID); + + return parent::delete($sOXID); + } +} diff --git a/src/Setup/setupWizard.php b/src/Setup/setupWizard.php index 47b1f62..fb7799d 100644 --- a/src/Setup/setupWizard.php +++ b/src/Setup/setupWizard.php @@ -1,850 +1,850 @@ - - * @link http://www.oxidmodule.com - */ - -namespace D3\Contenttabs\Setup; - -use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception; -use D3\ModCfg\Application\Model\Exception\d3ParameterNotFoundException; -use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException; -use D3\ModCfg\Application\Model\Install\d3install_updatebase; -use D3\ModCfg\Application\Model\d3database; -use Doctrine\DBAL\DBALException; -use OxidEsales\Eshop\Core\DatabaseProvider; -use OxidEsales\Eshop\Core\Exception\ConnectionException; -use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException; -use OxidEsales\Eshop\Core\Exception\DatabaseErrorException; -use OxidEsales\Eshop\Core\Exception\StandardException; -use OxidEsales\Eshop\Core\Registry; -use OxidEsales\Eshop\Core\Exception\DatabaseException; - - -/** - * Class setupWizard - */ -class setupWizard extends d3install_updatebase -{ - public $sModKey = 'd3contenttabs'; - public $sModName = 'Content Tabs'; - public $sModVersion = '4.0.0.1'; - public $sModRevision = '4001'; - public $sBaseConf = '-------------------------------------------------------------------------------- -w22v2==SlpiL0xNUTM1Y0JiN2hzNmZjYzJ2THRmcXJNS0pQaEFaWkdwTFdOMEROS1ZIVU90a09VUDVMN -jF6bVBzMXpJRFpLeStFUUdnQmpwTkpjQ0tLVHczMHhFSVNSbzVPcElnZ3VxN0RJNk03enYvUStueHlhe -nFoSVVuRWloK1BIU3lldy9JTWZxM2N5Z3JlN2Yyc1A5a0gwczVSb01QSjlVZEtyamFyaHBCTkVOSTE1e -GcrZDJIajNheFIvbVU4Y3Y1QTYzdm5ObjRObElsd2hzS0lzeWV6YWQrc0hseU9YMDM3N1RkWFQ5M3pKN -E1mWUM2YzRtVVdyY1RFU0xHbEFLTkE5OWxwY0xhZ3hPT3BybkpsamYySmJDZVh2L1BFSEh2Q040QmVZY -TloSDFuWFE1blZGbUpWYmJHbjArZWY5RGZhRmwrUGpuYVREb1VwYzRkQkJqUW53PT0= ---------------------------------------------------------------------------------'; - public $sRequirements = ''; - public $sBaseValue = ''; - public $sMinModCfgVersion = '5.1.0.0'; /* minimale Modul-Connector Version */ - - protected $_aUpdateMethods = array( - array( // Moduleintrag anlegen, wenn noch nicht vorhanden - 'check' => 'checkModCfgItemExist', - 'do' => 'updateModCfgItemExist' - ), - array( // alte Datenbankfelder, sofern vorhanden, korrekt (um)benennen - 'check' => 'checkRenameFields', - 'do' => 'fixRenameFields' - ), - array( // #5886 eigene Datenbanktabelle, legt diese an, wenn noch nicht vorhanden - 'check' => 'existContentTabTable', - 'do' => 'addContentTabTable' - ), - array( // #5886 übernahme der Daten von oxarticles/oxartextends in die eigene Tabelle - 'check' => 'needToMigrateArticleDataToContenttabsTable', - 'do' => 'migrateArticleDataToContenttabsTable' - ), - array( // #5886 alte DB-Felder nach erfolgreicher Übernahme der Daten aus oxarticles/oxartextends entfernen - 'check' => 'needToDeleteOldContentTabDatabaseFields', - 'do' => 'deleteOldContentTabDatabaseFields' - ), - array( // Datenbankfelder korrigieren, sofern notwendig - 'check' => 'checkFields', - 'do' => 'fixFields' - ), - array( // alte oxconfig-Einträge vorhanden? - 'check' => 'hasOldModuleItems', - 'do' => 'deleteOldModuleItems' - ), - array( // auf gültige Modul-Dateien prüfen - see metadata.php d3FileRegister - 'check' => 'hasUnregisteredFiles', - 'do' => 'showUnregisteredFiles' - ), - array( // viewusage - 'check' => 'hasContentTabViewTables', - 'do' => 'registerContentTabViewTables' - ), - array( // viewusage - 'check' => 'needToRegisterContentTabViewTable', - 'do' => 'registerContentTabViewTable' - ), - array( // Moduleintrag aktualisieren - 'check' => 'checkModCfgSameRevision', - 'do' => 'updateModCfgSameRevision' - ), - ); - - public $aMultiLangTables = array('d3contenttabs'); - - public $aFields = array( - 'OXID' => array( - 'sTableName' => 'd3contenttabs', - 'sFieldName' => 'OXID', - 'sType' => 'char(32)', - 'blNull' => false, - 'sDefault' => '', - 'sComment' => 'D3 ContentTabs', - 'sExtra' => '', - 'blMultilang' => false, - 'blAddBreak' => false, - ), - 'ARTICLEOXID' => array( - 'sTableName' => 'd3contenttabs', - 'sFieldName' => 'ARTICLEOXID', - 'sType' => 'char(32)', - 'blNull' => false, - 'sDefault' => '', - 'sComment' => 'article assignment', - 'sExtra' => '', - 'blMultilang' => false, - 'blAddBreak' => false, - ), - 'OXACTIVE' => array( - 'sTableName' => 'd3contenttabs', - 'sFieldName' => 'OXACTIVE', - 'sType' => 'TINYINT(1)', - 'blNull' => false, - 'sDefault' => '0', - 'sComment' => 'active flag', - 'sExtra' => '', - 'blMultilang' => false, - 'blAddBreak' => false, - ), - 'TABIDENT' => array( - 'sTableName' => 'd3contenttabs', - 'sFieldName' => 'TABIDENT', // Tab 2 , Tab 3, Tab 4, etc. - 'sType' => 'TINYINT(1) UNSIGNED', // 0 - 255 - 'blNull' => false, - 'sDefault' => '0', - 'sComment' => 'tabident', - 'sExtra' => '', - 'blMultilang' => false, - 'blAddBreak' => false, - ), - 'TABTITLE' => array( - 'sTableName' => 'd3contenttabs', - 'sFieldName' => 'TABTITLE', - 'sType' => 'varchar(255)', - 'blNull' => false, - 'sDefault' => '', - 'sComment' => 'title for tabs', - 'sExtra' => '', - 'blMultilang' => true, - 'blAddBreak' => false, - ), - 'TABCONTENT' => array( - 'sTableName' => 'd3contenttabs', - 'sFieldName' => 'TABCONTENT', - 'sType' => 'TEXT', - 'blNull' => false, - 'sDefault' => '', - 'sComment' => 'D3 ContentTab content', - 'sExtra' => '', - 'blMultilang' => true, - 'blAddBreak' => false, - ), - 'TIMESTAMP' => array( - 'sTableName' => 'd3contenttabs', - 'sFieldName' => 'OXTIMESTAMP', - 'sType' => 'TIMESTAMP', - 'blNull' => false, - 'sDefault' => 'CURRENT_TIMESTAMP', - 'sComment' => 'last change', - 'sExtra' => '', - 'blMultilang' => false, - ), - ); - - public $aIndizes = array( - 'PRIMARY' => array( - 'sTableName' => 'd3contenttabs', - 'sType' => d3database::INDEX_TYPE_PRIMARY, - 'aFields' => array( - 'OXID' => 'OXID', - ), - 'blMultilang' => false, - ), - 'D3ARTICLETAB' => array( - 'sTableName' => 'd3contenttabs', - 'sType' => d3database::INDEX_TYPE_UNIQUE, - 'sName' => 'D3ARTICLETAB', - 'aFields' => array( - 'ARTICLEOXID' => 'ARTICLEOXID', - 'TABIDENT' => 'TABIDENT', - ), - 'blMultilang' => false, - ), - 'OXACTIVE' => array( - 'sTableName' => 'd3contenttabs', - 'sType' => d3database::INDEX_TYPE_INDEX, - 'sName' => 'OXACTIVE', - 'aFields' => array( - 'OXACTIVE' => 'OXACTIVE', - ), - 'blMultilang' => false, - ), - ); - - // before oxid 6 > removed in oxid 6 - public $aOldTabDbFields = array( - 'D3LONGDESC2' => array( - 'sTableName' => 'oxartextends', - 'sFieldName' => 'D3LONGDESC2', //oxlongdesc2 -> OXLONGDESC2 -> D3LONGDESC2 (Type: TEXT) - 'sType' => 'TEXT', - 'blNull' => false, - 'sDefault' => false, - 'sComment' => 'D3 ContentTabs', - 'sExtra' => '', - 'blMultilang' => true, - 'blAddBreak' => true, - ), - 'D3LONGDESC3' => array( - 'sTableName' => 'oxartextends', - 'sFieldName' => 'D3LONGDESC3', // oxlongdesc3 -> OXLONGDESC3 -> D3LONGDESC3 - 'sType' => 'TEXT', - 'blNull' => false, - 'sDefault' => false, - 'sComment' => 'D3 ContentTabs', - 'sExtra' => '', - 'blMultilang' => true, - 'blAddBreak' => true, - ), - 'D3LONGDESC4' => array( - 'sTableName' => 'oxartextends', - 'sFieldName' => 'D3LONGDESC4', // oxlongdesc4 -> OXLONGDESC4 -> D3LONGDESC4 - 'sType' => 'TEXT', - 'blNull' => false, - 'sDefault' => false, - 'sComment' => 'D3 ContentTabs', - 'sExtra' => '', - 'blMultilang' => true, - 'blAddBreak' => true, - ), - 'D3LONGDESC5' => array( - 'sTableName' => 'oxartextends', - 'sFieldName' => 'D3LONGDESC5', // oxlongdesc5 -> OXLONGDESC5 -> D3LONGDESC5 - 'sType' => 'TEXT', - 'blNull' => false, - 'sDefault' => false, - 'sComment' => 'D3 ContentTabs', - 'sExtra' => '', - 'blMultilang' => true, - 'blAddBreak' => true, - ), - 'D3LONGDESCTITLE' => array( - 'sTableName' => 'oxarticles', - 'sFieldName' => 'D3LONGDESCTITLE', // OXLONGDESCTITLE -> D3LONGDESCTITLE - 'sType' => 'varchar(255)', - 'blNull' => false, - 'sDefault' => false, - 'sComment' => 'D3 ContentTabs', - 'sExtra' => '', - 'blMultilang' => true, - 'blAddBreak' => true, - ), - 'D3LONGDESC2TITLE' => array( - 'sTableName' => 'oxarticles', - 'sFieldName' => 'D3LONGDESC2TITLE', // oxlongdesc2title -> OXLONGDESC2TITLE -> D3LONGDESC2TITLE - 'sType' => 'varchar(255)', - 'blNull' => false, - 'sDefault' => false, - 'sComment' => 'D3 ContentTabs', - 'sExtra' => '', - 'blMultilang' => true, - 'blAddBreak' => true, - ), - 'D3LONGDESC3TITLE' => array( - 'sTableName' => 'oxarticles', - 'sFieldName' => 'D3LONGDESC3TITLE', // oxlongdesc3title -> OXLONGDESC3TITLE -> D3LONGDESC3TITLE - 'sType' => 'varchar(255)', - 'blNull' => false, - 'sDefault' => false, - 'sComment' => 'D3 ContentTabs', - 'sExtra' => '', - 'blMultilang' => true, - 'blAddBreak' => true, - ), - 'D3LONGDESC4TITLE' => array( - 'sTableName' => 'oxarticles', - 'sFieldName' => 'D3LONGDESC4TITLE', // oxlongdesc4title -> OXLONGDESC4TITLE -> D3LONGDESC4TITLE - 'sType' => 'varchar(255)', - 'blNull' => false, - 'sDefault' => false, - 'sComment' => 'D3 ContentTabs', - 'sExtra' => '', - 'blMultilang' => true, - 'blAddBreak' => true, - ), - 'D3LONGDESC5TITLE' => array( - 'sTableName' => 'oxarticles', - 'sFieldName' => 'D3LONGDESC5TITLE', // oxlongdesc5title -> OXLONGDESC5TITLE -> D3LONGDESC5TITLE - 'sType' => 'varchar(255)', - 'blNull' => false, - 'sDefault' => false, - 'sComment' => 'D3 ContentTabs', - 'sExtra' => '', - 'blMultilang' => true, - 'blAddBreak' => true, - ), - ); - - // before oxid 6, but we have to rename these fields afterward > f.e. shop/module-updates - public $aRenameFields = array( - 'D3LONGDESC2' => array( - 'sTableName' => 'oxartextends', - 'mOldFieldNames' => array('oxlongdesc2', 'OXLONGDESC2'), - 'sFieldName' => 'D3LONGDESC2', //oxlongdesc2 -> OXLONGDESC2 -> D3LONGDESC2 - 'blMultilang' => true, - 'blAddBreak' => true, - ), - 'D3LONGDESC3' => array( - 'sTableName' => 'oxartextends', - 'mOldFieldNames' => array('oxlongdesc3', 'OXLONGDESC3'), - 'sFieldName' => 'D3LONGDESC3', // oxlongdesc3 -> OXLONGDESC3 -> D3LONGDESC3 - 'blMultilang' => true, - 'blAddBreak' => true, - ), - 'D3LONGDESC4' => array( - 'sTableName' => 'oxartextends', - 'mOldFieldNames' => array('oxlongdesc4', 'OXLONGDESC4'), - 'sFieldName' => 'D3LONGDESC4', // oxlongdesc4 -> OXLONGDESC4 -> D3LONGDESC4 - 'blMultilang' => true, - 'blAddBreak' => true, - ), - 'D3LONGDESC5' => array( - 'sTableName' => 'oxartextends', - 'mOldFieldNames' => array('oxlongdesc5', 'OXLONGDESC5'), - 'sFieldName' => 'D3LONGDESC5', // oxlongdesc5 -> OXLONGDESC5 -> D3LONGDESC5 - 'blMultilang' => true, - 'blAddBreak' => true, - ), - 'D3LONGDESCTITLE' => array( - 'sTableName' => 'oxarticles', - 'mOldFieldNames' => 'OXLONGDESCTITLE', - 'sFieldName' => 'D3LONGDESCTITLE', // OXLONGDESCTITLE -> D3LONGDESCTITLE - 'blMultilang' => true, - 'blAddBreak' => true, - ), - 'D3LONGDESC2TITLE' => array( - 'sTableName' => 'oxarticles', - 'mOldFieldNames' => array('oxlongdesc2title', 'OXLONGDESC2TITLE'), - 'sFieldName' => 'D3LONGDESC2TITLE', // oxlongdesc2title -> OXLONGDESC2TITLE -> D3LONGDESC2TITLE - 'blMultilang' => true, - 'blAddBreak' => true, - ), - 'D3LONGDESC3TITLE' => array( - 'sTableName' => 'oxarticles', - 'mOldFieldNames' => array('oxlongdesc3title', 'OXLONGDESC3TITLE'), - 'sFieldName' => 'D3LONGDESC3TITLE', // oxlongdesc3title -> OXLONGDESC3TITLE -> D3LONGDESC3TITLE - 'blMultilang' => true, - 'blAddBreak' => true, - ), - 'D3LONGDESC4TITLE' => array( - 'sTableName' => 'oxarticles', - 'mOldFieldNames' => array('oxlongdesc4title', 'OXLONGDESC4TITLE'), - 'sFieldName' => 'D3LONGDESC4TITLE', // oxlongdesc4title -> OXLONGDESC4TITLE -> D3LONGDESC4TITLE - 'blMultilang' => true, - 'blAddBreak' => true, - ), - 'D3LONGDESC5TITLE' => array( - 'sTableName' => 'oxarticles', - 'mOldFieldNames' => array('oxlongdesc5title', 'OXLONGDESC5TITLE'), - 'sFieldName' => 'D3LONGDESC5TITLE', // oxlongdesc5title -> OXLONGDESC5TITLE -> D3LONGDESC5TITLE - 'blMultilang' => true, - 'blAddBreak' => true, - ), - ); - - protected $_aRefreshMetaModuleIds = array('d3contenttabs'); - - public $aOldModuleFiles = array(); - - protected $aDeleteOldContenTabDbField = array(); - - protected $aMigrateContents = array(); - - /******************************************************************************************************************/ - /*** eigene Tabelle für Content-Tabs anlegen / Prüfen und Daten migrieren *****************************************/ - /******************************************************************************************************************/ - /** - * @return bool - * @throws DatabaseConnectionException - */ - public function needToDeleteOldContentTabDatabaseFields() - { - // we have to delete all old fields! : $this->aOldTabDbFields - foreach ($this->aOldTabDbFields as $key => $aOldDbfield) { - // mehrsprachigkeit erforderlich? - if ($aOldDbfield['blMultilang']) { - // je sprache ist ein subfeld zu prüfen - for ($i = 0; count(Registry::getLang()->getLanguageArray()) > $i; $i++) { - // felder je sprache - $sAddfield = ''; - if ($i > 0) { - $sAddfield = '_' . $i; - } - - // check if field exist an has no content - $sKey = $aOldDbfield['sTableName'] . '__' . $aOldDbfield['sFieldName'] . $sAddfield; - $mReturn = $this->existOldTabDatabaseFieldSql($sKey, false); - - if (false === $mReturn) { - // skip field, we dont need to check this twice it does not exist! - continue; - } - - if (is_string($mReturn)) { - // Feld existiert - $mReturn = $this->existOldTabDatabaseFieldSql($sKey, true); - - if (false === $mReturn) { - // skip field, we dont need to check this twice its empty - $this->aDeleteOldContenTabDbField[$sKey] = array( - 'sTableName' => $aOldDbfield['sTableName'], - 'sOriginalFieldName' => $aOldDbfield['sFieldName'], - 'sFieldName' => $aOldDbfield['sFieldName'] . $sAddfield - ); - continue; - } - } - } - } else { - // check if field exist and has content - $sKey = $aOldDbfield['sTableName'] . '__' . $aOldDbfield['sFieldName']; - $mReturn = $this->existOldTabDatabaseFieldSql($sKey, false); - - if (false === $mReturn) { - // skip field, we dont need to check this twice it does not exist! - continue; - } - - if (is_string($mReturn)) { - // Feld existiert - $mReturn = $this->existOldTabDatabaseFieldSql($sKey, true); - - if (false === $mReturn) { - // skip field, we dont need to check this twice its empty - $this->aDeleteOldContenTabDbField[$sKey] = array( - 'sTableName' => $aOldDbfield['sTableName'], - 'sOriginalFieldName' => $aOldDbfield['sFieldName'], - 'sFieldName' => $aOldDbfield['sFieldName'] - ); - continue; - } - } - } - } - - if (count($this->aDeleteOldContenTabDbField) > 0) { - - return true; - } - - return false; - } - - /** - * @return bool - * @throws DatabaseConnectionException - */ - public function deleteOldContentTabDatabaseFields() - { - // show message, migrate?! - $sTranslation = Registry::getLang()->translateString('D3_CONTENT_TABS_DELETE_TABLE_FIELDS'); - foreach ($this->aDeleteOldContenTabDbField as $sKey => $item) { - $sTranslation .= "ALTER TABLE " . $item['sTableName'] . " DROP COLUMN " . $item['sFieldName'] . ";" . PHP_EOL; - } - - if ($this->hasExecute()) { - $oDb = DatabaseProvider::getDb(); - foreach ($this->aDeleteOldContenTabDbField as $sKey => $item) { - - try { - // field exist if no Exception occurs - $oDb->execute("ALTER TABLE " . $item['sTableName'] . " DROP COLUMN " . $item['sFieldName']); - - } catch (DatabaseException $oEx) { - // $oEx->getCode() : 1054 - // $oEx->getMessage() : 'Unknown column 'D3LONGDESCTEST_1' in 'field list'' - } - } - } - - return $this->_confirmMessage($sTranslation); - } - - /** - * @return bool - * @throws DatabaseConnectionException - */ - public function needToMigrateArticleDataToContenttabsTable() - { - // Prüfung existieren die alten Felder noch und sind diese gefüllt? - $blFieldsExist = false; - foreach ($this->aOldTabDbFields as $aOldDbfield) { - if ($aOldDbfield['blMultilang']) { - // mehrsprachigkeit erforderlich? wenn ja, je sprache ein subfeld - for ($i = 0; count(Registry::getLang()->getLanguageArray()) > $i; $i++) { - // felder je sprache - $sAddfield = ''; - if ($i > 0) { - $sAddfield = '_' . $i; - } - - $sKey = $aOldDbfield['sTableName'] . '__' . $aOldDbfield['sFieldName'] . $sAddfield; - // only check if field exist - $mReturn = $this->existOldTabDatabaseFieldSql($sKey); - if (false === $mReturn) { - // skip field, we dont need to check this fields twice it does not exist! - continue; - } - - // check for has content - $mReturn = $this->existOldTabDatabaseFieldSql($sKey, true); - if (false === $mReturn) { - // skip field, we dont need to check this fields twice it doesn't have any content - continue; - } - - $this->aMigrateContents[$sKey] = array( - 'sTableName' => $aOldDbfield['sTableName'], - 'sOriginalFieldName' => $aOldDbfield['sFieldName'], - 'sFieldName' => $aOldDbfield['sFieldName'] . $sAddfield - ); - $blFieldsExist = true; - } - } else { - $sKey = $aOldDbfield['sTableName'] . '__' . $aOldDbfield['sFieldName']; - - // only check if field exist - $mReturn = $this->existOldTabDatabaseFieldSql($sKey); - if (false === $mReturn) { - // skip field, we dont need to check this fields twice it does not exist! - continue; - } - - // check for has content - $mReturn = $this->existOldTabDatabaseFieldSql($sKey, true); - if (false === $mReturn) { - // skip field, we dont need to check this fields twice it doesn't have any content - continue; - } - - $this->aMigrateContents[$sKey] = array( - 'sTableName' => $aOldDbfield['sTableName'], - 'sOriginalFieldName' => $aOldDbfield['sFieldName'], - 'sFieldName' => $aOldDbfield['sFieldName'], - ); - $blFieldsExist = true; - } - } - - return $blFieldsExist; - } - - /** - * @param string $sKey - * @param bool $blNotEmpty - * - * @return false|string - * @throws DatabaseConnectionException - */ - public function existOldTabDatabaseFieldSql($sKey, $blNotEmpty = false) - { - $aKey = explode('__', $sKey); - if (false == is_array($aKey) && 2 != count($aKey)) { - return false; - } - - $oDb = DatabaseProvider::getDb(DatabaseProvider::FETCH_MODE_ASSOC); - $sSelect = " SELECT " . $aKey[1] . " FROM " . $aKey[0]; - if ($blNotEmpty) { - $sSelect .= " WHERE " . $aKey[1] . " != '' "; - } - $sSelect .= " LIMIT 1"; - - try { - // field exist if no Exception occurs, return content of the selected field - return $oDb->getOne($sSelect); - - } catch (DatabaseException $oEx) { - // $oEx->getCode() : 1054 - // $oEx->getMessage() : 'Unknown column 'D3LONGDESCTEST_1' in 'field list'' - - return false; - } - } - - /** - * @return bool - * @throws DatabaseConnectionException - * @throws DatabaseErrorException - */ - public function migrateArticleDataToContenttabsTable() - { - if (false == is_array($this->aMigrateContents) && empty($this->aMigrateContents)) { - return false; - } - - $sTableFielNames = ''; - foreach ($this->aMigrateContents as $aOldContent) { - $sTableFielNames .= $aOldContent['sTableName'] . '__' . $aOldContent['sFieldName'] . ', '; - } - $sTableFielNames = substr(strtolower($sTableFielNames), 0, strlen($sTableFielNames) - 2); - - // show message, migrate?! - $aArgs = array('dbfieldnames' => $sTableFielNames, 'count' => count($this->aMigrateContents)); - $sTranslation = Registry::getLang()->translateString('D3_CONTENT_TABS_MIGRATED_TABLE_FIELDS'); - $sTranslation = sprintf($sTranslation, $aArgs['dbfieldnames'], $aArgs['count']); - $blRet = $this->_confirmMessage($sTranslation); - - if ($this->hasExecute()) { - // NOTE standard-langtext-inhalt bleibt in oxarticles! - // auch wenn es einen Titel dazu gibt - // der Langtext wird weiterhin in oxarticles abgelegt/abgeholt!!! - // andernfalls käme es mit inaktivem Modul zu .... - - // ----> transfer data to new table - $oDb = DatabaseProvider::getDb(DatabaseProvider::FETCH_MODE_ASSOC); - foreach ($this->aMigrateContents as $sKey => $aOldContent) { - // map: - // d3contenttabs__OXID > wird vom Shop generiert - // d3contenttabs__ARTICLEOXID > oxarticles__OXID bzw. oxartextends__OXID - // d3contenttabs__OXACTIVE > 1 bei einer übernahme - // - // d3contenttabs__TABIDENT > wird spannend ... > Tab 2 , Tab 3, Tab 4, etc. - // anhand von: - // ----------- - // d3contenttabs__TABTITLE > oxarticles__D3LONGDESCTITLE - // D3LONGDESC2TITLE - // D3LONGDESC3TITLE - // D3LONGDESC4TITLE - // D3LONGDESC5TITLE - // - // d3contenttabs__TABCONTENT > oxartextends__D3LONGDESC2 - // D3LONGDESC3 - // D3LONGDESC4 - // D3LONGDESC5 - // - // d3contenttabs__OXTIMESTAMP > CURRENT_TIMESTAMP - $sSelect = "SELECT oxid as 'oxid', " . $aOldContent['sFieldName'] . " as 'content', oxtimestamp as 'time' " - . " FROM " . $aOldContent['sTableName'] - . " WHERE " . $aOldContent['sFieldName'] . " != ''"; - - $result = $oDb->getAll($sSelect); - if (count($result) > 0) { - // we got min one result - for ($i = 0; $i < count($result); $i++) { - // var_dump($result[$i]['oxid'], $result[$i]['content'], $result[$i]['time']); - if (strpos(strtolower($aOldContent['sOriginalFieldName']), "title") !== false) { - // es geht um den Titel - $newFieldName = 'TABTITLE'; - } else { - // es geht um den Langtext - $newFieldName = 'TABCONTENT'; - } - - // mehrsprachigkeit - if ($aOldContent['sOriginalFieldName'] != $aOldContent['sFieldName']) { - $newFieldName .= substr($aOldContent['sFieldName'], -2); - } - - // besteht aus zwei schritten, 1. daten in die neue Tabelle rumnehmen - $sMigrate1 = " INSERT INTO d3contenttabs (`OXID`, `ARTICLEOXID`, `OXACTIVE`, `TABIDENT`, `" . $newFieldName . "`, `OXTIMESTAMP`) VALUES " - . " (" // - . "'" . Registry::getUtilsObject()->generateUid() . "'," // - . "'" . $result[$i]['oxid'] . "'," // - . "'1'," // - . "'" . $this->getContentTabId($aOldContent['sOriginalFieldName']) . "'," // - . "'" . $result[$i]['content'] . "'," // TABTITLE or TABCONTENT - . "'" . $result[$i]['time'] . "'" // - . ") " // - . " ON DUPLICATE KEY UPDATE " // - . $newFieldName . " = '" . $result[$i]['content'] . "'"; - - - // inhalt aus altem feld entfernen... - $sMigrate2 = " UPDATE " . $aOldContent['sTableName'] // - . " SET " . $aOldContent['sFieldName'] . " = '' " // - . " WHERE oxid = '" . $result[$i]['oxid'] . "' "; - - try { - // field exist if no Exception occurs, return content of the selected field - $blMigrated = $oDb->execute($sMigrate1); - $blUpdated = $oDb->execute($sMigrate2); - - if ($blUpdated && $blMigrated) { - $this->setActionLog('SQL', $sMigrate1, __METHOD__); - $this->setActionLog('SQL', $sMigrate2, __METHOD__); - $this->setUpdateBreak(false); - } - - } catch (DatabaseException $oEx) { - // $oEx->getCode() : 1054 - // $oEx->getMessage() : 'Unknown column 'D3LONGDESCTEST_1' in 'field list'' - // do nothing, cause we like to finish the remaining data! - } - } - } - } - } - - return $blRet; - } - - public function getContentTabId($sFieldName) - { - switch (strtolower($sFieldName)) { - case 'd3longdesctitle': - return 1; - case 'd3longdesc2title': - case 'd3longdesc2': - return 2; - case 'd3longdesc3title': - case 'd3longdesc3': - return 3; - case 'd3longdesc4title': - case 'd3longdesc4': - return 4; - case 'd3longdesc5title': - case 'd3longdesc5': - return 5; - } - - return 0; // unknown field... - } - - /** - * @return bool true, if table is missing - * @return bool - * @throws DatabaseConnectionException - * @throws DatabaseErrorException - * @throws DBALException - */ - public function existContentTabTable() - { - return $this->_checkTableNotExist('d3contenttabs'); - } - - /** - * @return bool - * @throws DBALException - * @throws DatabaseConnectionException - * @throws DatabaseErrorException - * @throws ConnectionException - */ - public function addContentTabTable() - { - $this->setInitialExecMethod(__METHOD__); - $blRet = $this->_addTable2( - 'd3contenttabs', - $this->aFields, - $this->aIndizes, - 'tab configuration', - 'InnoDB' - ); - - return $blRet; - } - - /**********************************************************************/ - /*** Datei Verzeichniskontrolle ***************************************/ - /**********************************************************************/ - /** - * @return bool - * @throws DBALException - * @throws DatabaseConnectionException - * @throws DatabaseErrorException - * @throws d3ParameterNotFoundException - * @throws d3ShopCompatibilityAdapterException - * @throws d3_cfg_mod_exception - * @throws StandardException - */ - public function hasUnregisteredFiles() - { - return $this->_hasUnregisteredFiles($this->sModKey, array('blocks', 'd3FileRegister')); - } - - /** - * @return bool - * @throws DBALException - * @throws DatabaseConnectionException - * @throws DatabaseErrorException - * @throws StandardException - * @throws d3ShopCompatibilityAdapterException - * @throws d3_cfg_mod_exception - */ - public function showUnregisteredFiles() - { - return $this->_showUnregisteredFiles($this->sModKey, array('blocks', 'd3FileRegister')); - } - - - /** - * @return bool - * @throws ConnectionException - */ - public function hasContentTabViewTables() - { - return $this->checkMultiLangTables('d3contenttabs'); - } - - /** - * @return bool - * @throws ConnectionException - * @throws DBALException - * @throws DatabaseConnectionException - * @throws DatabaseErrorException - */ - public function registerContentTabViewTables() - { - return $this->fixRegisterMultiLangTables('d3contenttabs'); - - } - - /** - * @return bool - * @throws DBALException - * @throws DatabaseConnectionException - * @throws DatabaseErrorException - */ - public function needToRegisterContentTabViewTable() - { - return $this->checkConvertToMultiLangTable('d3contenttabs'); - } - - /** - * @return bool - * @throws ConnectionException - * @throws DBALException - * @throws DatabaseConnectionException - * @throws DatabaseErrorException - */ - public function registerContentTabViewTable() - { - return $this->convertToMultilangTable('d3contenttabs'); - } -} + + * @link http://www.oxidmodule.com + */ + +namespace D3\Contenttabs\Setup; + +use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception; +use D3\ModCfg\Application\Model\Exception\d3ParameterNotFoundException; +use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException; +use D3\ModCfg\Application\Model\Install\d3install_updatebase; +use D3\ModCfg\Application\Model\d3database; +use Doctrine\DBAL\DBALException; +use OxidEsales\Eshop\Core\DatabaseProvider; +use OxidEsales\Eshop\Core\Exception\ConnectionException; +use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException; +use OxidEsales\Eshop\Core\Exception\DatabaseErrorException; +use OxidEsales\Eshop\Core\Exception\StandardException; +use OxidEsales\Eshop\Core\Registry; +use OxidEsales\Eshop\Core\Exception\DatabaseException; + + +/** + * Class setupWizard + */ +class setupWizard extends d3install_updatebase +{ + public $sModKey = 'd3contenttabs'; + public $sModName = 'Content Tabs'; + public $sModVersion = '4.0.0.2'; + public $sModRevision = '4002'; + public $sBaseConf = '-------------------------------------------------------------------------------- +sbVv2==eEZoekY3ZnZxMm5yY0c4bm41dCtTMnRHNjdxMGUrMk9ua3lOa0tFL3hkTUlESG5WdGhhN05ia +Gw0ZHAvanU5a1daNFZESlNTaUdtMlJVOCtndnlRYmViSUorTGV3ZG9Ma1YzOThqem9FOTIwTVpFYXZwU +WlnTVVnMlUwMXB3NHVEYldrd2FrdjdrTVY3dFl1amdsZVlwYm5yY3NSODJTV3pDamdZb1JORk9vclN1R +nh3aWpyUWplL0JsTFNYdkVvL3RvS3dITEljR1dtRVpTK1BTR1RjOExnNzRMSU1Uc3ZQZUhhOHM5MEFUT +0dSUmJOSWVUTFRzNTEyZ0VBRFpheDljeGpLdUIwSVdvbU5pM0Z1ekJwdzhhaFZlWE5HalJYWjRIZ0t6Y +3NORzFsc2oxRzRMUk45T1FCMFVuT0RSWkwzR0hBQ0Znc1ZLYzBxOWR5UGJSVm93PT0= +--------------------------------------------------------------------------------'; + public $sRequirements = ''; + public $sBaseValue = ''; + public $sMinModCfgVersion = '5.1.0.0'; /* minimale Modul-Connector Version */ + + protected $_aUpdateMethods = array( + array( // Moduleintrag anlegen, wenn noch nicht vorhanden + 'check' => 'checkModCfgItemExist', + 'do' => 'updateModCfgItemExist' + ), + array( // alte Datenbankfelder, sofern vorhanden, korrekt (um)benennen + 'check' => 'checkRenameFields', + 'do' => 'fixRenameFields' + ), + array( // #5886 eigene Datenbanktabelle, legt diese an, wenn noch nicht vorhanden + 'check' => 'existContentTabTable', + 'do' => 'addContentTabTable' + ), + array( // #5886 übernahme der Daten von oxarticles/oxartextends in die eigene Tabelle + 'check' => 'needToMigrateArticleDataToContenttabsTable', + 'do' => 'migrateArticleDataToContenttabsTable' + ), + array( // #5886 alte DB-Felder nach erfolgreicher Übernahme der Daten aus oxarticles/oxartextends entfernen + 'check' => 'needToDeleteOldContentTabDatabaseFields', + 'do' => 'deleteOldContentTabDatabaseFields' + ), + array( // Datenbankfelder korrigieren, sofern notwendig + 'check' => 'checkFields', + 'do' => 'fixFields' + ), + array( // alte oxconfig-Einträge vorhanden? + 'check' => 'hasOldModuleItems', + 'do' => 'deleteOldModuleItems' + ), + array( // auf gültige Modul-Dateien prüfen - see metadata.php d3FileRegister + 'check' => 'hasUnregisteredFiles', + 'do' => 'showUnregisteredFiles' + ), + array( // viewusage + 'check' => 'hasContentTabViewTables', + 'do' => 'registerContentTabViewTables' + ), + array( // viewusage + 'check' => 'needToRegisterContentTabViewTable', + 'do' => 'registerContentTabViewTable' + ), + array( // Moduleintrag aktualisieren + 'check' => 'checkModCfgSameRevision', + 'do' => 'updateModCfgSameRevision' + ), + ); + + public $aMultiLangTables = array('d3contenttabs'); + + public $aFields = array( + 'OXID' => array( + 'sTableName' => 'd3contenttabs', + 'sFieldName' => 'OXID', + 'sType' => 'char(32)', + 'blNull' => false, + 'sDefault' => '', + 'sComment' => 'D3 ContentTabs', + 'sExtra' => '', + 'blMultilang' => false, + 'blAddBreak' => false, + ), + 'ARTICLEOXID' => array( + 'sTableName' => 'd3contenttabs', + 'sFieldName' => 'ARTICLEOXID', + 'sType' => 'char(32)', + 'blNull' => false, + 'sDefault' => '', + 'sComment' => 'article assignment', + 'sExtra' => '', + 'blMultilang' => false, + 'blAddBreak' => false, + ), + 'OXACTIVE' => array( + 'sTableName' => 'd3contenttabs', + 'sFieldName' => 'OXACTIVE', + 'sType' => 'TINYINT(1)', + 'blNull' => false, + 'sDefault' => '0', + 'sComment' => 'active flag', + 'sExtra' => '', + 'blMultilang' => false, + 'blAddBreak' => false, + ), + 'TABIDENT' => array( + 'sTableName' => 'd3contenttabs', + 'sFieldName' => 'TABIDENT', // Tab 2 , Tab 3, Tab 4, etc. + 'sType' => 'TINYINT(1) UNSIGNED', // 0 - 255 + 'blNull' => false, + 'sDefault' => '0', + 'sComment' => 'tabident', + 'sExtra' => '', + 'blMultilang' => false, + 'blAddBreak' => false, + ), + 'TABTITLE' => array( + 'sTableName' => 'd3contenttabs', + 'sFieldName' => 'TABTITLE', + 'sType' => 'varchar(255)', + 'blNull' => false, + 'sDefault' => '', + 'sComment' => 'title for tabs', + 'sExtra' => '', + 'blMultilang' => true, + 'blAddBreak' => false, + ), + 'TABCONTENT' => array( + 'sTableName' => 'd3contenttabs', + 'sFieldName' => 'TABCONTENT', + 'sType' => 'TEXT', + 'blNull' => false, + 'sDefault' => '', + 'sComment' => 'D3 ContentTab content', + 'sExtra' => '', + 'blMultilang' => true, + 'blAddBreak' => false, + ), + 'TIMESTAMP' => array( + 'sTableName' => 'd3contenttabs', + 'sFieldName' => 'OXTIMESTAMP', + 'sType' => 'TIMESTAMP', + 'blNull' => false, + 'sDefault' => 'CURRENT_TIMESTAMP', + 'sComment' => 'last change', + 'sExtra' => '', + 'blMultilang' => false, + ), + ); + + public $aIndizes = array( + 'PRIMARY' => array( + 'sTableName' => 'd3contenttabs', + 'sType' => d3database::INDEX_TYPE_PRIMARY, + 'aFields' => array( + 'OXID' => 'OXID', + ), + 'blMultilang' => false, + ), + 'D3ARTICLETAB' => array( + 'sTableName' => 'd3contenttabs', + 'sType' => d3database::INDEX_TYPE_UNIQUE, + 'sName' => 'D3ARTICLETAB', + 'aFields' => array( + 'ARTICLEOXID' => 'ARTICLEOXID', + 'TABIDENT' => 'TABIDENT', + ), + 'blMultilang' => false, + ), + 'OXACTIVE' => array( + 'sTableName' => 'd3contenttabs', + 'sType' => d3database::INDEX_TYPE_INDEX, + 'sName' => 'OXACTIVE', + 'aFields' => array( + 'OXACTIVE' => 'OXACTIVE', + ), + 'blMultilang' => false, + ), + ); + + // before oxid 6 > removed in oxid 6 + public $aOldTabDbFields = array( + 'D3LONGDESC2' => array( + 'sTableName' => 'oxartextends', + 'sFieldName' => 'D3LONGDESC2', //oxlongdesc2 -> OXLONGDESC2 -> D3LONGDESC2 (Type: TEXT) + 'sType' => 'TEXT', + 'blNull' => false, + 'sDefault' => false, + 'sComment' => 'D3 ContentTabs', + 'sExtra' => '', + 'blMultilang' => true, + 'blAddBreak' => true, + ), + 'D3LONGDESC3' => array( + 'sTableName' => 'oxartextends', + 'sFieldName' => 'D3LONGDESC3', // oxlongdesc3 -> OXLONGDESC3 -> D3LONGDESC3 + 'sType' => 'TEXT', + 'blNull' => false, + 'sDefault' => false, + 'sComment' => 'D3 ContentTabs', + 'sExtra' => '', + 'blMultilang' => true, + 'blAddBreak' => true, + ), + 'D3LONGDESC4' => array( + 'sTableName' => 'oxartextends', + 'sFieldName' => 'D3LONGDESC4', // oxlongdesc4 -> OXLONGDESC4 -> D3LONGDESC4 + 'sType' => 'TEXT', + 'blNull' => false, + 'sDefault' => false, + 'sComment' => 'D3 ContentTabs', + 'sExtra' => '', + 'blMultilang' => true, + 'blAddBreak' => true, + ), + 'D3LONGDESC5' => array( + 'sTableName' => 'oxartextends', + 'sFieldName' => 'D3LONGDESC5', // oxlongdesc5 -> OXLONGDESC5 -> D3LONGDESC5 + 'sType' => 'TEXT', + 'blNull' => false, + 'sDefault' => false, + 'sComment' => 'D3 ContentTabs', + 'sExtra' => '', + 'blMultilang' => true, + 'blAddBreak' => true, + ), + 'D3LONGDESCTITLE' => array( + 'sTableName' => 'oxarticles', + 'sFieldName' => 'D3LONGDESCTITLE', // OXLONGDESCTITLE -> D3LONGDESCTITLE + 'sType' => 'varchar(255)', + 'blNull' => false, + 'sDefault' => false, + 'sComment' => 'D3 ContentTabs', + 'sExtra' => '', + 'blMultilang' => true, + 'blAddBreak' => true, + ), + 'D3LONGDESC2TITLE' => array( + 'sTableName' => 'oxarticles', + 'sFieldName' => 'D3LONGDESC2TITLE', // oxlongdesc2title -> OXLONGDESC2TITLE -> D3LONGDESC2TITLE + 'sType' => 'varchar(255)', + 'blNull' => false, + 'sDefault' => false, + 'sComment' => 'D3 ContentTabs', + 'sExtra' => '', + 'blMultilang' => true, + 'blAddBreak' => true, + ), + 'D3LONGDESC3TITLE' => array( + 'sTableName' => 'oxarticles', + 'sFieldName' => 'D3LONGDESC3TITLE', // oxlongdesc3title -> OXLONGDESC3TITLE -> D3LONGDESC3TITLE + 'sType' => 'varchar(255)', + 'blNull' => false, + 'sDefault' => false, + 'sComment' => 'D3 ContentTabs', + 'sExtra' => '', + 'blMultilang' => true, + 'blAddBreak' => true, + ), + 'D3LONGDESC4TITLE' => array( + 'sTableName' => 'oxarticles', + 'sFieldName' => 'D3LONGDESC4TITLE', // oxlongdesc4title -> OXLONGDESC4TITLE -> D3LONGDESC4TITLE + 'sType' => 'varchar(255)', + 'blNull' => false, + 'sDefault' => false, + 'sComment' => 'D3 ContentTabs', + 'sExtra' => '', + 'blMultilang' => true, + 'blAddBreak' => true, + ), + 'D3LONGDESC5TITLE' => array( + 'sTableName' => 'oxarticles', + 'sFieldName' => 'D3LONGDESC5TITLE', // oxlongdesc5title -> OXLONGDESC5TITLE -> D3LONGDESC5TITLE + 'sType' => 'varchar(255)', + 'blNull' => false, + 'sDefault' => false, + 'sComment' => 'D3 ContentTabs', + 'sExtra' => '', + 'blMultilang' => true, + 'blAddBreak' => true, + ), + ); + + // before oxid 6, but we have to rename these fields afterward > f.e. shop/module-updates + public $aRenameFields = array( + 'D3LONGDESC2' => array( + 'sTableName' => 'oxartextends', + 'mOldFieldNames' => array('oxlongdesc2', 'OXLONGDESC2'), + 'sFieldName' => 'D3LONGDESC2', //oxlongdesc2 -> OXLONGDESC2 -> D3LONGDESC2 + 'blMultilang' => true, + 'blAddBreak' => true, + ), + 'D3LONGDESC3' => array( + 'sTableName' => 'oxartextends', + 'mOldFieldNames' => array('oxlongdesc3', 'OXLONGDESC3'), + 'sFieldName' => 'D3LONGDESC3', // oxlongdesc3 -> OXLONGDESC3 -> D3LONGDESC3 + 'blMultilang' => true, + 'blAddBreak' => true, + ), + 'D3LONGDESC4' => array( + 'sTableName' => 'oxartextends', + 'mOldFieldNames' => array('oxlongdesc4', 'OXLONGDESC4'), + 'sFieldName' => 'D3LONGDESC4', // oxlongdesc4 -> OXLONGDESC4 -> D3LONGDESC4 + 'blMultilang' => true, + 'blAddBreak' => true, + ), + 'D3LONGDESC5' => array( + 'sTableName' => 'oxartextends', + 'mOldFieldNames' => array('oxlongdesc5', 'OXLONGDESC5'), + 'sFieldName' => 'D3LONGDESC5', // oxlongdesc5 -> OXLONGDESC5 -> D3LONGDESC5 + 'blMultilang' => true, + 'blAddBreak' => true, + ), + 'D3LONGDESCTITLE' => array( + 'sTableName' => 'oxarticles', + 'mOldFieldNames' => 'OXLONGDESCTITLE', + 'sFieldName' => 'D3LONGDESCTITLE', // OXLONGDESCTITLE -> D3LONGDESCTITLE + 'blMultilang' => true, + 'blAddBreak' => true, + ), + 'D3LONGDESC2TITLE' => array( + 'sTableName' => 'oxarticles', + 'mOldFieldNames' => array('oxlongdesc2title', 'OXLONGDESC2TITLE'), + 'sFieldName' => 'D3LONGDESC2TITLE', // oxlongdesc2title -> OXLONGDESC2TITLE -> D3LONGDESC2TITLE + 'blMultilang' => true, + 'blAddBreak' => true, + ), + 'D3LONGDESC3TITLE' => array( + 'sTableName' => 'oxarticles', + 'mOldFieldNames' => array('oxlongdesc3title', 'OXLONGDESC3TITLE'), + 'sFieldName' => 'D3LONGDESC3TITLE', // oxlongdesc3title -> OXLONGDESC3TITLE -> D3LONGDESC3TITLE + 'blMultilang' => true, + 'blAddBreak' => true, + ), + 'D3LONGDESC4TITLE' => array( + 'sTableName' => 'oxarticles', + 'mOldFieldNames' => array('oxlongdesc4title', 'OXLONGDESC4TITLE'), + 'sFieldName' => 'D3LONGDESC4TITLE', // oxlongdesc4title -> OXLONGDESC4TITLE -> D3LONGDESC4TITLE + 'blMultilang' => true, + 'blAddBreak' => true, + ), + 'D3LONGDESC5TITLE' => array( + 'sTableName' => 'oxarticles', + 'mOldFieldNames' => array('oxlongdesc5title', 'OXLONGDESC5TITLE'), + 'sFieldName' => 'D3LONGDESC5TITLE', // oxlongdesc5title -> OXLONGDESC5TITLE -> D3LONGDESC5TITLE + 'blMultilang' => true, + 'blAddBreak' => true, + ), + ); + + protected $_aRefreshMetaModuleIds = array('d3contenttabs'); + + public $aOldModuleFiles = array(); + + protected $aDeleteOldContenTabDbField = array(); + + protected $aMigrateContents = array(); + + /******************************************************************************************************************/ + /*** eigene Tabelle für Content-Tabs anlegen / Prüfen und Daten migrieren *****************************************/ + /******************************************************************************************************************/ + /** + * @return bool + * @throws DatabaseConnectionException + */ + public function needToDeleteOldContentTabDatabaseFields() + { + // we have to delete all old fields! : $this->aOldTabDbFields + foreach ($this->aOldTabDbFields as $key => $aOldDbfield) { + // mehrsprachigkeit erforderlich? + if ($aOldDbfield['blMultilang']) { + // je sprache ist ein subfeld zu prüfen + for ($i = 0; count(Registry::getLang()->getLanguageArray()) > $i; $i++) { + // felder je sprache + $sAddfield = ''; + if ($i > 0) { + $sAddfield = '_' . $i; + } + + // check if field exist an has no content + $sKey = $aOldDbfield['sTableName'] . '__' . $aOldDbfield['sFieldName'] . $sAddfield; + $mReturn = $this->existOldTabDatabaseFieldSql($sKey, false); + + if (false === $mReturn) { + // skip field, we dont need to check this twice it does not exist! + continue; + } + + if (is_string($mReturn)) { + // Feld existiert + $mReturn = $this->existOldTabDatabaseFieldSql($sKey, true); + + if (false === $mReturn) { + // skip field, we dont need to check this twice its empty + $this->aDeleteOldContenTabDbField[$sKey] = array( + 'sTableName' => $aOldDbfield['sTableName'], + 'sOriginalFieldName' => $aOldDbfield['sFieldName'], + 'sFieldName' => $aOldDbfield['sFieldName'] . $sAddfield + ); + continue; + } + } + } + } else { + // check if field exist and has content + $sKey = $aOldDbfield['sTableName'] . '__' . $aOldDbfield['sFieldName']; + $mReturn = $this->existOldTabDatabaseFieldSql($sKey, false); + + if (false === $mReturn) { + // skip field, we dont need to check this twice it does not exist! + continue; + } + + if (is_string($mReturn)) { + // Feld existiert + $mReturn = $this->existOldTabDatabaseFieldSql($sKey, true); + + if (false === $mReturn) { + // skip field, we dont need to check this twice its empty + $this->aDeleteOldContenTabDbField[$sKey] = array( + 'sTableName' => $aOldDbfield['sTableName'], + 'sOriginalFieldName' => $aOldDbfield['sFieldName'], + 'sFieldName' => $aOldDbfield['sFieldName'] + ); + continue; + } + } + } + } + + if (count($this->aDeleteOldContenTabDbField) > 0) { + + return true; + } + + return false; + } + + /** + * @return bool + * @throws DatabaseConnectionException + */ + public function deleteOldContentTabDatabaseFields() + { + // show message, migrate?! + $sTranslation = Registry::getLang()->translateString('D3_CONTENT_TABS_DELETE_TABLE_FIELDS'); + foreach ($this->aDeleteOldContenTabDbField as $sKey => $item) { + $sTranslation .= "ALTER TABLE " . $item['sTableName'] . " DROP COLUMN " . $item['sFieldName'] . ";" . PHP_EOL; + } + + if ($this->hasExecute()) { + $oDb = DatabaseProvider::getDb(); + foreach ($this->aDeleteOldContenTabDbField as $sKey => $item) { + + try { + // field exist if no Exception occurs + $oDb->execute("ALTER TABLE " . $item['sTableName'] . " DROP COLUMN " . $item['sFieldName']); + + } catch (DatabaseException $oEx) { + // $oEx->getCode() : 1054 + // $oEx->getMessage() : 'Unknown column 'D3LONGDESCTEST_1' in 'field list'' + } + } + } + + return $this->_confirmMessage($sTranslation); + } + + /** + * @return bool + * @throws DatabaseConnectionException + */ + public function needToMigrateArticleDataToContenttabsTable() + { + // Prüfung existieren die alten Felder noch und sind diese gefüllt? + $blFieldsExist = false; + foreach ($this->aOldTabDbFields as $aOldDbfield) { + if ($aOldDbfield['blMultilang']) { + // mehrsprachigkeit erforderlich? wenn ja, je sprache ein subfeld + for ($i = 0; count(Registry::getLang()->getLanguageArray()) > $i; $i++) { + // felder je sprache + $sAddfield = ''; + if ($i > 0) { + $sAddfield = '_' . $i; + } + + $sKey = $aOldDbfield['sTableName'] . '__' . $aOldDbfield['sFieldName'] . $sAddfield; + // only check if field exist + $mReturn = $this->existOldTabDatabaseFieldSql($sKey); + if (false === $mReturn) { + // skip field, we dont need to check this fields twice it does not exist! + continue; + } + + // check for has content + $mReturn = $this->existOldTabDatabaseFieldSql($sKey, true); + if (false === $mReturn) { + // skip field, we dont need to check this fields twice it doesn't have any content + continue; + } + + $this->aMigrateContents[$sKey] = array( + 'sTableName' => $aOldDbfield['sTableName'], + 'sOriginalFieldName' => $aOldDbfield['sFieldName'], + 'sFieldName' => $aOldDbfield['sFieldName'] . $sAddfield + ); + $blFieldsExist = true; + } + } else { + $sKey = $aOldDbfield['sTableName'] . '__' . $aOldDbfield['sFieldName']; + + // only check if field exist + $mReturn = $this->existOldTabDatabaseFieldSql($sKey); + if (false === $mReturn) { + // skip field, we dont need to check this fields twice it does not exist! + continue; + } + + // check for has content + $mReturn = $this->existOldTabDatabaseFieldSql($sKey, true); + if (false === $mReturn) { + // skip field, we dont need to check this fields twice it doesn't have any content + continue; + } + + $this->aMigrateContents[$sKey] = array( + 'sTableName' => $aOldDbfield['sTableName'], + 'sOriginalFieldName' => $aOldDbfield['sFieldName'], + 'sFieldName' => $aOldDbfield['sFieldName'], + ); + $blFieldsExist = true; + } + } + + return $blFieldsExist; + } + + /** + * @param string $sKey + * @param bool $blNotEmpty + * + * @return false|string + * @throws DatabaseConnectionException + */ + public function existOldTabDatabaseFieldSql($sKey, $blNotEmpty = false) + { + $aKey = explode('__', $sKey); + if (false == is_array($aKey) && 2 != count($aKey)) { + return false; + } + + $oDb = DatabaseProvider::getDb(DatabaseProvider::FETCH_MODE_ASSOC); + $sSelect = " SELECT " . $aKey[1] . " FROM " . $aKey[0]; + if ($blNotEmpty) { + $sSelect .= " WHERE " . $aKey[1] . " != '' "; + } + $sSelect .= " LIMIT 1"; + + try { + // field exist if no Exception occurs, return content of the selected field + return $oDb->getOne($sSelect); + + } catch (DatabaseException $oEx) { + // $oEx->getCode() : 1054 + // $oEx->getMessage() : 'Unknown column 'D3LONGDESCTEST_1' in 'field list'' + + return false; + } + } + + /** + * @return bool + * @throws DatabaseConnectionException + * @throws DatabaseErrorException + */ + public function migrateArticleDataToContenttabsTable() + { + if (false == is_array($this->aMigrateContents) && empty($this->aMigrateContents)) { + return false; + } + + $sTableFielNames = ''; + foreach ($this->aMigrateContents as $aOldContent) { + $sTableFielNames .= $aOldContent['sTableName'] . '__' . $aOldContent['sFieldName'] . ', '; + } + $sTableFielNames = substr(strtolower($sTableFielNames), 0, strlen($sTableFielNames) - 2); + + // show message, migrate?! + $aArgs = array('dbfieldnames' => $sTableFielNames, 'count' => count($this->aMigrateContents)); + $sTranslation = Registry::getLang()->translateString('D3_CONTENT_TABS_MIGRATED_TABLE_FIELDS'); + $sTranslation = sprintf($sTranslation, $aArgs['dbfieldnames'], $aArgs['count']); + $blRet = $this->_confirmMessage($sTranslation); + + if ($this->hasExecute()) { + // NOTE standard-langtext-inhalt bleibt in oxarticles! + // auch wenn es einen Titel dazu gibt + // der Langtext wird weiterhin in oxarticles abgelegt/abgeholt!!! + // andernfalls käme es mit inaktivem Modul zu .... + + // ----> transfer data to new table + $oDb = DatabaseProvider::getDb(DatabaseProvider::FETCH_MODE_ASSOC); + foreach ($this->aMigrateContents as $sKey => $aOldContent) { + // map: + // d3contenttabs__OXID > wird vom Shop generiert + // d3contenttabs__ARTICLEOXID > oxarticles__OXID bzw. oxartextends__OXID + // d3contenttabs__OXACTIVE > 1 bei einer übernahme + // + // d3contenttabs__TABIDENT > wird spannend ... > Tab 2 , Tab 3, Tab 4, etc. + // anhand von: + // ----------- + // d3contenttabs__TABTITLE > oxarticles__D3LONGDESCTITLE + // D3LONGDESC2TITLE + // D3LONGDESC3TITLE + // D3LONGDESC4TITLE + // D3LONGDESC5TITLE + // + // d3contenttabs__TABCONTENT > oxartextends__D3LONGDESC2 + // D3LONGDESC3 + // D3LONGDESC4 + // D3LONGDESC5 + // + // d3contenttabs__OXTIMESTAMP > CURRENT_TIMESTAMP + $sSelect = "SELECT oxid as 'oxid', " . $aOldContent['sFieldName'] . " as 'content', oxtimestamp as 'time' " + . " FROM " . $aOldContent['sTableName'] + . " WHERE " . $aOldContent['sFieldName'] . " != ''"; + + $result = $oDb->getAll($sSelect); + if (count($result) > 0) { + // we got min one result + for ($i = 0; $i < count($result); $i++) { + // var_dump($result[$i]['oxid'], $result[$i]['content'], $result[$i]['time']); + if (strpos(strtolower($aOldContent['sOriginalFieldName']), "title") !== false) { + // es geht um den Titel + $newFieldName = 'TABTITLE'; + } else { + // es geht um den Langtext + $newFieldName = 'TABCONTENT'; + } + + // mehrsprachigkeit + if ($aOldContent['sOriginalFieldName'] != $aOldContent['sFieldName']) { + $newFieldName .= substr($aOldContent['sFieldName'], -2); + } + + // besteht aus zwei schritten, 1. daten in die neue Tabelle rumnehmen + $sMigrate1 = " INSERT INTO d3contenttabs (`OXID`, `ARTICLEOXID`, `OXACTIVE`, `TABIDENT`, `" . $newFieldName . "`, `OXTIMESTAMP`) VALUES " + . " (" // + . "'" . Registry::getUtilsObject()->generateUid() . "'," // + . "'" . $result[$i]['oxid'] . "'," // + . "'1'," // + . "'" . $this->getContentTabId($aOldContent['sOriginalFieldName']) . "'," // + . "'" . $result[$i]['content'] . "'," // TABTITLE or TABCONTENT + . "'" . $result[$i]['time'] . "'" // + . ") " // + . " ON DUPLICATE KEY UPDATE " // + . $newFieldName . " = '" . $result[$i]['content'] . "'"; + + + // inhalt aus altem feld entfernen... + $sMigrate2 = " UPDATE " . $aOldContent['sTableName'] // + . " SET " . $aOldContent['sFieldName'] . " = '' " // + . " WHERE oxid = '" . $result[$i]['oxid'] . "' "; + + try { + // field exist if no Exception occurs, return content of the selected field + $blMigrated = $oDb->execute($sMigrate1); + $blUpdated = $oDb->execute($sMigrate2); + + if ($blUpdated && $blMigrated) { + $this->setActionLog('SQL', $sMigrate1, __METHOD__); + $this->setActionLog('SQL', $sMigrate2, __METHOD__); + $this->setUpdateBreak(false); + } + + } catch (DatabaseException $oEx) { + // $oEx->getCode() : 1054 + // $oEx->getMessage() : 'Unknown column 'D3LONGDESCTEST_1' in 'field list'' + // do nothing, cause we like to finish the remaining data! + } + } + } + } + } + + return $blRet; + } + + public function getContentTabId($sFieldName) + { + switch (strtolower($sFieldName)) { + case 'd3longdesctitle': + return 1; + case 'd3longdesc2title': + case 'd3longdesc2': + return 2; + case 'd3longdesc3title': + case 'd3longdesc3': + return 3; + case 'd3longdesc4title': + case 'd3longdesc4': + return 4; + case 'd3longdesc5title': + case 'd3longdesc5': + return 5; + } + + return 0; // unknown field... + } + + /** + * @return bool true, if table is missing + * @return bool + * @throws DatabaseConnectionException + * @throws DatabaseErrorException + * @throws DBALException + */ + public function existContentTabTable() + { + return $this->_checkTableNotExist('d3contenttabs'); + } + + /** + * @return bool + * @throws DBALException + * @throws DatabaseConnectionException + * @throws DatabaseErrorException + * @throws ConnectionException + */ + public function addContentTabTable() + { + $this->setInitialExecMethod(__METHOD__); + $blRet = $this->_addTable2( + 'd3contenttabs', + $this->aFields, + $this->aIndizes, + 'tab configuration', + 'InnoDB' + ); + + return $blRet; + } + + /**********************************************************************/ + /*** Datei Verzeichniskontrolle ***************************************/ + /**********************************************************************/ + /** + * @return bool + * @throws DBALException + * @throws DatabaseConnectionException + * @throws DatabaseErrorException + * @throws d3ParameterNotFoundException + * @throws d3ShopCompatibilityAdapterException + * @throws d3_cfg_mod_exception + * @throws StandardException + */ + public function hasUnregisteredFiles() + { + return $this->_hasUnregisteredFiles($this->sModKey, array('blocks', 'd3FileRegister')); + } + + /** + * @return bool + * @throws DBALException + * @throws DatabaseConnectionException + * @throws DatabaseErrorException + * @throws StandardException + * @throws d3ShopCompatibilityAdapterException + * @throws d3_cfg_mod_exception + */ + public function showUnregisteredFiles() + { + return $this->_showUnregisteredFiles($this->sModKey, array('blocks', 'd3FileRegister')); + } + + + /** + * @return bool + * @throws ConnectionException + */ + public function hasContentTabViewTables() + { + return $this->checkMultiLangTables('d3contenttabs'); + } + + /** + * @return bool + * @throws ConnectionException + * @throws DBALException + * @throws DatabaseConnectionException + * @throws DatabaseErrorException + */ + public function registerContentTabViewTables() + { + return $this->fixRegisterMultiLangTables('d3contenttabs'); + + } + + /** + * @return bool + * @throws DBALException + * @throws DatabaseConnectionException + * @throws DatabaseErrorException + */ + public function needToRegisterContentTabViewTable() + { + return $this->checkConvertToMultiLangTable('d3contenttabs'); + } + + /** + * @return bool + * @throws ConnectionException + * @throws DBALException + * @throws DatabaseConnectionException + * @throws DatabaseErrorException + */ + public function registerContentTabViewTable() + { + return $this->convertToMultilangTable('d3contenttabs'); + } +} diff --git a/src/menu.xml b/src/menu.xml index f287638..961ec18 100644 --- a/src/menu.xml +++ b/src/menu.xml @@ -1,11 +1,11 @@ - - - - - - - - - - - + + + + + + + + + + + diff --git a/src/metadata.php b/src/metadata.php index cf9d2d6..f7787a0 100644 --- a/src/metadata.php +++ b/src/metadata.php @@ -1,88 +1,88 @@ -getD3Logo() : 'D³'); - -/** - * Module information - */ -$aModule = array( - 'id' => 'd3contenttabs', - 'title' => $sD3Logo . ' Content Tabs', - 'description' => array( - 'de' => 'Dieses Modul bietet die Möglichkeit umfangreiche Artikelinformationen, auf der ' // - . 'Detailseite, übersichtlich aufzugliedern.
    Sie sehen dieses Modul auch bei uns im Shop. ' // - . 'Sie können z.B. bei diesem Modul zwischen den Tabs "Beschreibung", "Features" und ' // - . '"Downloads" wählen.', - 'en' => '', - ), - 'thumbnail' => 'picture.png', - 'version' => '4.0.0.1', - 'author' => 'D³ Data Development (Inh.: Thomas Dartsch)', - 'url' => 'http://www.shopmodule.com', - 'email' => 'support@shopmodule.com', - 'extend' => array( - OxidApplication\Component\Widget\ArticleDetails::class => \D3\Contenttabs\Modules\Application\Component\Widget\d3_oxwarticledetails_contenttabs::class, - OxidApplication\Model\Article::class => \D3\Contenttabs\Modules\Application\Model\d3_oxarticle_longtexts::class, - ), - 'controllers' => array( - 'd3contenttabs_settings' => \D3\Contenttabs\Application\Controller\Admin\settings::class, - 'd3contenttabs_support' => \D3\Contenttabs\Application\Controller\Admin\support::class, - 'd3contenttabs_tablist' => \D3\Contenttabs\Application\Controller\Admin\contentTabList::class, - 'd3contenttabs_tabs' => \D3\Contenttabs\Application\Controller\Admin\contentTabs::class, - ), - 'templates' => array( - // Admin - 'contentTabsBase.tpl' => 'd3/contenttabs/Application/views/admin/tpl/contentTabsBase.tpl', - 'contentTabs.tpl' => 'd3/contenttabs/Application/views/admin/tpl/contentTabs.tpl', - 'contentTabList.tpl' => 'd3/contenttabs/Application/views/admin/tpl/contentTabList.tpl', - // Frontend - 'd3contenttabs_tab1.tpl' => 'd3/contenttabs/Application/views/tpl/d3contenttabs_tab1.tpl', - ), - 'events' => array( - 'onActivate' => \D3\ModCfg\Application\Model\Install\d3install::class . '::checkUpdateStart', - ), - 'blocks' => array( - // azure / flow blocks - array( - 'template' => 'page/details/inc/tabs.tpl', - 'block' => 'details_tabs_longdescription', - 'file' => 'Application/views/blocks/details_tabs_longdescription.tpl', - ), - ), - 'settings' => array(), - 'd3FileRegister' => array( - 'd3/contenttabs/Modules/Application/Component/Widget/d3_oxwarticledetails_contenttabs.php', - 'd3/contenttabs/Modules/Application/Model/d3_oxarticle_longtexts.php', - 'd3/contenttabs/Application/views/admin/de/d3_contenttabs_lang.php', - 'd3/contenttabs/Application/translations/de/d3_contenttabs_lang.php', - 'd3/contenttabs/Application/Controller/Admin/contentTabs.php', - 'd3/contenttabs/Application/Controller/Admin/support.php', - 'd3/contenttabs/Application/Controller/Admin/contentTabList.php', - 'd3/contenttabs/Application/Controller/Admin/settings.php', - 'd3/contenttabs/Application/Model/contentTabs.php', - 'd3/contenttabs/metadata.php', - 'd3/contenttabs/Setup/setupWizard.php', - 'd3/contenttabs/IntelliSenseHelper.php', - ), - 'd3SetupClasses' => array( - \D3\Contenttabs\Setup\setupWizard::class, - ), -); +getD3Logo() : 'D³'); + +/** + * Module information + */ +$aModule = array( + 'id' => 'd3contenttabs', + 'title' => $sD3Logo . ' Content Tabs', + 'description' => array( + 'de' => 'Dieses Modul bietet die Möglichkeit umfangreiche Artikelinformationen, auf der ' // + . 'Detailseite, übersichtlich aufzugliedern.
    Sie sehen dieses Modul auch bei uns im Shop. ' // + . 'Sie können z.B. bei diesem Modul zwischen den Tabs "Beschreibung", "Features" und ' // + . '"Downloads" wählen.', + 'en' => '', + ), + 'thumbnail' => 'picture.png', + 'version' => '4.0.0.2', + 'author' => 'D³ Data Development (Inh.: Thomas Dartsch)', + 'url' => 'http://www.shopmodule.com', + 'email' => 'support@shopmodule.com', + 'extend' => array( + OxidApplication\Component\Widget\ArticleDetails::class => \D3\Contenttabs\Modules\Application\Component\Widget\d3_oxwarticledetails_contenttabs::class, + OxidApplication\Model\Article::class => \D3\Contenttabs\Modules\Application\Model\d3_oxarticle_longtexts::class, + ), + 'controllers' => array( + 'd3contenttabs_settings' => \D3\Contenttabs\Application\Controller\Admin\settings::class, + 'd3contenttabs_support' => \D3\Contenttabs\Application\Controller\Admin\support::class, + 'd3contenttabs_tablist' => \D3\Contenttabs\Application\Controller\Admin\contentTabList::class, + 'd3contenttabs_tabs' => \D3\Contenttabs\Application\Controller\Admin\contentTabs::class, + ), + 'templates' => array( + // Admin + 'contentTabsBase.tpl' => 'd3/contenttabs/Application/views/admin/tpl/contentTabsBase.tpl', + 'contentTabs.tpl' => 'd3/contenttabs/Application/views/admin/tpl/contentTabs.tpl', + 'contentTabList.tpl' => 'd3/contenttabs/Application/views/admin/tpl/contentTabList.tpl', + // Frontend + 'd3contenttabs_tab1.tpl' => 'd3/contenttabs/Application/views/tpl/d3contenttabs_tab1.tpl', + ), + 'events' => array( + 'onActivate' => \D3\ModCfg\Application\Model\Install\d3install::class . '::checkUpdateStart', + ), + 'blocks' => array( + // azure / flow blocks + array( + 'template' => 'page/details/inc/tabs.tpl', + 'block' => 'details_tabs_longdescription', + 'file' => 'Application/views/blocks/details_tabs_longdescription.tpl', + ), + ), + 'settings' => array(), + 'd3FileRegister' => array( + 'd3/contenttabs/Modules/Application/Component/Widget/d3_oxwarticledetails_contenttabs.php', + 'd3/contenttabs/Modules/Application/Model/d3_oxarticle_longtexts.php', + 'd3/contenttabs/Application/views/admin/de/d3_contenttabs_lang.php', + 'd3/contenttabs/Application/translations/de/d3_contenttabs_lang.php', + 'd3/contenttabs/Application/Controller/Admin/contentTabs.php', + 'd3/contenttabs/Application/Controller/Admin/support.php', + 'd3/contenttabs/Application/Controller/Admin/contentTabList.php', + 'd3/contenttabs/Application/Controller/Admin/settings.php', + 'd3/contenttabs/Application/Model/contentTabs.php', + 'd3/contenttabs/metadata.php', + 'd3/contenttabs/Setup/setupWizard.php', + 'd3/contenttabs/IntelliSenseHelper.php', + ), + 'd3SetupClasses' => array( + \D3\Contenttabs\Setup\setupWizard::class, + ), +); diff --git a/src/out/mobile/src/css/d3mobile.css b/src/out/mobile/src/css/d3mobile.css index 23c8b2b..dd65b72 100644 --- a/src/out/mobile/src/css/d3mobile.css +++ b/src/out/mobile/src/css/d3mobile.css @@ -1,20 +1,20 @@ -[class^="glyphicon-"] { - color: #50a9be; -} - -.content-tab-one, -.content-tab-two, -.content-tab-three, -.content-tab-four, -.content-tab-five{ - cursor: pointer; - margin-top: 15px; -} - -.content-tab-one-content, -.content-tab-two-content, -.content-tab-three-content, -.content-tab-four-content, -.content-tab-five-content{ - overflow: hidden; -} +[class^="glyphicon-"] { + color: #50a9be; +} + +.content-tab-one, +.content-tab-two, +.content-tab-three, +.content-tab-four, +.content-tab-five{ + cursor: pointer; + margin-top: 15px; +} + +.content-tab-one-content, +.content-tab-two-content, +.content-tab-three-content, +.content-tab-four-content, +.content-tab-five-content{ + overflow: hidden; +}