diff --git a/CHANGELOG.md b/CHANGELOG.md index 63ca7f6..5e96a6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,9 +23,9 @@ # Plugin: Server 1.5.0 * Weitere Redaxo Versionen aufgenommen -* Maintenance / Wartungsvertrag Icon angepasst #77 https://github.com/FriendsOfREDAXO/project_manager/issues/77 -* Beim Abruf der Domaindaten nun zusätzliches Logging in einzelnen Textdateien #78 https://github.com/FriendsOfREDAXO/project_manager/issues/78 -* Bugfix: Warnings entfernt unter R5.14.2 #79 https://github.com/FriendsOfREDAXO/project_manager/issues/79 +* Maintenance / Wartungsvertrag Icon angepasst #77 https://github.com/FriendsOfREDAXO/project_manager_plus/issues/77 +* Beim Abruf der Domaindaten nun zusätzliches Logging in einzelnen Textdateien #78 https://github.com/FriendsOfREDAXO/project_manager_plus/issues/78 +* Bugfix: Warnings entfernt unter R5.14.2 #79 https://github.com/FriendsOfREDAXO/project_manager_plus/issues/79 ## Version 1.4.0 // 24.05.2022 @@ -298,22 +298,22 @@ Version Compare umgestellt ## Version 1.1.0 // 08.10.2018 * Erweiterung um Rechtevergabe für das Addon und deren Plugins - * project_manager[] + * project_manager_plus[] # Plugin: Server 1.0.5 * Schreibweise der Funktionen verkürzt * Erweiterung um Rechtevergabe des Plugins -* project_manager_server[] -* Automatisches Anlegen der Crobjobs: rex_cronjob_project_manager_data, rex_cronjob_project_manager_favicon +* project_manager_plus_server[] +* Automatisches Anlegen der Crobjobs: rex_cronjob_project_manager_plus_data, rex_cronjob_project_manager_plus_favicon # Plugin: Client 1.0.4 * Erweiterung um Rechtevergabe des Plugins -* project_manager_client[] +* project_manager_plus_client[] # Plugin: PageSpeed 1.0.3 * Erweiterung um Rechtevergabe des Plugins -* project_manager_pagespeed[] -* Automatisches Anlegen des Crobjobs: rex_cronjob_project_manager_pagespeed +* project_manager_plus_pagespeed[] +* Automatisches Anlegen des Crobjobs: rex_cronjob_project_manager_plus_pagespeed diff --git a/README.md b/README.md index a002c17..55f6686 100644 --- a/README.md +++ b/README.md @@ -1,54 +1,15 @@ +# Project Manager Plus -REDAXO-AddOn: Project Manager -================================================================================ +Fork des beliebten Forks des Addons `hello` für REDAXO. -Bietet Unterstützung bei der Verwaltung und Überprüfung der eigenen REDAXO-Installationen. +Bietet Unterstützung bei der Verwaltung und Überprüfung der eigenen REDAXO-Installationen - fit für REDAXO 5.18++. -## Projektübersicht -![Screenshot](https://raw.githubusercontent.com/FriendsOfREDAXO/project_manager/assets/project_manager_server.png) +## Features -## Projektdetailansicht -![Screenshot](https://raw.githubusercontent.com/FriendsOfREDAXO/project_manager/assets/project_manager_server_detail.png) - -## Inhaltsübersicht - -* [Einleitung](#einleitung) - - [Über das AddOn](#ueber-das-addon) - - [Features](#section1) - - [Installation](#section2) - - [Plugins](#section3) - -* [Einstellungen](#einstellungen) -* [Server-Plugin](#server-plugin) - - [Server](#server) - - [Editiermodus](#editiermodus) - - [Sync-Cronjob](#status-cronjob) -* [Client-Plugin](#client-plugin) - - [Client](#client) -* [Hosting-Plugin](#hosting-plugin) - - [Hosting](#hosting) -* [Allgemein](#allgemein) - - [Changelog](#section4) - - [Credits](#section5) - - [Bug-Meldungen, Hilfe und Links](#section6) - - -## Einleitung - - -### Über das Addon - -Dieses Addon bietet Unterstützung bei der Verwaltung und Überprüfung der eigenen REDAXO-Installationen. - -↑ [zurück zur Übersicht](#top) - - -### Features - -Das **Client-Plugin** ist für den Abruf der einzelnen Parameter zuständig. +**Client** ist für den Abruf der einzelnen Parameter zuständig. * Hinterlegen eines API-Keys in den Einstellungen -* Abruf von Parametern der Installation, z.B. +* Abruf von Parametern der Installation, z.B. * Aktuelle PHP-Version * Installierte und updatefähige REDAXO-Addons * Vorhandene Module @@ -57,61 +18,39 @@ Das **Client-Plugin** ist für den Abruf der einzelnen Parameter zuständig. * Letzte Änderungen im Medienpool * Letzte Änderungen in der Struktur * Letzte Meldungen aus dem Syslog - * weiter geplant: Medienpool-Verzeichnisgröße, Backup-Status + * weiter geplant: Medienpool-Verzeichnisgröße, Backup-Status * weiter geplant: EXTENSION_POINT, um eigene Prüfregeln zu hinterlegen -Das **Server-Plugin** dient zur Verwaltung der REDAXO Projekte +**Server** dient zur Verwaltung der REDAXO Projekte * Verwaltung der REDAXO-Projekte * Darstellung der wichtigsten Parameter in der Listenansicht * Darstellung aller Parameter in der Detailansicht * Abruf und Überwachung der Parameter von den Clients -* EXTENSION_POINT **PROJECT_MANAGER_SERVER_DETAIL_HOOK** zur Einbindung von weiteren Plugins und zur Darstellung in der Detailansicht +* EXTENSION_POINT **project_manager_plus_SERVER_DETAIL_HOOK** zur Einbindung von weiteren Plugins und zur Darstellung in der Detailansicht * Cronjob zum automatisierten Abruf aller Parameter * Cronjob zum automatisierten Abruf der Favicons -![Screenshot](https://raw.githubusercontent.com/FriendsOfREDAXO/project_manager/assets/project_manager_server.png) +**PageSpeed** dient zur Anzeige der Google PageSpeedwerte -Das **PageSpeed-Plugin** dient zur Anzeige der Google PageSpeedwerte * Abrufen der Desktop und Mobile PageSpeed Werte * Darstellung der Werte in der Listenansicht -* Darstellung aller Parameter in der Detailansicht im **Server-Plugin** +* Darstellung aller Parameter in der Detailansicht im **Server** * Cronjob zum automatisierten Abruf der Werte -![Screenshot](https://raw.githubusercontent.com/FriendsOfREDAXO/project_manager/assets/project_manager_pagespeed.png) +**Hosting** dient zur Anzeige von Hosting Informationen -Das **Hosting-Plugin** dient zur Anzeige von Hosting Informationen * Abrufen von ISP, Organisation sowie die aktuelle IP Adresse über den IP-API.com Dienst * Darstellung der Werte in der Listenansicht -* Darstellung aller Parameter in der Detailansicht im **Server-Plugin** +* Darstellung aller Parameter in der Detailansicht im **Server** * Cronjob zum automatisierten Abruf der Werte -![Screenshot](https://raw.githubusercontent.com/FriendsOfREDAXO/project_manager/assets/project_manager_hosting.png) - -↑ [zurück zur Übersicht](#top) - - - ## Installation Voraussetzung für die aktuelle Version des Projekt Manager Addons: REDAXO 5.3, Cronjob-Addon, MarkItUp-Addon Nach erfolgreicher Installation gibt es im Backend unter AddOns einen Eintrag "Projekt Manager". -↑ [zurück zur Übersicht](#top) - - -### Plugins - -Auf den REDAXO Projekten sollte nur das Plugin **Client** installiert und konfiguriert werden. -Der Projekt Manager Server benötigt das Plugin **Server**. - -↑ [zurück zur Übersicht](#top) - - -## Server-Plugin - - -### Server +## Server Unter dem Reiter **Übersicht** werden REDAXO-Installationen verwaltet. @@ -126,30 +65,22 @@ Die einzelnen Felder sind: * API-Key * REDAXO Hauptversion (Wird für den entsprechenden Aufruf zum Client benötigt) - - ### Editiermodus Im **Editiermodus** lässt sich das ausgewählte Projekt verwalten. - ### Details Unter Details kann das Projekt gewählt werden und alle relevanten Inhalte zum Projekt angezeigt werden. - ### Sync-Cronjob Um die Daten von den REDAXO Clients in den Projekt Manager zu laden, gibt es zwei Cronjobs welche im Cronjob Addon mit der Installation angelegt werden. + * Projekt Manager: Hole Domaindaten * Projekt Manager: Hole Favicon - - -## Client-PlugIn - - -### Client +## Client Unter dem Reiter **Client** wird der API Key für die REDAXO Instanz verwaltet. @@ -159,40 +90,19 @@ Die einzelnen Felder sind: Dieser wird beim Projekt anlegen im Server-Plugin erzeugt und kann hier ein eingetragen werden. - -↑ [zurück zur Übersicht](#top) - - ### Einstellungen Unter dem Reiter **Einstellungen** lässt sich ein API-Key hinterlegen. Bei der Installation des Plugins wird automatisch ein API-Key voreingestellt. Anschließend lassen sich die Parameter über die URL abrufen: +```plaintext +http://www.domain.de/?rex-api-call=project_manager_plus&api_key= ``` -http://www.domain.de/?rex-api-call=project_manager&api_key= -``` - -↑ [zurück zur Übersicht](#top) - - ### REDAXO 4 -Für REDAXO 4 existiert unter /plugins/client/install/client/redaxo_4 eine Datei Namens **project_manager_client.php**. -Diese muss in das ROOT der Client Instanz auf der REDAXO 4 läuft kopiert werden. -Der Abruf erfolgt dann über den Projekt Manager Server. Dort muss das Projekt mit REDAXO 4 als Hauptversion konfiguriert sein. - -``` -http://www.domain.de/project_manager_client.php?rex-api-call=project_manager&api_key=legacy -``` - -↑ [zurück zur Übersicht](#top) - - -## PageSpeed-Plugin - +REDAXO 4 wird nicht mehr unterstützt. - -### PageSpeed +## PageSpeed Unter dem Reiter **Einstellungen** wird der Google PageSpeed API Key verwaltet. @@ -200,90 +110,59 @@ Die einzelnen Felder sind: * API-Key - ### Installation Nach der Installation des Plugins muss in den Einstellungen der API-Key eingerichtet werden. -↑ [zurück zur Übersicht](#top) - - - ### Einstellungen Unter dem Reiter **Einstellungen** lässt sich ein API-Key hinterlegen. Bei der Installation des Plugins wird automatisch ein API-Key voreingestellt. Anschließend lassen sich die Parameter über die URL abrufen: - - ### PageSpeed-Cronjob Um die Daten von den REDAXO Projekten in den Projekt Manager zu laden, gibt es einen Cronjobs welcher im Cronjob Addon mit der Installation angelegt werden. -* Projekt Manager: PageSpeed Daten - -↑ [zurück zur Übersicht](#top) - +* Projekt Manager: PageSpeed Daten - -## Hosting-Plugin +## Hosting Das Hosting-Plugin holt ISP, Organisation sowie die aktuelle IP Adresse über den IP-API.com Dienst. Achtung! Es exisitert eine Limitierung von 150 Calls/Minute, daher wurde ein Timing verbaut. - ### Installation Nach der Installation des Plugins sollte der Cronjob einmal ausgeführt werden. -↑ [zurück zur Übersicht](#top) - - - ### Hosting-Cronjob Um die Hostingdaten von den REDAXO Projekten in den Projekt Manager zu laden, gibt es einen Cronjobs welcher im Cronjob Addon mit der Installation angelegt werden. -* Projekt Manager: Hosting Daten - -↑ [zurück zur Übersicht](#top) - - -## Allgemein - - -### Changelog -siehe CHANGELOG.md des AddOns +* Projekt Manager: Hosting Daten +## Weiteres - ### Bug-Meldungen, Hilfe und Links -* Auf Github: https://github.com/FriendsOfREDAXO/project_manager/issues -* im Forum: https://www.redaxo.org/forum/ -* im Slack-Channel: https://friendsofredaxo.slack.com/ - +* Auf Github: ### Lizenz -siehe [LICENSE](https://github.com/FriendsOfREDAXO/project_manager/blob/master/LICENSE) +siehe [LICENSE](https://github.com/alexplusde/project_manager_plus/blob/main/LICENSE) ### Autor -**Friends Of REDAXO** - -* http://www.redaxo.org -* https://github.com/FriendsOfREDAXO - **Projekt-Lead** -* [Ronny Kemmereit](https://github.com/rkemmere) -**Development-Team** -* [Ronny Kemmereit](https://github.com/rkemmere) -* [Pascal Schuchmann](https://github.com/pschuchmann) -* [Alexander Walther](https://github.com/alexplusde) +* [Alexander Walther](https://github.com/alexplusde) - - ### Credits -Großes Danke geht an [Alexander Walther](https://github.com/alexplusde) - alexplusde welcher uns eine gute Codebasis für die Erstellung des Addons zur Verfügung gestellt hat. +**Friends Of REDAXO** + +* +* + +**Ursprüngliches Entwickler-Team** +* [Ronny Kemmereit](https://github.com/rkemmere) +* [Pascal Schuchmann](https://github.com/pschuchmann) +* [Alexander Walther](https://github.com/alexplusde) diff --git a/assets/css/styles.css b/assets/css/styles.css deleted file mode 100644 index d84f5a1..0000000 --- a/assets/css/styles.css +++ /dev/null @@ -1,5 +0,0 @@ -.panel-body img { - max-width: 100%; -} - -.project_manager-tablesorter .rex-table-icon img {width: 16px;} \ No newline at end of file diff --git a/plugins/server/assets/favicon/redaxo-favicon.png b/assets/favicon/redaxo-favicon.png similarity index 100% rename from plugins/server/assets/favicon/redaxo-favicon.png rename to assets/favicon/redaxo-favicon.png diff --git a/boot.php b/boot.php index 1e6ef36..f8c729d 100644 --- a/boot.php +++ b/boot.php @@ -1,12 +1,82 @@ isAvailable()) { + rex_cronjob_manager::registerType('rex_cronjob_project_manager_plus_data'); + rex_cronjob_manager::registerType('rex_cronjob_project_manager_plus_favicon'); +} +// CRONJOB REGISTER +if (rex_addon::get('cronjob')->isAvailable()) { + rex_cronjob_manager::registerType('rex_cronjob_project_manager_plus_pagespeed'); +} + +// project_manager_plus_SERVER_DETAIL_HOOK +if (rex::isBackend() && rex::getUser()) { + + rex_extension::register('project_manager_plus_SERVER_DETAIL_HOOK', function (rex_extension_point $ep) { + + $exist = ''; + if ($ep->getSubject() != "") { + $exist = $ep->getSubject(); + } + + $params = $ep->getParams(); + $panel = include(rex_path::plugin('project_manager_plus', 'pagespeed', 'pages/content.pagespeed.php')); + + $fragment = new rex_fragment(); + $fragment->setVar('title', "PageSpeed", false); + $fragment->setVar('body', $panel, false); + $fragment->setVar('class', 'panel panel-info', false); + $fragment->setVar('domain', $params["domain"], false); + + $fragment->setVar('collapse', true); + $fragment->setVar('collapsed', true); + $pagespeed = '
'.$fragment->parse('core/page/section.php').'
'; + + return $exist.$pagespeed; + + }); + +} -/** @var rex_addon project_manager */ -// Addonrechte (permissions) registieren if (rex::isBackend() && is_object(rex::getUser())) { - rex_perm::register('project_manager[]'); + rex_perm::register('project_manager_plus_pagespeed[]'); +} +# +// CRONJOB REGISTER +if (rex_addon::get('cronjob')->isAvailable()) { + rex_cronjob_manager::registerType('rex_cronjob_project_manager_plus_hosting'); } -if (rex::isBackend() && rex_be_controller::getCurrentPagePart(1) == 'project_manager') { - rex_view::addCssFile($this->getAssetsUrl('css/styles.css')); +// project_manager_plus_SERVER_DETAIL_HOOK +if (rex::isBackend() && rex::getUser()) { + + rex_extension::register('project_manager_plus_SERVER_DETAIL_HOOK', function (rex_extension_point $ep) { + + $exist = ''; + if ($ep->getSubject() != "") { + $exist = $ep->getSubject(); + } + + $params = $ep->getParams(); + $panel = include(rex_path::plugin('project_manager_plus', 'hosting', 'pages/content.hosting.php')); + + $fragment = new rex_fragment(); + $fragment->setVar('title', "Hosting", false); + $fragment->setVar('body', $panel, false); + $fragment->setVar('class', 'panel panel-info', false); + $fragment->setVar('domain', $params["domain"], false); + + $fragment->setVar('collapse', true); + $fragment->setVar('collapsed', true); + $hosting = '
'.$fragment->parse('core/page/section.php').'
'; + + return $exist.$hosting; + + }, rex_extension::LATE); +} + + +if (rex::isBackend() && is_object(rex::getUser())) { + rex_perm::register('project_manager_plus_hosting[]'); } diff --git a/install.php b/install.php new file mode 100644 index 0000000..680505b --- /dev/null +++ b/install.php @@ -0,0 +1,186 @@ +ensurePrimaryIdColumn() +->ensureColumn(new rex_sql_column('name', 'varchar(255)', true)) +->ensureColumn(new rex_sql_column('domain', 'varchar(255)', true)) +->ensureColumn(new rex_sql_column('tags', 'text', true)) +->ensureColumn(new rex_sql_column('api_key', 'varchar(255)', true)) +->ensureColumn(new rex_sql_column('param', 'text', true)) +->ensureColumn(new rex_sql_column('is_ssl', 'tinyint', true)) +->ensureColumn(new rex_sql_column('description', 'text')) +->ensureColumn(new rex_sql_column('cms', 'tinyint', true)) +->ensureColumn(new rex_sql_column('maintenance', 'tinyint', true)) +->ensureColumn(new rex_sql_column('status', 'text')) +->ensureColumn(new rex_sql_column('createdate', 'timestamp', false, '0000-00-00 00:00:00')) +->ensureColumn(new rex_sql_column('updatedate', 'timestamp', false, '0000-00-00 00:00:00', 'on update CURRENT_TIMESTAMP')) +->removeColumn('logdate') +->ensure(); + +rex_sql_table::get(rex::getTable('project_manager_plus_logs')) + ->ensurePrimaryIdColumn() + ->ensureColumn(new rex_sql_column('domain_id', 'int(10) unsigned', false)) + ->ensureForeignKey(new rex_sql_foreign_key('domain_id', rex::getTable('project_manager_plus_domain'), ['domain_id' => 'id'])) + ->ensureColumn(new rex_sql_column('raw', 'longtext')) + ->ensureColumn(new rex_sql_column('createdate', 'timestamp', false, '0000-00-00 00:00:00', 'default CURRENT_TIMESTAMP')) + ->ensure(); + + +// Create cronjob +$now = new DateTime(); +$startdate = date('Y-m-d 00:00:00', strtotime("tomorrow")); + +$cronjob = rex_sql::factory(); +$cronjob->setDebug(false); +$cronjob->setQuery('SELECT id FROM '.rex::getTable('cronjob'). ' WHERE type LIKE "rex_cronjob_project_manager_plus_data"'); + +if ($cronjob->getRows() == 0) { + + $cronjob = rex_sql::factory(); + $cronjob->setDebug(false); + $cronjob->setTable(rex::getTable('cronjob')); + $cronjob->setValue('name', 'Projekt Manager: Domaindaten'); + $cronjob->setValue('description', ''); + $cronjob->setValue('type', 'rex_cronjob_project_manager_plus_data'); + $cronjob->setValue('interval', '{"minutes":[0],"hours":[0],"days":"all","weekdays":"all","months":"all"}'); + $cronjob->setValue('environment', '|backend|'); + $cronjob->setValue('execution_start', '1970-01-01 01:00:00'); + $cronjob->setValue('status', '1'); + $cronjob->setValue('parameters', '[]'); + $cronjob->setValue('nexttime', $startdate); + $cronjob->setValue('createdate', $now->format('Y-m-d H:i:s')); + $cronjob->setValue('updatedate', $now->format('Y-m-d H:i:s')); + $cronjob->setValue('createuser', rex::getUser()->getLogin()); + $cronjob->setValue('updateuser', rex::getUser()->getLogin()); + + try { + $cronjob->insertOrUpdate(); + echo rex_view::success('Der Cronjob "Projekt Manager: Domaindaten" wurde angelegt. '); + } catch (rex_sql_exception $e) { + echo rex_view::warning('Der Cronjob "Projekt Manager: Domaindaten" wurde nicht angelegt.
Wahrscheinlich existiert er schon.'); + } +} + +$cronjob = rex_sql::factory(); +$cronjob->setDebug(false); +$cronjob->setQuery('SELECT id FROM '.rex::getTable('cronjob'). ' WHERE type LIKE "rex_cronjob_project_manager_plus_favicon"'); + +if ($cronjob->getRows() == 0) { + + $cronjob = rex_sql::factory(); + $cronjob->setDebug(false); + $cronjob->setTable(rex::getTable('cronjob')); + $cronjob->setValue('name', 'Projekt Manager: Favicon'); + $cronjob->setValue('description', ''); + $cronjob->setValue('type', 'rex_cronjob_project_manager_plus_favicon'); + $cronjob->setValue('interval', '{"minutes":[0],"hours":[0],"days":"all","weekdays":"all","months":"all"}'); + $cronjob->setValue('environment', '|backend|'); + $cronjob->setValue('execution_start', '1970-01-01 01:00:00'); + $cronjob->setValue('status', '1'); + $cronjob->setValue('parameters', '[]'); + $cronjob->setValue('nexttime', $startdate); + $cronjob->setValue('createdate', $now->format('Y-m-d H:i:s')); + $cronjob->setValue('updatedate', $now->format('Y-m-d H:i:s')); + $cronjob->setValue('createuser', rex::getUser()->getLogin()); + $cronjob->setValue('updateuser', rex::getUser()->getLogin()); + + try { + $cronjob->insertOrUpdate(); + echo rex_view::success('Der Cronjob "Projekt Manager: Favicons" wurde angelegt. '); + } catch (rex_sql_exception $e) { + echo rex_view::warning('Der Cronjob "Projekt Manager: Favicons" wurde nicht angelegt.
Wahrscheinlich existiert er schon.'); + } +} +// Create tables +rex_sql_table::get(rex::getTable('project_manager_plus_domain_psi')) + //->ensurePrimaryIdColumn() + ->ensureColumn(new rex_sql_column('domain', 'varchar(255)', false, null, ''))->setPrimaryKey('domain') + ->ensureColumn(new rex_sql_column('raw', 'longtext', true)) + ->ensureColumn(new rex_sql_column('createdate', 'timestamp', false, '0000-00-00 00:00:00', 'on update CURRENT_TIMESTAMP')) + ->ensureColumn(new rex_sql_column('score_desktop', 'text')) + ->ensureColumn(new rex_sql_column('score_mobile', 'text')) + ->ensureColumn(new rex_sql_column('status', 'text')) + ->ensure(); + + +// Create cronjob +$now = new DateTime(); +$startdate = date('Y-m-d 00:00:00', strtotime("tomorrow")); + +$cronjob = rex_sql::factory(); +$cronjob->setDebug(true); +$cronjob->setQuery('SELECT id FROM '.rex::getTable('cronjob'). ' WHERE type LIKE "rex_cronjob_project_manager_plus_pagespeed"'); + +if ($cronjob->getRows() == 0) { + + $cronjob = rex_sql::factory(); + $cronjob->setDebug(true); + $cronjob->setTable(rex::getTable('cronjob')); + $cronjob->setValue('name', 'Projekt Manager: PageSpeed Daten'); + $cronjob->setValue('description', ''); + $cronjob->setValue('type', 'rex_cronjob_project_manager_plus_pagespeed'); + $cronjob->setValue('interval', '{"minutes":[0],"hours":[0],"days":"all","weekdays":"all","months":"all"}'); + $cronjob->setValue('environment', '|backend|'); + $cronjob->setValue('execution_start', '1970-01-01 01:00:00'); + $cronjob->setValue('status', '1'); + $cronjob->setValue('parameters', '[]'); + $cronjob->setValue('nexttime', $startdate); + $cronjob->setValue('createdate', $now->format('Y-m-d H:i:s')); + $cronjob->setValue('updatedate', $now->format('Y-m-d H:i:s')); + $cronjob->setValue('createuser', rex::getUser()->getLogin()); + $cronjob->setValue('updateuser', rex::getUser()->getLogin()); + + try { + $cronjob->insertOrUpdate(); + echo rex_view::success('Der Cronjob "Projekt Manager: PageSpeed Daten" wurde angelegt. '); + } catch (rex_sql_exception $e) { + echo rex_view::warning('Der Cronjob "Projekt Manager: PageSpeed Daten" wurde nicht angelegt.
Wahrscheinlich existiert er schon.'); + } +} + +// Create tables +rex_sql_table::get(rex::getTable('project_manager_plus_domain_hosting')) + //->ensurePrimaryIdColumn() + ->ensureColumn(new rex_sql_column('domain', 'varchar(255)', false, null, ''))->setPrimaryKey('domain') + ->ensureColumn(new rex_sql_column('raw', 'longtext', true)) + ->ensureColumn(new rex_sql_column('ip', 'text')) + ->ensureColumn(new rex_sql_column('createdate', 'timestamp', false, '0000-00-00 00:00:00', 'on update CURRENT_TIMESTAMP')) + ->ensureColumn(new rex_sql_column('status', 'text')) + ->ensure(); + + +// Create cronjob +$now = new DateTime(); +$startdate = date('Y-m-d 00:00:00', strtotime("tomorrow")); + +$cronjob = rex_sql::factory(); +$cronjob->setDebug(true); +$cronjob->setQuery('SELECT id FROM '.rex::getTable('cronjob'). ' WHERE type LIKE "rex_cronjob_project_manager_plus_hosting"'); + +if ($cronjob->getRows() == 0) { + + $cronjob = rex_sql::factory(); + $cronjob->setDebug(true); + $cronjob->setTable(rex::getTable('cronjob')); + $cronjob->setValue('name', 'Projekt Manager: Hosting Daten'); + $cronjob->setValue('description', ''); + $cronjob->setValue('type', 'rex_cronjob_project_manager_plus_hosting'); + $cronjob->setValue('interval', '{"minutes":[0],"hours":[0],"days":"all","weekdays":"all","months":"all"}'); + $cronjob->setValue('environment', '|backend|'); + $cronjob->setValue('execution_start', '1970-01-01 01:00:00'); + $cronjob->setValue('status', '1'); + $cronjob->setValue('parameters', '[]'); + $cronjob->setValue('nexttime', $startdate); + $cronjob->setValue('createdate', $now->format('Y-m-d H:i:s')); + $cronjob->setValue('updatedate', $now->format('Y-m-d H:i:s')); + $cronjob->setValue('createuser', rex::getUser()->getLogin()); + $cronjob->setValue('updateuser', rex::getUser()->getLogin()); + + try { + $cronjob->insertOrUpdate(); + echo rex_view::success('Der Cronjob "Projekt Manager: Hosting Daten" wurde angelegt. '); + } catch (rex_sql_exception $e) { + echo rex_view::warning('Der Cronjob "Projekt Manager: Hosting Daten" wurde nicht angelegt.
Wahrscheinlich existiert er schon.'); + } +} diff --git a/plugins/client/install.php b/install/pmp.tableset.json similarity index 100% rename from plugins/client/install.php rename to install/pmp.tableset.json diff --git a/lang/de_de.lang b/lang/de_de.lang index 3c4be2e..07cf8cb 100644 --- a/lang/de_de.lang +++ b/lang/de_de.lang @@ -1,13 +1,165 @@ -project_manager_title = Projekt Manager +# Project Manager Plus -project_manager_main = Info +project_manager_plus_title = Projekt Manager -project_manager_navigation = Navigation -project_manager_docs = Hilfe -project_manager_config = Einstellungen +project_manager_plus_main = Info -project_manager_config_save = Speichern -project_manager_config_saved = Gespeichert! -save = Speichern +project_manager_plus_navigation = Navigation +project_manager_plus_docs = Hilfe +project_manager_plus_config = Einstellungen -perm_general_project_manager[] = project_manager[] - Rechte für Projekt Manager \ No newline at end of file +project_manager_plus_config_save = Speichern +project_manager_plus_config_saved = Gespeichert! + +# Server + +project_manager_plus_server_menu_entry = Projekte + +#view +project_manager_plus_server_projects = Projekte +project_manager_plus_server_overview = Übersicht +project_manager_plus_server_config = Einstellungen +project_manager_plus_server_domain = Domain +project_manager_plus_server_api_key = API-Schlüssel +project_manager_plus_server_cms = REDAXO Hauptversion +project_manager_plus_server_update_content = Letzte Änderung + +project_manager_plus_server_updates_necessary = gefunden +project_manager_plus_server_updates = Updates +project_manager_plus_pm_client_version = Client +project_manager_plus_server_php_version = PHP +project_manager_plus_server_cms_version = Version +project_manager_plus_server_syslog = Syslog +project_manager_plus_server_is_ssl = SSL +project_manager_plus_server_select_project = Projekt wählen +project_manager_plus_server_syslog_code_1 = Keine Syslog Einträge +project_manager_plus_server_syslog_code_2 = Syslog Einträge vorhanden +project_manager_plus_server_status_code_0 = Falscher API-Schlüssel +project_manager_plus_server_status_code_1 = Status Ok +project_manager_plus_server_status_code_minus_1 = Abruf fehlerhaft +project_manager_plus_server_maintenance_0 = Kein Wartungsvertrag +project_manager_plus_server_maintenance_1 = Wartungsvertrag vorhanden +project_manager_plus_server_maintenance_2 = Keine Info über Wartungsvertrag + + +#add +project_manager_plus_add_domain = Domain hinzufügen +project_manager_plus_server_project_added = Projekt hinzugefügt +project_manager_plus_server_no_name_defined = Bitte Projektnamen eingeben! +project_manager_plus_server_name_already_defined = Projektname existiert bereits! +project_manager_plus_server_no_domain_defined = Bitte Domain eingeben! +project_manager_plus_server_domain_already_defined = Domain existiert bereits! + +#del +project_manager_plus_server_project_deleted = Projekt gelöscht + +project_manager_plus_server_name = Projektname + +#edit +project_manager_plus_server_edit_domain = Domain editieren +project_manager_plus_server_name_info = Bitte Namen des Projekts eingeben! +project_manager_plus_server_domain_info = Bitte Domain des Projekts eingeben! +project_manager_plus_server_api_key_info = API-Schlüssel +project_manager_plus_server_api_key_notice = Redaxo 5 API-Schlüssel, z.B. 83f15d69755585c3a825c3eccf2d654fc6578dadb7e05475, bei Redaxo 4 Instanzen legacy +project_manager_plus_server_param = Parameter +project_manager_plus_server_param_notice = Optionale Paramenter, z.B. param1=value1,param2=value2 +project_manager_plus_server_ssl = SSL Verbindung +project_manager_plus_server_tags = Tags +project_manager_plus_server_maintenance = Wartungsvertrag? +project_manager_plus_server_maintenance_short = WV + +#detail +project_manager_plus_server_project_detail = Details +project_manager_plus_server_project_choose = Projekt wählen + +project_manager_plus_cronjob_favicon_name = Projekt Manager: Hole Favicon +project_manager_plus_cronjob_data_name = Projekt Manager: Hole Domaindaten + +perm_general_project_manager_plus_server[] = project_manager_plus_server[] - Rechte für Projekt Manager Server Konfiguration + + +#config +project_manager_plus_server_title = Einstellungen +project_manager_plus_server_min_headline = Mindestanforderungen +project_manager_plus_server_php_min = PHP Version +project_manager_plus_server_cms_4_min = Redaxo 4 Version +project_manager_plus_server_cms_min = Redaxo 5 Version +project_manager_plus_server_config_saved_successful = Einstellungen gespeichert! +project_manager_plus_server_min_color = Farbe +project_manager_plus_server_color_notice = Farbe bitte als HEX #F1F1F1 oder als RGBA angeben rgba(0,0,0,0.1) +project_manager_plus_server_configuration = Einstellungen +project_manager_plus_server_skip_addon = Addons ausschließen +project_manager_plus_server_skip_addon_version = Versionen ausschließen +project_manager_plus_server_skip_addon_notice = Addon wird bei der Prüfung nicht berücksichtigt. z.B. structure_tweaks, modulsammlung +project_manager_plus_server_skip_addon_version_notice = Addonversion wird bei der Prüfung nicht berücksichtigt. z.B. beta, dev, rc + + +#validate +no_name_defined = Kein Projektname angegeben! +no_domain_defined = Keine Domain angegeben! + +# Client + + +client_navigation_title = Navigation [ main_navi.md ] +client_content_title = Inhalt [ {0} ] + +client_noparser = Kein Markdown-Parser vorhanden! Bitte zuerst einen Parser installieren (Addon markitup oder textile) + +client_navinotfound = Navigations-Datei {0} wurde nicht gefunden!
Diese Datei ist zwingend erforderlich! +client_filenotfound = Datei {0} wurde nicht gefunden. Inhalt existiert (noch) nicht.

Wir freuen uns über Mithilfe: {1} + +project_manager_plus_client_menu_entry = Client +project_manager_plus_client_page_entry = Einstellungen +project_manager_plus_client_title = Einstellungen +project_manager_plus_client_readme = Hilfe +project_manager_plus_api_key_title = Client +project_manager_plus_api_key_label = API-Schlüssel +project_manager_plus_api_key_notice = API-Schlüssel aus Server Plugin eintragen, z.B. +project_manager_plus_save = Speichern + +# Page Speed + +perm_general_project_manager_plus_client[] = project_manager_plus_client[] - Rechte für Projekt Manager Client + +project_manager_plus_pagespeed_menu_entry = PageSpeed + +project_manager_plus_pagespeed_projects = Projekte +project_manager_plus_pagespeed_title = Übersicht +project_manager_plus_pagespeed_config = Einstellungen +project_manager_plus_pagespeed_api_key_title = Einstellungen +project_manager_plus_pagespeed_api_key_label = PageSpeed API-Schlüssel +project_manager_plus_pagespeed_api_key_notice = PageSpeed API-Schlüssel, z.B. AIzaSyCp0Em_UPY78238es-9CZViEbq7CB_zcFBs +project_manager_plus_pagespeed_domain_norows_message = Kein Projekt vorhanden +project_manager_plus_cronjob_pagespeed_name = Projekt Manager: Hole Pagespeed Daten + + +project_manager_plus_pagespeed_name = Projektname +project_manager_plus_pagespeed_domain = Domain +project_manager_plus_pagespeed_updatedate = Letzte Änderung +project_manager_plus_pagespeed_logdate = Letzter Datenfetch +project_manager_plus_pagespeed_domain_norows_message = Keine Einträge vorhanden + +perm_general_project_manager_plus_pagespeed[] = project_manager_plus_pagespeed[] - Rechte für Projekt Manager PageSpeed + +# Hosting + +project_manager_plus_hosting_menu_entry = Hosting + +project_manager_plus_hosting_projects = Projekte +project_manager_plus_hosting_title = Übersicht +project_manager_plus_hosting_domain_norows_message = Kein Projekt vorhanden +project_manager_plus_cronjob_hosting_name = Projekt Manager: Hole Hosting Daten + +project_manager_plus_hosting_name = Projektname +project_manager_plus_hosting_domain = Domain +project_manager_plus_hosting_createdate = Letzte Änderung +project_manager_plus_hosting_ip = IPv4-Adresse +project_manager_plus_hosting_is_ssl = SSL +project_manager_plus_hosting_organisation = Organisation +project_manager_plus_hosting_isp = ISP +project_manager_plus_hosting_domain_norows_message = Keine Einträge vorhanden +project_manager_plus_hosting_validTo = Zertifikat Enddatum +project_manager_plus_hosting_validFrom = Zertifikat Startdatum + +perm_general_project_manager_plus_hosting[] = project_manager_plus_hosting[] - Rechte für Projekt Manager Hosting diff --git a/lang/en_gb.lang b/lang/en_gb.lang deleted file mode 100644 index d4bbb64..0000000 --- a/lang/en_gb.lang +++ /dev/null @@ -1,13 +0,0 @@ -project_manager_title = Project Manager - -project_manager_main = Info - -project_manager_navigation = Navigation -project_manager_docs = Help -project_manager_config = Settings - -project_manager_config_save = Save -project_manager_config_saved = Saved! -save = Save - -perm_general_project_manager[] = project_manager[] - Perms for Project Manager \ No newline at end of file diff --git a/lang/es_es.lang b/lang/es_es.lang deleted file mode 100644 index 80d9a3a..0000000 --- a/lang/es_es.lang +++ /dev/null @@ -1,14 +0,0 @@ -project_manager_title = Gestor de proyectos - -project_manager_main = Información - -project_manager_navigation = Navegación -project_manager_docs = Ayuda -project_manager_config = Ajustes - -project_manager_config_save = Guardar -project_manager_config_saved = Guardado! -save = Guardar - -perm_general_project_manager[] = project_manager[] - Derechos -perm_general_project_manager[config] = project_manager[config] - Derechos para la configuración \ No newline at end of file diff --git a/lang/pt_br.lang b/lang/pt_br.lang deleted file mode 100644 index 3f183bc..0000000 --- a/lang/pt_br.lang +++ /dev/null @@ -1,13 +0,0 @@ -project_manager_title = Gestor de projeto - -project_manager_main = Info - -project_manager_navigation = Navegação -project_manager_docs = Ajuda -project_manager_config = Configurações - -project_manager_config_save = Guardar -project_manager_config_saved = Guardado! - -perm_general_project_manager[] = project_manager[] - Direitos -perm_general_project_manager[config] = project_manager[config] - Direitos de configurações \ No newline at end of file diff --git a/lang/sv_se.lang b/lang/sv_se.lang deleted file mode 100644 index a049f33..0000000 --- a/lang/sv_se.lang +++ /dev/null @@ -1,13 +0,0 @@ -project_manager_title = Projektledare - -project_manager_main = Info - -project_manager_navigation = Navigering -project_manager_docs = Hjälp -project_manager_config = Konfiguraion - -project_manager_config_save = Spara -project_manager_config_saved = Inställningarna har sparats! -save = Spara - -perm_general_project_manager[] = project_manager[] - Rättigheter \ No newline at end of file diff --git a/lib/Api/Manager.php b/lib/Api/Manager.php new file mode 100644 index 0000000..539e902 --- /dev/null +++ b/lib/Api/Manager.php @@ -0,0 +1,164 @@ +getProperty('version'); + $params['client_version'] = rex_addon::get('project_manager_plus')->getProperty('version'); + $params['rex_version'] = rex::getVersion(); + $params['cms'] = "REDAXO"; + $params['cms_version'] = rex::getVersion(); + $params['rex_url_backend'] = rex_url::backend(); + $params['php_version'] = phpversion(); + $params['mysql_version'] = rex_sql::getServerVersion(); + $params['status'] = 1; + $params['debug'] = rex::isDebugMode(); + + # / REDAXO / SERVER / ALLGEMEIN + + # ADDONS + + $rex_addons = rex_addon::getInstalledAddons(); + + rex_install_webservice::deleteCache(); + + try { + $installer_addons = rex_install_packages::getAddPackages(); + } catch (rex_functional_exception $e) { + $params['message'][] = $e->getMessage(); + } + + foreach ($rex_addons as $key => $addon) { + $params['rex_addons'][$key]['name'] = $addon->getName(); + $params['rex_addons'][$key]['install'] = $addon->getProperty('install'); + $params['rex_addons'][$key]['status'] = $addon->getProperty('status'); + $params['rex_addons'][$key]['version_current'] = $addon->getProperty('version'); + if (!empty($installer_addons[$key])) { + $params['rex_addons'][$key]['version_latest'] = current($installer_addons[$key]["files"])["version"]; + } else { + $params['rex_addons'][$key]['version_latest'] = 0; + } + } + + # / ADDONS + + # DOMAINS / WEBSITES + + $params['domains'][rex::getServer()]['name'] = rex::getServer(); + $params['domains'][rex::getServer()]['url'] = rex_getUrl(rex_article::getSiteStartArticleId()); + $params['domains'][rex::getServer()]['url_404'] = rex_getUrl(rex_article::getNotfoundArticleId()); + + if (rex_addon::get('yrewrite')->isAvailable()) { + + $yrewrite_domains = rex_yrewrite::getDomains(true); + foreach ($yrewrite_domains as $key => $domain) { + $params['domains'][$key]['name'] = $domain->getName(); + $params['domains'][$key]['url'] = $domain->getUrl(); + $params['domains'][$key]['url_404'] = rex_yrewrite::getFullUrlByArticleId($domain->getNotfoundId()); + } + } + + # / DOMAINS / WEBSITES + + # SYSLOG + + if (version_compare(rex::getVersion(), '5.9') >= 0) { + $log = new rex_log_file(rex_path::log('system.log')); + } else { + $log = new rex_log_file(rex_path::coreData('system.log')); + } + + $i = 0; + foreach (new LimitIterator($log, 0, 30) as $entry) { + $data = $entry->getData(); + $params['syslog'][$i]['timestamp'] = $entry->getTimestamp('%d.%m.%Y %H:%M:%S'); + $params['syslog'][$i]['syslog_type'] = $data[0]; + $params['syslog'][$i]['syslog_message'] = $data[1]; + $params['syslog'][$i]['syslog_file'] = (isset($data[2]) ? $data[2] : ''); + $params['syslog'][$i]['syslog_line'] = (isset($data[3]) ? $data[3] : ''); + $i++; + } + + # / SYSLOG + + + # USER + $params['user'] = rex_sql::factory()->getArray('SELECT `name`, `login`, `email`, `status`, `admin`, `lasttrydate`, `lastlogin` FROM '.rex::getTablePrefix().'user ORDER BY `admin`, `id`'); + # / USER + + # TODO: Letzte Artikel + $params['article'] = rex_sql::factory()->getArray('SELECT `name`, `updateuser`, `updatedate`, `pid` FROM `'.rex::getTablePrefix().'article` ORDER BY `updatedate` DESC LIMIT 10'); + # / Letzte Artikel + + # TODO: Letzte Medien + $params['media'] = rex_sql::factory()->getArray('SELECT `filename`, `updateuser`, `updatedate` FROM `'.rex::getTablePrefix().'media` ORDER BY `updatedate` DESC LIMIT 10'); + # / Letzte Medien + + # Modules + $params['module'] = rex_sql::factory()->getArray('SELECT `name`, `updateuser`, `updatedate` FROM `'.rex::getTablePrefix().'module` ORDER BY `name` ASC'); + # / Modules + } + + + + } else { + $params['pm_version'] = rex_addon::get('project_manager_plus')->getProperty('version'); + $params['cms'] = "REDAXO"; + $params['status'] = 0; + $params['message'][] = "Falscher API-Schlüssel."; + } + + // TODO: EP, um weitere Parameter einzuhängen + + header('Content-Type: application/json; charset=UTF-8'); + $response = json_encode($params, true); + echo $response; + exit(); + } +} diff --git a/lib/Api/Server.php b/lib/Api/Server.php new file mode 100644 index 0000000..67c3488 --- /dev/null +++ b/lib/Api/Server.php @@ -0,0 +1,167 @@ + true, + CURLOPT_AUTOREFERER => true, + CURLOPT_MAXREDIRS => 5, + CURLOPT_HEADER => false, + CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_SSL_VERIFYHOST => false, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0', + CURLOPT_TIMEOUT => 5, + CURLOPT_URL => $url + )); + $resp = curl_exec($curl); + + $json = json_decode($resp, true); + + if (json_last_error() === JSON_ERROR_NONE && $json !== null) { + if ($json['delLog'] == 1) { + $params['delLog'] = 1; + } + } else { + $params['delLog'] = -1; + } + + // reload data + $url = $protocol.urlencode($domain)."/index.php?rex-api-call=project_manager_plus&api_key=".$api_key.'&t='.$timestamp.$param; + $curl = curl_init(); + curl_setopt_array($curl, array( + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_AUTOREFERER => true, + CURLOPT_MAXREDIRS => 5, + CURLOPT_HEADER => false, + CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_SSL_VERIFYHOST => false, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0', + CURLOPT_TIMEOUT => 5, + CURLOPT_URL => $url + )); + + $response = curl_exec($curl); + $resp = $response; + $json = json_decode($resp, true); + + $project_manager_plus_domain = rex_sql::factory()->setDebug(0)->getArray('SELECT * FROM ' . rex::getTable('project_manager_plus_domain') . ' WHERE domain = ? LIMIT 1', [$domain]); + + if (json_last_error() === JSON_ERROR_NONE && $json !== null) { + + if ($json['status'] == 1) { + + rex_sql::factory()->setDebug(0)->setQuery('INSERT INTO ' . rex::getTable('project_manager_plus_logs') . ' (`domain_id`, `createdate`, `raw`) VALUES(?,NOW(),?)', [$project_manager_plus_domain[0]['id'], $resp]); + // SET STATUS + rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_plus_domain') . " SET status = ?, updatedate = NOW() WHERE id = ?", [1, $project_manager_plus_domain[0]['id']]); + + } else { + // SET STATUS + rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_plus_domain') . " SET status = ?, updatedate = NOW()WHERE id = ?", [0, $project_manager_plus_domain[0]['id']]); + } + + } else { + // SET STATUS + rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_plus_domain') . " SET status = ?, updatedate = NOW() WHERE id = ?", [-1, $project_manager_plus_domain[0]['id']]); + } + rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_plus_domain') . " SET updatedate = NOW() WHERE id = ?", [$project_manager_plus_domain[0]['id']]); + + } + + if ($func == "updateData") { + + // reload data + $url = $protocol.urlencode($domain)."/index.php?rex-api-call=project_manager_plus&api_key=".$api_key.'&t='.$timestamp.$param; + $curl = curl_init(); + curl_setopt_array($curl, array( + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_AUTOREFERER => true, + CURLOPT_MAXREDIRS => 5, + CURLOPT_HEADER => false, + CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_SSL_VERIFYHOST => false, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_TIMEOUT => 5, + CURLOPT_URL => $url + )); + + $response = curl_exec($curl); + $resp = $response; + $json = json_decode($resp, true); + $json_result = json_encode($json); + + Logger::deleteFile($domain); + Logger::init($domain); + Logger::log($domain . ' Abruf gestartet', 'Project Manager Server'); + Logger::log($json_result . ' -> Response', 'Project Manager Server'); + + $project_manager_plus_domain = rex_sql::factory()->setDebug(0)->getArray('SELECT * FROM ' . rex::getTable('project_manager_plus_domain') . ' WHERE domain = ? LIMIT 1', [$domain]); + + if (json_last_error() === JSON_ERROR_NONE && $json !== null) { + + if ($json['status'] == 1) { + + rex_sql::factory()->setDebug(0)->setQuery('INSERT INTO ' . rex::getTable('project_manager_plus_logs') . ' (`domain_id`, `createdate`, `raw`) VALUES(?,NOW(),?)', [$project_manager_plus_domain[0]['id'], $resp]); + // SET STATUS + rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_plus_domain') . " SET status = ?, updatedate = NOW() WHERE id = ?", [1, $project_manager_plus_domain[0]['id']]); + + //WRITE LOGFILE + Logger::log('Status 1', 'Project Manager Server'); + + } else { + // SET STATUS + rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_plus_domain') . " SET status = ?, updatedate = NOW()WHERE id = ?", [0, $project_manager_plus_domain[0]['id']]); + + // WRITE LOGFILE + Logger::log('Status 0', 'Project Manager Server'); + } + + } else { + // SET STATUS + rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_plus_domain') . " SET status = ?, updatedate = NOW() WHERE id = ?", [-1, $project_manager_plus_domain[0]['id']]); + + //WRITE LOGFILE + Logger::log('Status -1', 'Project Manager Server'); + } + rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_plus_domain') . " SET updatedate = NOW() WHERE id = ?", [$project_manager_plus_domain[0]['id']]); + + } + + header('Content-Type: application/json; charset=UTF-8'); + $response = json_encode($params, true); + echo $response; + exit(); + + } +} diff --git a/lib/Cronjob/Client.php b/lib/Cronjob/Client.php new file mode 100644 index 0000000..9d96a16 --- /dev/null +++ b/lib/Cronjob/Client.php @@ -0,0 +1,141 @@ +setDebug(0)->getArray('SELECT * FROM ' . rex::getTable('project_manager_plus_domain') . ' ORDER BY updatedate asc'); + + /* Addon-Abruf */ + $multi_curl = curl_multi_init(); + $resps = array(); + $options = array( + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_AUTOREFERER => true, + CURLOPT_MAXREDIRS => 5, + CURLOPT_HEADER => false, + CURLOPT_SSL_VERIFYPEER => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0', + CURLOPT_TIMEOUT => 5 // seconds + ); + foreach ($websites as $website) { + + $domain = $website['domain']; + $cms = $website['cms']; + $ssl = $website['is_ssl']; + $param = $website['param']; + $param = explode(',', $param); + $param = '&'.implode('&', $param); + $protocol = ($ssl == 1) ? "https://" : "http://"; + + $timestamp = time(); + + $url = $protocol.urlencode($domain)."/index.php?rex-api-call=project_manager_plus&api_key=".$website['api_key'].'&t='.$timestamp.$param; + + if ($cms == 5) { + $url = $protocol.urlencode($domain)."/index.php?rex-api-call=project_manager_plus&api_key=".$website['api_key'].'&t='.$timestamp.$param; + } + + $resps[$domain] = curl_init($url); + curl_setopt_array($resps[$domain], $options); + curl_multi_add_handle($multi_curl, $resps[$domain]); + + } + + $active = null; + + do { + $mrc = curl_multi_exec($multi_curl, $active); + } while ($mrc == CURLM_CALL_MULTI_PERFORM); + + while ($active && $mrc == CURLM_OK) { + if (curl_multi_select($multi_curl) != -1) { + do { + $mrc = curl_multi_exec($multi_curl, $active); + } while ($mrc == CURLM_CALL_MULTI_PERFORM); + } + } + + + + foreach ($resps as $domain => $response) { + + $resp = curl_multi_getcontent($response); + curl_multi_remove_handle($multi_curl, $response); + + $json = json_decode($resp, true); + $json_result = json_encode($json); + + Logger::deleteFile($domain); + Logger::init($domain); + Logger::log($domain . ' Abruf gestartet', 'Project Manager Server'); + Logger::log($json_result . ' -> Response', 'Project Manager Server'); + + $project_manager_plus_domain = rex_sql::factory()->setDebug(0)->getArray('SELECT * FROM ' . rex::getTable('project_manager_plus_domain') . ' WHERE domain = ? LIMIT 1', [$domain]); + + if (json_last_error() === JSON_ERROR_NONE && $json !== null) { + + if ($json['status'] == 1) { + + rex_sql::factory()->setDebug(0)->setQuery('DELETE FROM ' . rex::getTable('project_manager_plus_logs') . ' WHERE domain_id = ?', [$project_manager_plus_domain[0]['id']]); + + rex_sql::factory()->setDebug(0)->setQuery('INSERT INTO ' . rex::getTable('project_manager_plus_logs') . ' (`domain_id`, `createdate`, `raw`) VALUES(?,NOW(),?)', [$project_manager_plus_domain[0]['id'], $resp]); + // SET STATUS + rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_plus_domain') . " SET status = ?, updatedate = NOW() WHERE id = ?", [1, $project_manager_plus_domain[0]['id']]); + + //WRITE LOGFILE + Logger::log('Status 1', 'Project Manager Server'); + + + } else { + // SET STATUS + rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_plus_domain') . " SET status = ?, updatedate = NOW()WHERE id = ?", [0, $project_manager_plus_domain[0]['id']]); + + // WRITE LOGFILE + Logger::log('Status 0', 'Project Manager Server'); + + } + + } else { + + // SET STATUS + rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_plus_domain') . " SET status = ?, updatedate = NOW() WHERE id = ?", [-1, $project_manager_plus_domain[0]['id']]); + + //WRITE LOGFILE + Logger::log('Status -1', 'Project Manager Server'); + + + } + + rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_plus_domain') . " SET updatedate = NOW() WHERE id = ?", [$project_manager_plus_domain[0]['id']]); + + //WRITE LOGFILE + + + } + + curl_multi_close($multi_curl); + + return true; + + } + public function getTypeName() + { + return rex_i18n::msg('project_manager_plus_cronjob_data_name'); + } + + public function getParamFields() + { + return []; + } +} diff --git a/lib/Cronjob/Favicon.php b/lib/Cronjob/Favicon.php new file mode 100644 index 0000000..b89522c --- /dev/null +++ b/lib/Cronjob/Favicon.php @@ -0,0 +1,187 @@ +setDebug(0)->getArray("SELECT * FROM " . rex::getTable('project_manager_plus_domain') . " ORDER BY updatedate asc "); + $multi_curl = curl_multi_init(); + $ch = []; + + foreach ($domains as $domain) { + + $ssl = $domain['is_ssl']; + $protocol = ($ssl == 1) ? "https://" : "http://"; + $ch[$domain['domain']] = curl_init(); + $fp[$domain['domain']] = fopen(rex_path::pluginAssets('project_manager_plus', 'server', 'favicon/'.$domain['domain'].'.png'), 'w+'); + //curl_setopt($ch[$domain['domain']], CURLOPT_URL, "https://www.google.com/s2/u/0/favicons?domain=".$domain['domain']."&sz=64"); + + $faviconUrl = self::getFavicon($protocol.$domain['domain']); + + if (is_array($faviconUrl)) { + $favicon = $faviconUrl[0]; + } else { + $favicon = $faviconUrl; + } + + if ($favicon == 'FALSE') { + $favicon = rex::getServer().'/assets/addons/project_manager_plus/plugins/server/favicon/redaxo-favicon.png'; + } + + curl_setopt($ch[$domain['domain']], CURLOPT_URL, $favicon); + + curl_setopt($ch[$domain['domain']], CURLOPT_FOLLOWLOCATION, true); + curl_setopt($ch[$domain['domain']], CURLOPT_HEADER, 0); + curl_setopt($ch[$domain['domain']], CURLOPT_FILE, $fp[$domain['domain']]); + curl_multi_add_handle($multi_curl, $ch[$domain['domain']]); + + } + $active = null; + do { + curl_multi_exec($multi_curl, $active); + } while ($active > 0); + + foreach ($domains as $domain) { + curl_multi_remove_handle($multi_curl, $ch[$domain['domain']]); + fwrite($fp[$domain['domain']], ""); + fclose($fp[$domain['domain']]); + } + + curl_multi_close($multi_curl); + + return true; + + } + public function getTypeName() + { + return rex_i18n::msg('project_manager_plus_cronjob_favicon_name'); + } + + public function getParamFields() + { + return []; + } + + public function getFavicon($url) + { + + $file_headers = @get_headers($url); + $found = false; + // 1. CHECK THE DOM FOR THE TAG + // check if the url exists - if the header returned is not 404 + if ($file_headers[0] != 'HTTP/1.1 404 Not Found') { + $dom = new \DOMDocument(); + $dom->strictErrorChecking = false; + @$dom->loadHTMLfile($url); //@ to discard all the warnings of malformed htmls + if (!$dom) { + // $error[]='Error parsing the DOM of the file'; + } else { + + if (!is_null($dom->baseURI)) { + $domxml = simplexml_import_dom($dom); + } + + if ($domxml) { + + //check for the historical rel="shortcut icon" + if ($domxml->xpath('//link[@rel="shortcut icon"]')) { + $path = $domxml->xpath('//link[@rel="shortcut icon"]'); + $faviconURL = $path[0]['href']; + # check if absolute url or relative path + $favicon_elems = parse_url($faviconURL); + # if relative + if (!isset($favicon_elems['host'])) { + $faviconURL = $url . $faviconURL; + } + + $favicon_headers = @get_headers($faviconURL); + if (is_array($favicon_headers)) { + if (!in_array('HTTP/1.1 404 Not Found', $favicon_headers)) { + $found == true; + return $faviconURL; + } + } + + //check for the HTML5 rel="icon" + } elseif ($domxml->xpath('//link[@rel="icon"]')) { + $path = $domxml->xpath('//link[@rel="icon"]'); + $faviconURL = $path[0]['href']; + # check if absolute url or relative path + $favicon_elems = parse_url($faviconURL); + # if relative + if (!isset($favicon_elems['host'])) { + $faviconURL = $url . $faviconURL; + } + + $favicon_headers = @get_headers($faviconURL); + if (is_array($favicon_headers)) { + if (!in_array('HTTP/1.1 404 Not Found', $favicon_headers)) { + $found == true; + return $faviconURL; + } + } + + } else { + //$error[]="The URL does not contain a favicon tag."; + } + + if ($found == false) { + return 'FALSE'; + } + + } + + + } + + + // 2. CHECK DIRECTLY FOR favicon.ico OR favicon.png FILE + // the two seem to be most common + if ($found == false) { + $parse = parse_url($url); + $favicon_headers = @get_headers("http://".$parse['host']."/favicon.ico"); + if ($favicon_headers[0] != 'HTTP/1.1 404 Not Found') { + $faviconURL = "/favicon.ico"; + $favicon_elems = parse_url($faviconURL); + # if relative + if (!isset($favicon_elems['host'])) { + $faviconURL = $url . $faviconURL; + } + $found == true; + return $faviconURL; + } + $favicon_headers = @get_headers("http://".$parse['host']."/favicon.png"); + if ($favicon_headers[0] != 'HTTP/1.1 404 Not Found') { + $faviconURL = "/favicon.png"; + $favicon_elems = parse_url($faviconURL); + # if relative + if (!isset($favicon_elems['host'])) { + $faviconURL = $url . $faviconURL; + } + $found == true; + return $faviconURL; + } + if ($found == false) { + //$error[]= "Files favicon.ico and .png do not exist on the server's root."; + } + } + // if the URL does not exists ... + } else { + // $error[]="URL does not exist"; + } + + if ($found == false && isset($error)) { + return $error; + } + } +} diff --git a/lib/Cronjob/Hosting.php b/lib/Cronjob/Hosting.php new file mode 100644 index 0000000..3fd21a7 --- /dev/null +++ b/lib/Cronjob/Hosting.php @@ -0,0 +1,138 @@ +setDebug(0)->getArray('SELECT D.domain AS domain, D.is_ssl as is_ssl FROM + (SELECT domain, createdate FROM rex_project_manager_plus_domain_hosting) AS H + RIGHT JOIN + (SELECT domain, updatedate, is_ssl FROM rex_project_manager_plus_domain) AS D + ON + H.domain = D.domain + GROUP BY D.domain + ORDER BY H.createdate ASC'); + + + $message = ''; + $error = false; + + foreach ($websites as $website) { + + // because call limit ip-api.com + usleep(800000); + $domain = $website['domain']; + $ip = gethostbyname(idn_to_ascii($domain, INTL_IDNA_VARIANT_UTS46)); + $url = 'http://ip-api.com/json/'.$ip; + + $ch = curl_init(); + + $options = array( + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_AUTOREFERER => true, + CURLOPT_MAXREDIRS => 4, + CURLOPT_HEADER => false, + CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_TIMEOUT => 10, + CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0', + CURLOPT_URL => $url + ); + + curl_setopt_array($ch, $options); + $resps[$domain .";hosting"] = curl_exec($ch); + + curl_close($ch); + + if ($website['is_ssl']) { + $prefix = "https://"; + + // SSL Certificate + set_error_handler(function () {return true;}); + $orignal_parse = parse_url($prefix.$domain, PHP_URL_HOST); + $get = stream_context_create(array("ssl" => array("capture_peer_cert" => true))); + $read = stream_socket_client("ssl://".$orignal_parse.":443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $get); + $cert = stream_context_get_params($read); + restore_error_handler(); + $certinfo = openssl_x509_parse($cert['options']['ssl']['peer_certificate']); + + $arr = json_decode($resps[$domain .";hosting"], true); + $arr['validFrom'] = $certinfo['validFrom_time_t']; + $arr['validTo'] = $certinfo['validTo_time_t']; + $resps[$domain .";hosting"] = json_encode($arr); + + } else { + + $arr = json_decode($resps[$domain .";hosting"], true); + $arr['validFrom'] = "-"; + $arr['validTo'] = "-"; + $resps[$domain .";hosting"] = json_encode($arr); + + } + + } + + foreach ($resps as $key => $response) { + + $domain = explode(";", $key)[0]; + $mode = explode(";", $key)[1]; + + $hosting = json_decode($response, true); + $ip = ''; + $ip = gethostbyname(idn_to_ascii($domain)); + + if (json_last_error() === JSON_ERROR_NONE && (!array_key_exists("message", $hosting))) { + if ($mode == "hosting") { + + rex_sql::factory()->setDebug(0)->setQuery('INSERT INTO ' . rex::getTable('project_manager_plus_domain_hosting') . ' (`domain`, `raw`, `createdate`, `ip`, `status`) VALUES(:domain, :response, NOW(), :ip, 1) + ON DUPLICATE KEY UPDATE domain = :domain, `raw` = :response, createdate = NOW(), `ip` = :ip, `status` = 1', [":domain" => $domain, ":response" => $response, ":ip" => $ip]); + + } + } else { + + // ERROR HANDLE + if ($mode == "hosting") { + + rex_sql::factory()->setDebug(0)->setQuery('INSERT INTO ' . rex::getTable('project_manager_plus_domain_hosting') . ' (`domain`, `raw`, `createdate`, `ip`, `status`) VALUES(:domain, :response, NOW(), :ip, -1) + ON DUPLICATE KEY UPDATE domain = :domain, `raw` = :response, createdate = NOW(), `ip` = :ip, `status` = -1', [":domain" => $domain, ":response" => $response, ":ip" => $ip]); + + } + + $message .= $domain.': '.$hosting['status'].' '.$hosting['message'].'\n'; + $error = true; + + } + } + + + + + if ($error === true) { + $this->setMessage($message); + return false; + } else { + return true; + } + + return true; + } + + public function getTypeName() + { + return rex_i18n::msg('project_manager_plus_cronjob_hosting_name'); + } + + public function getParamFields() + { + return []; + } +} diff --git a/lib/Cronjob/PageSpeed.php b/lib/Cronjob/PageSpeed.php new file mode 100644 index 0000000..a8fa958 --- /dev/null +++ b/lib/Cronjob/PageSpeed.php @@ -0,0 +1,148 @@ +setDebug(0)->getArray('SELECT count(*) as count FROM rex_project_manager_plus_domain'); + if ($count[0]['count'] <= 10) { + $count = 1; + } else { + $count = $count[0]['count'] / 10; + $count = round($count, 0, PHP_ROUND_HALF_UP); + } + + for ($i = 0; $i < $count; $i++) { + $this->getData(); + } + + return true; + + } + + public function getData() + { + + $websites = rex_sql::factory()->setDebug(0)->getArray('SELECT D.domain AS domain, D.is_ssl as is_ssl FROM + (SELECT domain, createdate FROM rex_project_manager_plus_domain_psi) AS PSI + RIGHT JOIN + (SELECT domain, updatedate, is_ssl FROM rex_project_manager_plus_domain) AS D + ON + PSI.domain = D.domain + GROUP BY D.domain + ORDER BY PSI.createdate ASC LIMIT 10'); + + $error = false; + $multi_curl = curl_multi_init(); + $resps = array(); + $options = array( + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_AUTOREFERER => true, + CURLOPT_MAXREDIRS => 4, + CURLOPT_HEADER => false, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0', + CURLOPT_TIMEOUT => 30 // seconds + ); + + foreach ($websites as $website) { + + $fstreams = array(); + + $domain = $website['domain']; + if ($website['is_ssl']) { + $prefix = "https://"; + } else { + $prefix = "http://"; + } + + $url_desktop = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed?filter_third_party_resources=false&locale=de_DE&screenshot=true&snapshots=false&strategy=desktop&key='.rex_config::get('project_manager_plus/pagespeed', 'project_manager_plus_pagespeed_api_key').'&url='.urlencode($prefix.$website['domain']); + $url_mobile = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed?filter_third_party_resources=false&locale=de_DE&screenshot=true&snapshots=false&strategy=mobile&key='.rex_config::get('project_manager_plus/pagespeed', 'project_manager_plus_pagespeed_api_key').'&url='.urlencode($prefix.$website['domain']); + $resps[$domain.";mobile"] = curl_init($url_mobile); + $resps[$domain.";desktop"] = curl_init($url_desktop); + curl_setopt_array($resps[$domain.";mobile"], $options); + curl_setopt_array($resps[$domain.";desktop"], $options); + curl_multi_add_handle($multi_curl, $resps[$domain.";mobile"]); + curl_multi_add_handle($multi_curl, $resps[$domain.";desktop"]); + + } + + $active = null; + do { + curl_multi_exec($multi_curl, $active); + } while ($active > 0); + + + foreach ($resps as $key => $response) { + $domain = explode(";", $key)[0]; + $mode = explode(";", $key)[1]; + $resp = curl_multi_getcontent($response); + curl_multi_remove_handle($multi_curl, $response); + $pagespeed = json_decode($resp, true); + + $score_mobile = 0; + $score_desktop = 0; + if (isset($pagespeed['lighthouseResult'])) { + if ($pagespeed['lighthouseResult']['categories']['performance']['score'] != null) { + $score_mobile = $pagespeed['lighthouseResult']['categories']['performance']['score']; + } + if ($pagespeed['lighthouseResult']['categories']['performance']['score'] != null) { + $score_desktop = $pagespeed['lighthouseResult']['categories']['performance']['score']; + } + } + if (json_last_error() === JSON_ERROR_NONE && (!array_key_exists("error", $pagespeed))) { + if ($mode == "mobile") { + rex_sql::factory()->setDebug(0)->setQuery('INSERT INTO ' . rex::getTable('project_manager_plus_domain_psi') . ' (`domain`, `raw`, `createdate`, `score_mobile`, `status`) VALUES(:domain, :resp, NOW(), :score_mobile, 1) + ON DUPLICATE KEY UPDATE domain = :domain, `raw` = :resp, createdate = NOW(), `score_mobile` = :score_mobile, `status` = 1', [":domain" => $domain, ":resp" => $resp, ":score_mobile" => $score_mobile]); + } elseif ($mode == "desktop") { + rex_sql::factory()->setDebug(0)->setQuery('INSERT INTO ' . rex::getTable('project_manager_plus_domain_psi') . ' (`domain`, `raw`, `createdate`, `score_desktop`, `status`) VALUES(:domain, :resp, NOW(), :score_desktop, 1) + ON DUPLICATE KEY UPDATE domain = :domain, `raw` = :resp, createdate = NOW(), `score_desktop` = :score_desktop, `status` = 1', [":domain" => $domain, ":resp" => $resp, ":score_desktop" => $score_desktop]); + } + } else { + + // ERROR HANDLE + if ($mode == "desktop") { + + rex_sql::factory()->setDebug(0)->setQuery('INSERT INTO ' . rex::getTable('project_manager_plus_domain_psi') . ' (`domain`, `raw`, `createdate`, `status`) VALUES(:domain, :resp, NOW(), -1) + ON DUPLICATE KEY UPDATE domain = :domain, `raw` = :resp, createdate = NOW(), `status` = -1', [":domain" => $domain, ":resp" => $resp]); + + } elseif ($mode == "mobile") { + rex_sql::factory()->setDebug(0)->setQuery('INSERT INTO ' . rex::getTable('project_manager_plus_domain_psi') . ' (`domain`, `raw`, `createdate`, `status`) VALUES(:domain, :resp, NOW(), -1) + ON DUPLICATE KEY UPDATE domain = :domain, `raw` = :resp, createdate = NOW(), `status` = -1', [":domain" => $domain, ":resp" => $resp]); + + } + + $this->setMessage($pagespeed['error']['errors'][0]['message'].': '.$pagespeed['error']['errors'][0]['reason']); + $error = true; + + } + } + curl_multi_close($multi_curl); + + if ($error === true) { + return false; + } else { + return true; + } + } + public function getTypeName() + { + return rex_i18n::msg('project_manager_plus_cronjob_pagespeed_name'); + } + + public function getParamFields() + { + return []; + } +} diff --git a/lib/Domain.php b/lib/Domain.php new file mode 100644 index 0000000..67622b3 --- /dev/null +++ b/lib/Domain.php @@ -0,0 +1,127 @@ +getDomain(); + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $output = curl_exec($ch); + curl_close($ch); + $data = json_decode($output, true); + return $data; + } + + // Funktion zum Abrufen der historischen Verfügbarkeitsdaten von HetrixTools + public function getHetrixToolsHistoricalData($apiKey, $monitorId, $startDate, $endDate) + { + $startDate = date("Y-m-d", strtotime("-1 day")); + $endDate = date("Y-m-d"); + $url = "https://api.hetrixtools.com/v2/$apiKey/uptime/$monitorId/?start_date=$startDate&end_date=$endDate"; + $response = file_get_contents($url); + $data = json_decode($response, true); + return $data; + } + + + public function getFavicon() + { + $protocol = ($this->isSsl() == 1) ? "https://" : "http://"; + $faviconUrl = self::getFavicon($protocol . $this->getDomain()); + if (is_array($faviconUrl)) { + $favicon = $faviconUrl[0]; + } else { + $favicon = $faviconUrl; + } + if ($favicon == 'FALSE') { + $favicon = \rex::getServer() . '/assets/addons/project_manager_plus/favicon/redaxo-favicon.png'; + } + return $favicon; + } + + /** QualySSL Labs Score */ + public function getQualysSslLabsScore() + { + $url = 'https://www.ssllabs.com/ssltest/analyze.html?d=' . $this->getDomain(); + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $output = curl_exec($ch); + curl_close($ch); + $data = json_decode($output, true); + return $data; + } + + /** Mozilla Observer Score */ + public function getMozillaObserverScore() + { + $url = 'https://observatory.mozilla.org/analyze/' . $this->getDomain(); + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $output = curl_exec($ch); + curl_close($ch); + $data = json_decode($output, true); + return $data; + } + + public function getIp() + { + return gethostbyname(idn_to_ascii($this->getDomain(), INTL_IDNA_VARIANT_UTS46)); + } + + /* PageSpeed Score and PageSpeed Insights (all) */ + public function getPageSpeedScore() + { + $url = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=' . $this->getDomain(); + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $output = curl_exec($ch); + curl_close($ch); + $data = json_decode($output, true); + return $data; + } + + // Funktion zum Abrufen der SecurityHeaders Bewertung + public function getSecurityHeadersScore($domain) + { + $url = "https://securityheaders.com/?q=$domain&followRedirects=on"; + $response = file_get_contents($url . '&hide=on'); + preg_match('/Grade: ([A-F])/', $response, $matches); + return $matches[1] ?? 'N/A'; + } + + /** Lighthouse-Kennzahlen für Mobil/Desktop SEO/Barrierefreiheit/Leistung/Best Practices abrufen */ + public function getLighthouseMetrics() + { + $url = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=' . $this->getDomain(); + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $output = curl_exec($ch); + curl_close($ch); + $data = json_decode($output, true); + return $data; + } + + + public function getDomain() + { + return $this->getValue('domain'); + } + + public function isSsl() + { + return $this->getValue('is_ssl'); + } +} diff --git a/lib/Logger.php b/lib/Logger.php new file mode 100644 index 0000000..9f0f25a --- /dev/null +++ b/lib/Logger.php @@ -0,0 +1,47 @@ +add($data); + } + + public static function getPath($domain) + { + return rex_path::log('project_manager_plus_'.$domain.'_last.log'); + } + + public static function deleteFile($domain) + { + rex_file::delete(rex_path::log('project_manager_plus_'.$domain.'_last.log')); + ; + } + + public static function close() + { + self::$logfile = null; + self::$init = false; + } +} diff --git a/package.yml b/package.yml index 7bf3242..c4ad554 100644 --- a/package.yml +++ b/package.yml @@ -1,35 +1,84 @@ -package: project_manager -version: '1.5.6' -author: 'Friends Of REDAXO' -supportpage: https://github.com/FriendsOfREDAXO/project_manager +package: project_manager_plus +version: '2.0.0-dev' +author: 'Friends Of REDAXO, Alexander Walther' +supportpage: https://github.com/alexplusde/project_manager_plus -# Seiten page: - title: Projekt Manager - perm: project_manager[] + title: Projekt Manager Plus + perm: admin icon: rex-icon fa-handshake-o - # Unterseiten subpages: main: - title: 'translate:project_manager_main' - perm: project_manager[] + title: 'translate:project_manager_plus_main' + perm: admin icon: rex-icon fa-info itemclass: pull-right - -plugins: - - server - - client - - pagespeed - - hosting + client: + title: 'translate:project_manager_plus_client' + perm: admin + icon: rex-icon fa-wrench + server_overview: + title: 'translate:project_manager_plus_server_overview' + perm: admin + icon: rex-icon fa-wrench + server_projects: + title: 'translate:project_manager_plus_server_project_detail' + perm: admin + icon: rex-icon fa-wrench + server_config: + title: 'translate:project_manager_plus_server_config' + perm: admin + icon: rex-icon fa-wrench + hosting: + title: translate:project_manager_plus_hosting_title + pagespeed_overview: + title: 'translate:project_manager_plus_pagespeed_title' + pagespeed_config: + title: 'translate:project_manager_plus_pagespeed_config' -# Abhängigkeiten -# Anforderungen ans System oder anderere AddOns, um dieses AddOn installieren oder update zu können requires: - redaxo: '^5.2' # benötigt mindestens REDAXO 5.2 + packages: + cronjob: '>=2.3.0' + project_manager_plus: '^1.5.0' + yform: '>=3.4.2' + redaxo: '^5.15' php: - version: '>=7.0' # benötigt mindestens PHP 7 + version: '>=8.0' -# Plugins die automatisch installiert werden sollen -#system_plugins: - #- client +redaxo_versions: + ['5.12.0', '5.12.1', '5.13.0', '5.13.1', '5.13.2', '5.13.3', '5.13.4', '5.14.0', '5.14.1', '5.14.2', '5.15.0', '5.15.1', '5.16.0', '5.16.1', '5.17.0', '5.17.1', '5.18.0', '5.18.1'] + +php_versions: + 7.4.0: + releasedate: '2019-11-28' + supportenddate: '2021-11-28' + securityenddate: '2022-11-28' + 8.0.0: + releasedate: '2020-11-26' + supportenddate: '2022-11-26' + securityenddate: '2023-11-26' + 8.1.0: + releasedate: '2021-11-25' + supportenddate: '2023-11-25' + securityenddate: '2025-12-31' + 8.2.0: + releasedate: '2022-12-08' + supportenddate: '2024-12-31' + securityenddate: '2026-12-31' + 8.3.0: + releasedate: '2023-11-23' + supportenddate: '2025-12-31' + securityenddate: '2027-12-31' + 8.4.0: + releasedate: '2024-11-21' + supportenddate: '2026-12-31' + securityenddate: '2028-12-31' + 9.0.0: + releasedate: '2026-11-26' + supportenddate: '2028-12-31' + securityenddate: '2030-12-31' + +default_config: + min_redaxo_version: '5.17.0' + min_php_version: '8.3' diff --git a/pages/hosting-content.php b/pages/hosting-content.php new file mode 100644 index 0000000..917325f --- /dev/null +++ b/pages/hosting-content.php @@ -0,0 +1,50 @@ +setDebug(0)->getArray($query, [$domain]); + + if (count($result) > 0) { + + $item = $result[0]; + $raw = json_decode($item['raw'], true); + + if (is_array($raw)) { + + if (is_numeric($raw['validTo'])) { + + if ($raw['validTo'] < (time() + 2764800)) { + $validTo = ''.rex_formatter::format($raw['validTo'], 'date', 'd.m.Y H:i:s').''; + $validFrom = rex_formatter::format($raw['validFrom'], 'date', 'd.m.Y H:i:s'); + } elseif ($raw['validTo'] < time()) { + $validTo = ''.rex_formatter::format($raw['validTo'], 'date', 'd.m.Y H:i:s').''; + $validFrom = rex_formatter::format($raw['validFrom'], 'date', 'd.m.Y H:i:s'); + } else { + $validTo = rex_formatter::format($raw['validTo'], 'date', 'd.m.Y H:i:s'); + $validFrom = rex_formatter::format($raw['validFrom'], 'date', 'd.m.Y H:i:s'); + } + } else { + $validFrom = "-"; + $validTo = "-"; + } + + $output = ''; + $output .= ''; + $output .= '
'.$this->i18n('organisation').''.$this->i18n('isp').''. $this->i18n('project_manager_plus_hosting_ip').''.$this->i18n('validFrom').''.$this->i18n('validTo').'
'.(isset($raw['org']) ? $raw['org'] : '').''.(isset($raw['isp']) ? $raw['isp'] : '').'
'.(isset($raw['zip']) ? $raw['zip'] : '').' '.(isset($raw['city']) ? $raw['city'] : '').'
'.(isset($raw['country']) ? $raw['country'] : '').'
'.(isset($item['ip']) ? $item['ip']: '').''.$validFrom.''.$validTo.'
'; + } + + } else { + $output = "Keine Hostingdaten vorhanden!"; + } + + return $output; + +} diff --git a/pages/hosting.php b/pages/hosting.php new file mode 100644 index 0000000..23ba8a3 --- /dev/null +++ b/pages/hosting.php @@ -0,0 +1,173 @@ +getValue(); +$csrf = rex_csrf_token::factory('project_manager_plus'); + +############### +### +### LISTVIEW +### +############### +if ($showlist) { + + $sql = 'SELECT * FROM ( + SELECT * FROM '. rex::getTable('project_manager_plus_domain') . ' as X ORDER BY name ASC + ) AS D + LEFT JOIN ( + SELECT status as status_hosting, createdate as createdate_hosting, domain as hostingdomain, ip, raw + FROM ' . rex::getTable('project_manager_plus_domain_hosting') . ' + ) as H + ON D.domain = H.hostingdomain + GROUP by D.domain + ORDER BY name ASC'; + + $items = rex_sql::factory()->getArray($sql); + + // Cronjobcall + $sql2 = 'SELECT * FROM '. rex::getTable('cronjob').' + WHERE type = "rex_cronjob_project_manager_plus_hosting"'; + $cronjob = rex_sql::factory()->getArray($sql2); + $cronjobId = $cronjob[0]['id']; + + $refresh = ''; + if ($cronjobId != null) { + $refresh = ' Hosting Daten aktualisieren'; + } + echo rex_view::info("Anzahl der Domains und Projekte: ".count($items) . $refresh); + + $list = rex_list::factory($sql, 1000); + $list->addTableAttribute('class', 'table-striped'); + $list->setNoRowsMessage($this->i18n('project_manager_plus_hosting_domain_norows_message')); + + + $list->setColumnFormat('id', 'Id'); + $list->addParam('page', 'project_manager_plus/server'); + + $list->setColumnParams('id', ['data_id' => '###id###', 'func' => 'edit']); + $list->setColumnSortable('id'); + + $list->removeColumn('id'); + $list->removeColumn('description'); + $list->removeColumn('api_key'); + $list->removeColumn('tags'); + $list->removeColumn('cms'); + $list->removeColumn('cms_version'); + $list->removeColumn('createdate'); + $list->removeColumn('createdate_hosting'); + $list->removeColumn('rex_version'); + $list->removeColumn('status'); + $list->removeColumn('http_code'); + $list->removeColumn('raw'); + $list->removeColumn('domain'); + $list->removeColumn('hostingdomain'); + $list->removeColumn('updatedate'); + $list->removeColumn('logdate'); + $list->removeColumn('maintenance'); + $list->removeColumn('param'); + + $list->setColumnLabel('name', $this->i18n('project_manager_plus_hosting_name')); + $list->setColumnParams('name', ['page' => 'project_manager_plus/server/projects', 'func' => 'updateinfos', 'domain' => '###domain###']); + + $list->setColumnLabel('createdate_psi', $this->i18n('project_manager_plus_hosting_updatedate')); + $list->setColumnFormat('createdate_psi', 'custom', function ($params) { + return (rex_formatter::format($params['list']->getValue('createdate_psi'), 'date', 'd.m.Y H:i:s')); + }); + + // icon column (Domain hinzufügen bzw. bearbeiten) + $thIcon = ''; + $tdIcon = ''; + $list->addColumn($thIcon, $tdIcon, 0, ['###VALUE###', '###VALUE###']); + $list->setColumnParams($thIcon, ['func' => 'domain_edit', 'id' => '###id###']); + $list->setColumnFormat($thIcon, 'custom', function ($params) { + $filename = ''; + if (file_exists(rex_plugin::get('project_manager_plus', 'server')->getAssetsPath('favicon/'.$params['list']->getValue('domain').'.png'))) { + $filename = rex_plugin::get('project_manager_plus', 'server')->getAssetsUrl('favicon/'.$params['list']->getValue('domain').'.png'); + return ''; + } else { + return ''; + } + }); + + $list->addColumn($this->i18n('project_manager_plus_hosting_domain'), '###domain###', 3); + //$list->setColumnParams($this->i18n('project_manager_plus_hosting_domain'), ['page' => 'project_manager_plus/server/projects', 'func' => 'updateinfos', 'domain' => '###domain###']); + $list->setColumnFormat($this->i18n('project_manager_plus_hosting_domain'), 'custom', function ($params) { + return ''.$params['list']->getValue('domain').''; + }); + + + $list->setColumnLabel('is_ssl', $this->i18n('is_ssl')); + $list->setColumnLayout('is_ssl', ['###VALUE###', '###VALUE###']); + $list->setColumnFormat('is_ssl', 'custom', function ($params) { + if ($params['list']->getValue('is_ssl') == "1") { + return ''; + } elseif ($params['list']->getValue('is_ssl') == "0") { + return ''; + } else { + return "?"; + } + }); + + $list->addColumn($this->i18n('organisation'), false, -1, ['###VALUE###', '###VALUE### ']); + $list->setColumnLabel($this->i18n('organisation'), $this->i18n('organisation')); + $list->setColumnFormat($this->i18n('organisation'), 'custom', function ($params) { + + if ($params['list']->getValue('raw')) { + $raw= json_decode($params['list']->getValue('raw'), true); + if (array_key_exists("org", $raw)) { + return $raw['org']; + } + } + }); + + $list->setColumnLabel('ip', $this->i18n('project_manager_plus_hosting_ip')); + + $list->setColumnLabel('status_hosting', $this->i18n('status')); + $list->setColumnFormat('status_hosting', 'custom', function ($params) { + if ($params['list']->getValue('status_hosting') == "1") { + return ''; + } elseif ($params['list']->getValue('status_hosting') == "0") { + return ''; + } elseif ($params['list']->getValue('status_hosting') == "-1") { + return ''; + } elseif ($params['list']->getValue('status_hosting') == "2") { + return ''; + } + }); + $list->setColumnLayout('status', ['###VALUE###', '###VALUE###']); + + $list->addColumn($this->i18n('validTo'), false, -1, ['###VALUE###', '###VALUE### ']); + $list->setColumnLabel($this->i18n('validTo'), $this->i18n('validTo')); + $list->setColumnFormat($this->i18n('validTo'), 'custom', function ($params) { + + if ($params['list']->getValue('raw')) { + $raw= json_decode($params['list']->getValue('raw'), true); + if (array_key_exists("validTo", $raw)) { + + if (is_numeric($raw['validTo'])) { + + if ($raw['validTo'] < (time() + 2764800)) { + return ''.rex_formatter::format($raw['validTo'], 'date', 'd.m.Y H:i:s').''; + } elseif ($raw['validTo'] < time()) { + return ''.rex_formatter::format($raw['validTo'], 'date', 'd.m.Y H:i:s').''; + } else { + return rex_formatter::format($raw['validTo'], 'date', 'd.m.Y H:i:s'); + } + } else { + return "-"; + } + + } + } + }); + + $content = $list->get(); + $content = str_replace('setVar('title', $this->i18n('projects')); + $fragment->setVar('content', $content, false); + echo $fragment->parse('core/page/section.php'); +} diff --git a/pages/index.php b/pages/index.php index 20ec2c2..7935d14 100644 --- a/pages/index.php +++ b/pages/index.php @@ -1,17 +1,7 @@ i18n('project_manager_title')); // $this->i18n('title') ist eine Kurzform für rex_i18n::msg('demo_addon_title') +echo rex_view::title($addon->i18n('project_manager_plus_title')); -// Die Subpages werden nicht mehr über den "subpage"-Parameter gesteuert, sondern über "page" (getrennt mit einem Slash, z. B. page=demo_addon/config) -// Die einzelnen Teile des page-Pfades können mit der folgenden Funktion ausgelesen werden. -$subpage = rex_be_controller::getCurrentPagePart(2); - -// Subpages können über diese Methode eingebunden werden. So ist sichergestellt, dass auch Subpages funktionieren, -// die von anderen Addons/Plugins hinzugefügt wurden rex_be_controller::includeCurrentPageSubPath(); - - - diff --git a/pages/info.php b/pages/info.php deleted file mode 100644 index 7c206e8..0000000 --- a/pages/info.php +++ /dev/null @@ -1,54 +0,0 @@ - $h2_block) { - preg_match('/(.*)\n^(?:.|\n(?!#))*/m', $h2_block, $headline); - if (isset($headline[1])) { - $navi_list[] = '* '.$headline[1]; - $content_h2_block = '# '.$headline[0]; - preg_match_all('/(?!### )*^### (.*)\n((?:.|\n(?!### ))*)/m', $h2_block, $matches); - if (count($matches[0]) > 0) { - $navi_elements = $matches[1]; - $blocks = $matches[2]; - $content_blocks['chapter'.$h2_i] = $content_h2_block; - foreach ($navi_elements as $h3_i => $navi_element) { - $navi_list[] = ' * '.$navi_element.''; - $content_blocks["chapter".$h2_i] .= "\n## ".$navi_element.$blocks[$h3_i]; - } - } - } -} -reset($content_blocks); -$n = rex_request('n', 'string', key($content_blocks)); - -if (!isset($content_blocks[$n])) { - $n = key($content_blocks); -} -$navi_view = implode("\n", $navi_list); - $blocks_view = $content_blocks[$n]; - - $miu = rex_markdown::factory(); - -// Navigation -$navi_view = $miu->parse($navi_view); -$fragment = new rex_fragment(); -$fragment->setVar('title', rex_i18n::msg('project_manager_navigation').'', false); -$fragment->setVar('body', $navi_view, false); -$navi = $fragment->parse('core/page/section.php'); - - -$blocks_view = $miu->parse($blocks_view); -$fragment = new rex_fragment(); -$fragment->setVar('title', $this->i18n('docs'), false); -$fragment->setVar('body', $blocks_view, false); -$content = $fragment->parse('core/page/section.php'); - -echo '
-
-
'.$navi.'
-
'.$content.'
-
-
'; \ No newline at end of file diff --git a/pages/main.php b/pages/main.php deleted file mode 100644 index 3327a73..0000000 --- a/pages/main.php +++ /dev/null @@ -1,62 +0,0 @@ -isAvailable()) { - - -// dump(rex_request("page", string)); - -// //rex_response::sendRedirect('index.php?page=project_manager/server/overview'); -// }else { - - $content = file_get_contents(rex_path::addon('project_manager')."README.md"); - $content_blocks = []; - $h2_blocks = explode("\n## ", "\n".$content); - foreach ($h2_blocks as $h2_i => $h2_block) { - preg_match('/(.*)\n^(?:.|\n(?!#))*/m', $h2_block, $headline); - if (isset($headline[1])) { - $navi_list[] = '* '.$headline[1]; - $content_h2_block = '# '.$headline[0]; - preg_match_all('/(?!### )*^### (.*)\n((?:.|\n(?!### ))*)/m', $h2_block, $matches); - if (count($matches[0]) > 0) { - $navi_elements = $matches[1]; - $blocks = $matches[2]; - $content_blocks['chapter'.$h2_i] = $content_h2_block; - foreach ($navi_elements as $h3_i => $navi_element) { - $navi_list[] = ' * '.$navi_element.''; - $content_blocks["chapter".$h2_i] .= "\n## ".$navi_element.$blocks[$h3_i]; - } - } - } - } - reset($content_blocks); - $n = rex_request('n', 'string', key($content_blocks)); - - if (!isset($content_blocks[$n])) { - $n = key($content_blocks); - } - $navi_view = implode("\n", $navi_list); - $blocks_view = $content_blocks[$n]; - - $miu = rex_markdown::factory(); - - // Navigation - $navi_view = $miu->parse($navi_view); - $fragment = new rex_fragment(); - $fragment->setVar('title', rex_i18n::msg('project_manager_navigation').'', false); - $fragment->setVar('body', $navi_view, false); - $navi = $fragment->parse('core/page/section.php'); - - - $blocks_view = $miu->parse($blocks_view); - $fragment = new rex_fragment(); - $fragment->setVar('title', $this->i18n('docs'), false); - $fragment->setVar('body', $blocks_view, false); - $content = $fragment->parse('core/page/section.php'); - - echo '
-
-
'.$navi.'
-
'.$content.'
-
-
'; -//} \ No newline at end of file diff --git a/pages/pagespeed-details.php b/pages/pagespeed-details.php new file mode 100644 index 0000000..988e7c3 --- /dev/null +++ b/pages/pagespeed-details.php @@ -0,0 +1,73 @@ +setDebug(0)->getArray($query, [$domain])[0]; + + $raw = json_decode($item['raw'], true); + + if (is_array($raw)) { + + // PSI + $query = ' + SELECT * FROM (SELECT * FROM ' . rex::getTable('project_manager_plus_domain') . ' ORDER BY domain) AS D + LEFT JOIN ( + SELECT domain, raw, score_desktop AS psi_score_desktop + FROM ' . rex::getTable('project_manager_plus_domain_psi') . ' + WHERE score_desktop NOT LIKE "") as PSI + ON D.domain = PSI.domain + LEFT JOIN ( + SELECT domain, score_mobile AS psi_score_mobile + FROM ' . rex::getTable('project_manager_plus_domain_psi') . ' + WHERE score_mobile NOT LIKE "") as PSI2 + ON D.domain = PSI2.domain + WHERE D.domain = ? + GROUP BY D.domain + ORDER BY D.domain + '; + + $item = rex_sql::factory()->setDebug(0)->getArray($query, [$domain])[0]; + + // Screenshot + $raw= json_decode($item['raw'], true); + $image = ''; + $data = ''; + if (isset($raw['lighthouseResult'])) { + $data = $raw['lighthouseResult']['audits']['final-screenshot']['details']['data']; + $image = $data; + } + + if ($item['psi_score_desktop'] < 0.7) { + $class = ' '; + } elseif ($item['psi_score_desktop'] < 0.9) { + $class = ' '; + } else { + $class = ' '; + } + + if ($item['psi_score_mobile'] < 0.7) { + $classmobile = ' '; + } elseif ($item['psi_score_mobile'] < 0.9) { + $classmobile = ' '; + } else { + $classmobile = ' '; + } + + $output = ''; + $output = '
'; + $output .= ''; + $output .= '
NameResultScreenshot
Page Speed'.$class.$item['psi_score_desktop'].' | '.$classmobile.$item['psi_score_mobile'].'
'; + + return $output; + + } +} diff --git a/pages/pagespeed.php b/pages/pagespeed.php new file mode 100644 index 0000000..ea16246 --- /dev/null +++ b/pages/pagespeed.php @@ -0,0 +1,156 @@ +getValue(); +$csrf = rex_csrf_token::factory('project_manager_plus'); + +############### +### +### LISTVIEW +### +############### +if ($showlist) { + + $sql = 'SELECT * FROM ( + SELECT * FROM '. rex::getTable('project_manager_plus_domain') . ' as X ORDER BY name ASC + ) AS D + LEFT JOIN ( + SELECT status as status_psi, createdate as createdate_psi, domain as psidomain, score_desktop AS psi_score_desktop, score_mobile AS psi_score_mobile + FROM ' . rex::getTable('project_manager_plus_domain_psi') . ' + ) as PSI + ON D.domain = PSI.psidomain + GROUP by D.domain + ORDER BY name ASC + '; + + $items = rex_sql::factory()->getArray($sql); + + $sql2 = 'SELECT * FROM '. rex::getTable('cronjob').' + WHERE type = "rex_cronjob_project_manager_plus_pagespeed"'; + $cronjob = rex_sql::factory()->getArray($sql2); + $cronjobId = $cronjob[0]['id']; + + $refresh = ''; + if ($cronjobId != null) { + $refresh = ' PageSpeed Daten aktualisieren'; + } + echo rex_view::info("Anzahl der Domains und Projekte: ".count($items) . $refresh); + + $list = rex_list::factory($sql, 1000); + $list->addTableAttribute('class', 'table-striped'); + $list->setNoRowsMessage($this->i18n('project_manager_plus_pagespeed_domain_norows_message')); + + $list->setColumnFormat('id', 'Id'); + $list->addParam('page', 'project_manager_plus/server'); + + $list->setColumnParams('id', ['data_id' => '###id###', 'func' => 'edit']); + $list->setColumnSortable('id'); + + $list->removeColumn('id'); + $list->removeColumn('is_ssl'); + $list->removeColumn('description'); + $list->removeColumn('api_key'); + $list->removeColumn('tags'); + $list->removeColumn('cms'); + $list->removeColumn('cms_version'); + $list->removeColumn('createdate'); + $list->removeColumn('rex_version'); + $list->removeColumn('status'); + $list->removeColumn('http_code'); + $list->removeColumn('is_ssl'); + $list->removeColumn('domain'); + $list->removeColumn('psidomain'); + $list->removeColumn('updatedate'); + $list->removeColumn('createdate'); + $list->removeColumn('psi_domain'); + $list->removeColumn('psi_score_desktop'); + $list->removeColumn('psi_score_mobile'); + $list->removeColumn('maintenance'); + $list->removeColumn('param'); + + $list->setColumnLabel('name', $this->i18n('project_manager_plus_pagespeed_name')); + $list->setColumnParams('name', ['page' => 'project_manager_plus/server/projects', 'func' => 'updateinfos', 'domain' => '###domain###']); + + $list->setColumnLabel('createdate_psi', $this->i18n('project_manager_plus_pagespeed_updatedate')); + $list->setColumnFormat('createdate_psi', 'custom', function ($params) { + return (rex_formatter::format($params['list']->getValue('createdate_psi'), 'date', 'd.m.Y H:i:s')); + }); + + // icon column (Domain hinzufügen bzw. bearbeiten) + $thIcon = ''; + $tdIcon = ''; + $list->addColumn($thIcon, $tdIcon, 0, ['###VALUE###', '###VALUE###']); + $list->setColumnParams($thIcon, ['func' => 'domain_edit', 'id' => '###id###']); + $list->setColumnFormat($thIcon, 'custom', function ($params) { + $filename = ''; + if (file_exists(rex_plugin::get('project_manager_plus', 'server')->getAssetsPath('favicon/'.$params['list']->getValue('domain').'.png'))) { + $filename = rex_plugin::get('project_manager_plus', 'server')->getAssetsUrl('favicon/'.$params['list']->getValue('domain').'.png'); + return ''; + } else { + return ''; + } + }); + + $list->addColumn($this->i18n('project_manager_plus_pagespeed_domain'), '###domain###', 3); + //$list->setColumnParams($this->i18n('project_manager_plus_pagespeed_domain'), ['page' => 'project_manager_plus/server/projects', 'func' => 'updateinfos', 'domain' => '###domain###']); + $list->setColumnFormat($this->i18n('project_manager_plus_pagespeed_domain'), 'custom', function ($params) { + return ''.$params['list']->getValue('domain').''; + }); + + + $list->setColumnLabel('status_psi', $this->i18n('status')); + $list->setColumnFormat('status_psi', 'custom', function ($params) { + if ($params['list']->getValue('status_psi') == "1") { + return ''; + } elseif ($params['list']->getValue('status_psi') == "0") { + return ''; + } elseif ($params['list']->getValue('status_psi') == "-1") { + return ''; + } elseif ($params['list']->getValue('status_psi') == "2") { + return ''; + } else { + if ($params['list']->getValue('is_ssl') == 1) { + return ''; + } + + if ($params['list']->getValue('is_ssl') == 0) { + return ''; + } + } + }); + + $list->setColumnLayout('status', ['###VALUE###', '###VALUE###']); + + + $list->addColumn("Pagespeed", false, -1, ['PageSpeed', '###VALUE###']); + $list->setColumnFormat("Pagespeed", 'custom', function ($params) { + + if ($params['list']->getValue('psi_score_desktop') < 0.7) { + $return = ' '.$params['list']->getValue('psi_score_desktop'); + } elseif ($params['list']->getValue('psi_score_desktop') < 0.9) { + $return = ' '.$params['list']->getValue('psi_score_desktop'); + } else { + $return = ' '.$params['list']->getValue('psi_score_desktop'); + } + $return .= " | "; + if ($params['list']->getValue('psi_score_mobile') < 0.7) { + $return .= ' '.$params['list']->getValue('psi_score_mobile'); + } elseif ($params['list']->getValue('psi_score_mobile') < 0.9) { + $return .= ' '.$params['list']->getValue('psi_score_mobile'); + } else { + $return .= ' '.$params['list']->getValue('psi_score_mobile'); + } + return $return; + }); + + + $content = $list->get(); + $content = str_replace('setVar('title', $this->i18n('projects')); + $fragment->setVar('content', $content, false); + echo $fragment->parse('core/page/section.php'); +} diff --git a/pages/projects.php b/pages/projects.php new file mode 100644 index 0000000..e6269ab --- /dev/null +++ b/pages/projects.php @@ -0,0 +1,544 @@ +setName('domain'); +$sel_editor->setId('rex-project-manager-domain'); +$sel_editor->setAttribute('class', 'form-control selectpicker'); +$sel_editor->setAttribute('data-live-search', 'true'); +$sel_editor->setSize(1); +$sel_editor->setSelected($domain); +$sel_editor->addDBSqlOptions("select domain as name, domain as id FROM rex_project_manager_plus_domain ORDER BY domain"); + +$formElements = []; +$n = []; +$n['label'] = ''; +$n['field'] = $sel_editor->get(); +$formElements[] = $n; + +$fragment = new rex_fragment(); +$fragment->setVar('elements', $formElements, false); +$content = $fragment->parse('core/form/form.php'); + + +$formElements = []; +$n = []; +$n['field'] = ''; +$formElements[] = $n; + +$fragment = new rex_fragment(); +$fragment->setVar('elements', $formElements, false); +$buttons = $fragment->parse('core/form/submit.php'); + +$fragment = new rex_fragment(); +$fragment->setVar('class', 'edit', false); +$fragment->setVar('title', $this->i18n('project_detail')); +$fragment->setVar('body', $content, false); +$fragment->setVar('buttons', $buttons, false); +$content = $fragment->parse('core/page/section.php'); + +$content = ' + + + + ' . $csrfToken->getHiddenField() . ' + ' . $content . ' + '; + +echo $content; + +if ($domain) { + + // Domain-Übersicht ANFANG // + $query = 'SELECT * FROM `rex_project_manager_plus_logs` AS L + INNER JOIN `rex_project_manager_plus_domain` as D + ON D.id = L.domain_id + WHERE domain = ? ORDER BY L.id DESC LIMIT 1'; + + + try { + $result = rex_sql::factory()->setDebug(0)->getArray($query, [$domain]); + } catch (rex_sql_exception $e) { + rex_logger::logException($e); + } + + if (!empty($result)) { + $item = $result[0]; + } + + if ((isset($item)) && (null !== $item)) { + $raw = json_decode($item['raw'], true); + } + + if ((isset($raw)) && (is_array($raw))) { + + $ssl = $item['is_ssl']; + $protocol = ($ssl == 1) ? "https://" : "http://"; + + $refresh = ''; + $refresh = '
'; + + echo $refresh; + + if ($item['cms'] == 4) { + $content0 = ''; + + // VERSIONS + $output = '
'; + $output .= ''; + $output .= ''; + + if ($item['status'] == "1") { + $output .= ''; + } elseif ($item['status'] == "0") { + $output .= ''; + } elseif ($item['status'] == "-1") { + $output .= ''; + } elseif ($item['status'] == "2") { + $output .= ''; + } + + $output .= ''; + $output .= ''; + $output .= ''; + $output .= '
InformationVersion / Status
Projekt Manager Version'.$raw['pm_version'].'
Projekt Manager Client Version'.$raw['client_version'].'
Projekt Manager Client Abruf '.$this->i18n('project_manager_plus_server_status_code_1').'
Projekt Manager Client Abruf '.$this->i18n('project_manager_plus_server_status_code_0').'
Projekt Manager Client Abruf '.$this->i18n('project_manager_plus_server_status_code_minus_1').'
Projekt Manager Client Abruf '.$this->i18n('project_manager_plus_server_status_code_2').'
REDAXO Version'.$raw['rex_version'].'
PHP Version'.$raw['php_version'].'
MySQL Version'.$raw['mysql_version'].'
'; + + $fragment = new rex_fragment(); + $fragment->setVar('class', 'danger', false); + $fragment->setVar('title', "Informationen", false); + $fragment->setVar('body', $output, false); + $content0 .= '
'.$fragment->parse('core/page/section.php').'
'; + + echo '
'.$content0.'
'; + + $content0 = ''; + + // UPDATES + $output = ''; + + if (array_key_exists('update_article', $raw) && array_key_exists('update_media', $raw)) { + $output .= ''; + $output .= ''; + } + + $output .= ''; + $output .= '
Letzte ÄnderungDatum
Artikel'.date('d.m.Y H:i:s', $raw['update_article']).'
Medienpool'.date('d.m.Y H:i:s', $raw['update_media']).'
Synchronisierung mit Projekt Manager'.date('d.m.Y H:i:s', $item['updatedate']).'
'; + + $fragment = new rex_fragment(); + $fragment->setVar('class', 'info', false); + $fragment->setVar('title', "Änderungen", false); + $fragment->setVar('body', $output, false); + $fragment->setVar('collapse', true); + $fragment->setVar('collapsed', false); + $content0 .= '
'.$fragment->parse('core/page/section.php').'
'; + + echo '
'.$content0.'
'; + } + + if ($item['cms'] == 5) { + + $content1 = ''; + + $output = ''; + $output .= ''; + $output .= ''; + + if ($item['status'] == "1") { + $output .= ''; + } elseif ($item['status'] == "0") { + $output .= ''; + } elseif ($item['status'] == "-1") { + $output .= ''; + } elseif ($item['status'] == "2") { + $output .= ''; + } + + $output .= ''; + $output .= ''; + $output .= ''; + if ($raw['client_version'] >= "1.0.6") { + if ($raw['debug'] == 1) { + $output .= ''; + } + if ($raw['debug'] == 0) { + $output .= ''; + } + } + + if ($raw['client_version'] >= "1.1.0") { + if (!empty($raw['rex_url_backend'])) { + $output .= ''; + } + } + + if ($item['maintenance'] == "1") { + $output .= ''; + } elseif ($item['maintenance'] == "0") { + $output .= ''; + } elseif ($item['maintenance'] == "") { + $output .= ''; + } + + + $output .= '
InformationVersion / Status
Projekt Manager Version'.$raw['pm_version'].'
Projekt Manager Client Version'.$raw['client_version'].'
Projekt Manager Client Abruf '.$this->i18n('project_manager_plus_server_status_code_1').'
Projekt Manager Client Abruf '.$this->i18n('project_manager_plus_server_status_code_0').'
Projekt Manager Client Abruf '.$this->i18n('project_manager_plus_server_status_code_minus_1').'
Projekt Manager Client Abruf '.$this->i18n('project_manager_plus_server_status_code_2').'
REDAXO Version'.$raw['rex_version'].'
PHP Version'.$raw['php_version'].'
MySQL Version'.$raw['mysql_version'].'
Debug Modus aktiv
Debug Modus nicht aktiv
REDAXO Backend '.$raw['rex_url_backend'].'
Wartungsvertrag '.$this->i18n('project_manager_plus_server_maintenance_1').'
Wartungsvertrag '.$this->i18n('project_manager_plus_server_maintenance_0').'
Wartungsvertrag '.$this->i18n('project_manager_plus_server_maintenance_2').'
'; + + $fragment = new rex_fragment(); + $fragment->setVar('class', 'danger', false); + $fragment->setVar('title', "Informationen", false); + $fragment->setVar('body', $output, false); + $content1 .= '
'.$fragment->parse('core/page/section.php').'
'; + + echo '
'.$content1.'
'; + + $content1 = ''; + + // UPDATES + $output = ''; + $output .= ''; + $output .= ''; + $output .= ''; + $output .= '
Letzte ÄnderungDatum
Artikel'.rex_formatter::format($raw['article'][0]['updatedate'], 'date', 'd.m.Y H:i:s').'
Medienpool'.rex_formatter::format($raw['media'][0]['updatedate'], 'date', 'd.m.Y H:i:s').'
Synchronisierung mit Projekt Manager'.rex_formatter::format($item['updatedate'], 'date', 'd.m.Y H:i:s').'
'; + + $fragment = new rex_fragment(); + $fragment->setVar('class', 'info', false); + $fragment->setVar('title', "Änderungen", false); + $fragment->setVar('body', $output, false); + $fragment->setVar('collapse', true); + $fragment->setVar('collapsed', false); + $content1 .= '
'.$fragment->parse('core/page/section.php').'
'; + + + // USER + $user = $raw['user']; + $output = ''; + foreach ($user as $login) { + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + } + $output .= '
NameBenutzerLetzter Login
'.$login["name"].''.$login["login"].''.rex_formatter::format($login["lastlogin"], 'date', 'd.m.Y H:i:s').'
'; + + $fragment = new rex_fragment(); + $fragment->setVar('class', 'info', false); + $fragment->setVar('title', "Benutzer", false); + $fragment->setVar('body', $output, false); + $fragment->setVar('collapse', true); + $fragment->setVar('collapsed', false); + $content1 .= '
'.$fragment->parse('core/page/section.php').'
'; + + echo '
'.$content1.'
'; + + + $content2 = ''; + + // ARTICLES + $articles = $raw['article']; + + $output = ''; + foreach ($articles as $article) { + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + } + $output .= '
ArtikelBenutzerÄnderungsdatum
'.$article["name"].''.$article["updateuser"].''.rex_formatter::format($article["updatedate"], 'date', 'd.m.Y H:i:s').'
'; + + $fragment = new rex_fragment(); + $fragment->setVar('class', 'info', false); + $fragment->setVar('title', "Artikel", false); + $fragment->setVar('body', $output, false); + $fragment->setVar('collapse', true); + $fragment->setVar('collapsed', true); + $content2 .= '
'.$fragment->parse('core/page/section.php').'
'; + + + // MEDIAFILES + $media = $raw['media']; + $output = ''; + foreach ($media as $file) { + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + } + $output .= '
DateiBenutzerÄnderungsdatum
'.$file["filename"].''.$file["updateuser"].''.rex_formatter::format($file["updatedate"], 'date', 'd.m.Y H:i:s').'
'; + + $fragment = new rex_fragment(); + $fragment->setVar('class', 'info', false); + $fragment->setVar('title', "Medienpool", false); + $fragment->setVar('body', $output, false); + $fragment->setVar('collapse', true); + $fragment->setVar('collapsed', true); + $content2 .= '
'.$fragment->parse('core/page/section.php').'
'; + + echo '
'.$content2."
"; + + + $content2 = ''; + + // Modules + $modules = $raw['module']; + $output = ''; + foreach ($modules as $file) { + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + } + $output .= '
ModulÄnderungsdatum
'.$file["name"].''.rex_formatter::format($file["updatedate"], 'date', 'd.m.Y H:i:s').'
'; + + $fragment = new rex_fragment(); + $fragment->setVar('class', 'info', false); + $fragment->setVar('title', "Module", false); + $fragment->setVar('body', $output, false); + $fragment->setVar('collapse', true); + $fragment->setVar('collapsed', true); + $content2 .= '
'.$fragment->parse('core/page/section.php').'
'; + + + echo '
'.$content2."
"; + + $content3 = ''; + + // ADDONS + $addons = $raw['rex_addons']; + $i = 0; + $output = ''; + foreach ($addons as $key => $value) { + + if ($value['status'] == 1) { + $status = 'Ja'; + } + if ($value['status'] == 0) { + $status = 'Nein'; + } + + $output .= ''; + $output .= ''; + $output .= ''; + + $skip_addon_config = ''; + $skip_addon_config = rex_config::get('project_manager_plus/server', 'skip_addon'); + $skip_addon_versions = ''; + + if ($skip_addon_config != "") { + $skip_addons = explode(',', $skip_addon_config); + if (in_array($value['name'], $skip_addons)) { + $output .= ''; + $output .= ''; + $output .= ''; + continue; + } + } + + if ($value['version_current'] != '' && $value['version_latest'] != '') { + if (rex_string::versionCompare($value['version_current'], $value['version_latest'], '<')) { + + $skip_addon_version_config = rex_config::get('project_manager_plus/server', 'skip_addon_version'); + + if ($skip_addon_version_config != "") { + $skip_addon_versions = explode(',', $skip_addon_version_config); + } + + $skip = false; + if (is_array($skip_addon_versions)) { + foreach ($skip_addon_versions as $skip_addon_version) { + if (strpos($value['version_latest'], '-'.$skip_addon_version)) { + $skip = true; + } + } + } + + if ($value['version_latest'] == 0) { + $skip = true; + } + + if ($skip === false) { + $output .= ''; + $i++; + } else { + $output .= ''; + } + + } else { + $output .= ''; + } + + $output .= ''; + $output .= ''; + } + } + $output .= '
Nameaktiv?VersionInstaller
'.$value['name'].''.$status.''.$value['version_current'].''.$value['version_latest'].'
'.$value['version_current'].''.$value['version_current'].''.$value['version_current'].''.$value['version_latest'].'
'; + + $icon = ''; + if ($i > 0) { + $icon = ' '; + } + $updates = "(".$i." ". $this->i18n('project_manager_plus_server_updates') ." ".$this->i18n('updates_necessary').")"; + $fragment = new rex_fragment(); + $fragment->setVar('class', 'info', false); + $fragment->setVar('title', "Installierte Addons ".$updates .' '.$icon, false); + $fragment->setVar('body', $output, false); + $fragment->setVar('collapse', true); + $fragment->setVar('collapsed', true); + $content3 .= '
'.$fragment->parse('core/page/section.php').'
'; + + echo '
'.$content3."
"; + $content3 = ""; + + + // DOMAINS + $domains = $raw['domains']; + + $output = ''; + foreach ($domains as $key => $value) { + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + } + $output .= '
DomainURL404
'.$value['name'].''.$value['url'].''.$value['url_404'].'
'; + + $fragment = new rex_fragment(); + $fragment->setVar('class', 'info', false); + $fragment->setVar('title', "Domains in dieser Installation", false); + $fragment->setVar('body', $output, false); + $fragment->setVar('collapse', true); + $fragment->setVar('collapsed', true); + $content3 .= '
'.$fragment->parse('core/page/section.php').'
'; + + echo '
'.$content3.'
'; + $content3 = ""; + + + $icon = ""; + if (array_key_exists("syslog", $raw)) { + + $output = ''; + $syslog = $raw['syslog']; + $show_triangle = false; + + if (!is_null($syslog)) { + + + $output .= ''; + + foreach ($syslog as $entry) { + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + + if ($entry["syslog_type"] != 'Info') { + $show_triangle = true; + } + } + $output .= '
ZeitstempelTypNachrichtDateiZeile
'.$entry["timestamp"].''.$entry["syslog_type"].''.$entry["syslog_message"].''.$entry["syslog_file"].''.$entry["syslog_line"].'
'; + + if ($show_triangle == true) { + $icon = ' '; + } else { + $icon = ''; + } + + + if ($raw['client_version'] >= "1.0.6") { + $output .= ''; + } + + + + } + } else { + $output = 'Keine Einträge vorhanden.'; + } + + $fragment = new rex_fragment(); + $fragment->setVar('class', 'info', false); + $fragment->setVar('title', "Syslog".$icon, false); + $fragment->setVar('body', $output, false); + $fragment->setVar('collapse', true); + $fragment->setVar('collapsed', true); + $content3 .= '
'.$fragment->parse('core/page/section.php').'
'; + + + echo '
'.$content3."
"; + $content3 = ""; + + + // LOGFILE + $icon = ""; + $output = ''; + Logger::init($domain); + + $logfile = new rex_log_file(Logger::getPath($domain)); + $show_triangle = false; + + if (!is_null($logfile)) { + + $output .= ''; + + foreach (new LimitIterator($logfile, 0, 100) as $entry) { + + $data = $entry->getData(); + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + + } + $output .= '
ZeitstempelTypNachricht
'.rex_formatter::intlDateTime($data[0], [IntlDateFormatter::SHORT, IntlDateFormatter::MEDIUM]) .''.$data[1].''.$data[2].'
'; + + $icon = ''; + if ($item['status'] == "1") { + + } elseif ($item['status'] == "0") { + $icon = ' '; + } elseif ($item['status'] == "-1") { + $icon = ' '; + } elseif ($item['status'] == "2") { + $icon = ' '; + } + + } + + $fragment = new rex_fragment(); + $fragment->setVar('class', 'info', false); + $fragment->setVar('title', "Project Manager Log".$icon, false); + $fragment->setVar('body', $output, false); + $fragment->setVar('collapse', true); + $fragment->setVar('collapsed', true); + $content3 .= '
'.$fragment->parse('core/page/section.php').'
'; + + + + echo '
'.$content3."
"; + $content3 = ""; + } + + // ----- EXTENSION POINT + $domain = ''; + $domain_id = ''; + + $content_ep = ''; + $content_ep .= rex_extension::registerPoint(new rex_extension_point('project_manager_plus_SERVER_DETAIL_HOOK', '', [ + 'domain' => $domain, + 'domain_id' => $domain_id + ])); + + echo '
'.$content_ep."
"; + + + } +} diff --git a/pages/server.php b/pages/server.php new file mode 100644 index 0000000..afbde7a --- /dev/null +++ b/pages/server.php @@ -0,0 +1,545 @@ +getValue(); +$csrf = rex_csrf_token::factory('project_manager_plus'); + + +if ($func != '') { + + $yform = new rex_yform(); + $yform->setDebug(false); + $yform->setHiddenField('page', 'project_manager_plus/server/overview'); + $yform->setHiddenField('func', $func); + $yform->setHiddenField('save', '1'); + + $yform->setObjectparams('main_table', rex::getTable('project_manager_plus_domain')); + $yform->setObjectparams('form_name', 'project_manager_plus_form'); + + $yform->setValueField('text', ['name', $this->i18n('project_manager_plus_server_name'), 'notice' => ''.$this->i18n('name_info').'']); + $yform->setValidateField('empty', ['name', $this->i18n('project_manager_plus_server_no_name_defined')]); + $yform->setValidateField('unique', ['name', $this->i18n('project_manager_plus_server_name_already_defined')]); + + $yform->setValueField('text', ['domain', $this->i18n('project_manager_plus_server_domain'), 'notice' => ''.$this->i18n('domain_info').'']); + $yform->setValidateField('empty', ['domain', $this->i18n('project_manager_plus_server_no_domain_defined')]); + $yform->setValidateField('unique', ['domain', $this->i18n('project_manager_plus_server_domain_already_defined')]); + + $regex = '/^(?:(?!https?:\/\/).*)$/'; + $yform->setValidateField('preg_match', array('domain', $regex, $this->i18n('domain_no_protocol'))); + + $yform->setValueField('choice', array("is_ssl", $this->i18n('project_manager_plus_server_ssl'),"Ja=1,Nein=0","","0","0")); + + + $yform->setValueField('hidden', array("createdate", date('Y-m-d H:i:s', time()))); + + if ($func == 'delete') { + + if (!$csrf->isValid()) { + echo rex_view::error(rex_i18n::msg('csrf_token_invalid')); + } else { + $d = rex_sql::factory(); + $d->setQuery('delete from '.rex::getTable('project_manager_plus_logs').' where domain_id=' . $data_id); + $e = rex_sql::factory(); + $e->setQuery('delete from '.rex::getTable('project_manager_plus_domain').' where id=' . $data_id); + echo rex_view::success($this->i18n('project_manager_plus_server_project_deleted')); + } + + } elseif ($func == 'edit') { + + $yform->setValueField('text', ['api_key', $this->i18n('project_manager_plus_server_api_key_info'), 'notice' => ''.$this->i18n('api_key_notice').'']); + $yform->setValidateField('empty', ['api_key', $this->i18n('no_api_key_defined')]); + // $yform->setValidateField('unique', ['api_key', $this->i18n('api_key_already_defined')]); + + $yform->setValueField('text', ['param', $this->i18n('project_manager_plus_server_param'), 'notice' => ''.$this->i18n('param_notice').'']); + + $yform->setValueField('choice', array("cms", $this->i18n('project_manager_plus_server_cms'),"REDAXO 5=5,REDAXO 4=4","","0","0")); + + $yform->setValueField('choice', array("maintenance", $this->i18n('project_manager_plus_server_maintenance'),"Nein=0,Ja=1","","0","0")); + + $yform->setValueField('text', ['tags', $this->i18n('project_manager_plus_server_tags'), '#attributes: {"data-role":"tagsinput"}']); + + $yform->setHiddenField('data_id', $data_id); + $yform->setActionField('db', [rex::getTable('project_manager_plus_domain'), 'id=' . $data_id]); + $yform->setObjectparams('main_id', $data_id); + $yform->setObjectparams('main_where', "id=$data_id"); + $yform->setObjectparams('getdata', true); + $yform->setObjectparams('submit_btn_label', $this->i18n('save')); + $form = $yform->getForm(); + + if ($yform->objparams['actions_executed']) { + + echo rex_view::success($this->i18n('project_manager_plus_server_project_added')); + + } else { + + $showlist = false; + + $fragment = new rex_fragment(); + $fragment->setVar('class', 'edit', false); + $fragment->setVar('title', $this->i18n('edit_domain')); + + $fragment->setVar('body', $form, false); + echo $fragment->parse('core/page/section.php'); + + } + + + } elseif ($func == 'domain_add') { + + $yform->setValueField('text', ['api_key', $this->i18n('project_manager_plus_server_api_key_info'), 'default' => bin2hex(random_bytes(24)), 'notice' => ''.$this->i18n('api_key_notice').'']); + $yform->setValidateField('empty', ['api_key', $this->i18n('no_api_key_defined')]); + //$yform->setValidateField('unique', ['api_key', $this->i18n('api_key_already_defined')]); + + $yform->setValueField('text', ['param', $this->i18n('project_manager_plus_server_param'), 'notice' => ''.$this->i18n('param_notice').'']); + + $yform->setValueField('choice', array("cms", $this->i18n('project_manager_plus_server_cms'),"REDAXO 5=5,REDAXO 4=4","","0","0")); + + $yform->setValueField('choice', array("maintenance", $this->i18n('project_manager_plus_server_maintenance'),"Nein=0,Ja=1","","0","0")); + + $yform->setValueField('text', ['tags', $this->i18n('project_manager_plus_server_tags'), '#attributes: {"data-role":"tagsinput"}']); + + $yform->setActionField('db', [rex::getTable('project_manager_plus_domain')]); + $yform->setObjectparams('submit_btn_label', $this->i18n('save')); + $form = $yform->getForm(); + + if ($yform->objparams['actions_executed']) { + echo rex_view::success($this->i18n('project_manager_plus_server_project_added')); + } else { + + $showlist = false; + + $fragment = new rex_fragment(); + $fragment->setVar('class', 'edit', false); + $fragment->setVar('title', $this->i18n('add_domain')); + $fragment->setVar('body', $form, false); + echo $fragment->parse('core/page/section.php'); + } + + // Insert in DB + // API Call inkl. reponse into DB + + } + + +} + +############### +### +### LISTVIEW +### +############### +if ($showlist) { + + // $sql = 'SELECT * FROM ' . rex::getTable('project_manager_plus_domain') . ' as D + // LEFT JOIN (SELECT domain_id, status, createdate, `raw` as log_raw FROM ' . rex::getTable('project_manager_plus_logs') . ' WHERE id IN (SELECT MAX(createdate) FROM ' . rex::getTable('project_manager_plus_logs') . ' GROUP BY domain_id)) as L + // ON D.id = L.domain_id + // WHERE L.status = 1 + // ORDER BY L.createdate DESC + // LIMIT 1 + + // '; + // &sort=cms&sorttype=desc + + if ($sort == "") { + $sort = "D.name"; + } + if ($sorttype == "") { + $sorttype = "ASC"; + } + + $sql = 'SELECT * FROM ( + SELECT id, name, domain, is_ssl, status, cms, api_key, param, maintenance FROM `rex_project_manager_plus_domain` ORDER BY domain ASC + ) AS D + LEFT JOIN (SELECT domain_id, `raw`, createdate FROM rex_project_manager_plus_logs WHERE id IN (SELECT MAX(id) FROM rex_project_manager_plus_logs GROUP BY domain_id)) AS L + ON D.id = L.domain_id + ORDER BY '.$sort.' '.$sorttype.''; + + $list = rex_list::factory($sql, 2000); + $list->setColumnFormat('id', 'Id'); + $list->addParam('page', 'project_manager_plus/server/overview'); + + $items = rex_sql::factory()->getArray($sql); + + // Cronjobcall + $sql2 = 'SELECT * FROM '. rex::getTable('cronjob').' + WHERE type = "rex_cronjob_project_manager_plus_data"'; + $cronjob = rex_sql::factory()->getArray($sql2); + $cronjobId = $cronjob[0]['id']; + + $refresh = ''; + if ($cronjobId != null) { + $refresh = ' Projektdaten aktualisieren'; + } + echo rex_view::info("Anzahl der Domains und Projekte: ".count($items) . $refresh); + + + // $tdIcon = ''; + // $thIcon = 'i18n('add_project'), 'add') . '>'; + // $list->addColumn($thIcon, $tdIcon, 0, ['###VALUE###', '###VALUE###']); + // $list->setColumnParams($thIcon, ['func' => 'edit', 'data_id' => '###id###']); + + $thIcon = ''; + $tdIcon = ''; + $list->addColumn($thIcon, $tdIcon, 0, ['###VALUE###', '###VALUE###']); + $list->setColumnParams($thIcon, ['func' => 'domain_edit', 'id' => '###id###']); + $list->setColumnFormat($thIcon, 'custom', function ($params) { + $filename = ''; + if (file_exists($this->getAssetsPath('favicon/'.$params['list']->getValue('domain').'.png'))) { + + $filename = $this->getAssetsUrl('favicon/'.$params['list']->getValue('domain').'.png'); + return ''; + } else { + return ''; + } + }); + + $list->setColumnParams('id', ['data_id' => '###id###', 'func' => 'edit']); + $list->setColumnSortable('id'); + + $list->removeColumn('id'); + $list->removeColumn('description'); + $list->removeColumn('api_key'); + $list->removeColumn('param'); + $list->removeColumn('domain_id'); + $list->removeColumn('raw'); + $list->removeColumn('domain'); + $list->removeColumn('cms'); + $list->removeColumn('tags'); + $list->removeColumn('createdate'); + + $list->setColumnLabel('name', $this->i18n('name')); + $list->setColumnParams('name', ['page' => 'project_manager_plus/server/projects', 'func' => 'updateinfos', 'domain' => '###domain###']); + + $list->setColumnLabel('domain', $this->i18n('domain')); + $list->addColumn($this->i18n('domain'), '###domain###', 3); + //$list->setColumnParams($this->i18n('domain'), ['page' => 'project_manager_plus/server/projects', 'domain' => '###domain###']); + $list->setColumnFormat($this->i18n('domain'), 'custom', function ($params) { + + $ssl = $params['list']->getValue('is_ssl'); + $protocol = ($ssl == 1) ? "https://" : "http://"; + + + if ($params['list']->getValue('raw')) { + $raw= json_decode($params['list']->getValue('raw'), true); + + if (isset($raw['rex_url_backend'])) { + $rex_url_backend = ' + + '; + } + } + + $return_string = ''; + if ((isset($rex_url_backend)) && ('' !== $rex_url_backend)) { + $return_string .= $rex_url_backend; + } + $return_string .= ' ' . $params['list']->getValue('domain') . ''; + + return $return_string; + + }); + + $list->setColumnLabel('is_ssl', $this->i18n('is_ssl')); + $list->setColumnLayout('is_ssl', ['###VALUE###', '###VALUE###']); + $list->setColumnFormat('is_ssl', 'custom', function ($params) { + if ($params['list']->getValue('is_ssl') == "1") { + return ' '; + } elseif ($params['list']->getValue('is_ssl') == "0") { + return ' '; + } else { + return "?"; + } + }); + + + $list->addColumn($this->i18n('update_content'), false, -1, ['###VALUE###', '###VALUE### ']); + $list->setColumnLabel('update_content', $this->i18n('update_content')); + $list->setColumnFormat($this->i18n('update_content'), 'custom', function ($params) { + if ($params['list']->getValue('raw')) { + $raw= json_decode($params['list']->getValue('raw'), true); + // dump($raw); + if (substr($raw['cms_version'], 0, 1) == 4) { //if REX 4.x + if (array_key_exists('update_article', $raw) && array_key_exists('update_media', $raw)) { + if ($raw['update_media'] > $raw['update_article']) { + return date('d.m.Y H:i:s', $raw['update_media']); + } else { + return date('d.m.Y H:i:s', $raw['update_article']); + } + } else { + return "-"; + } + } else { //if REX 5.x + return date('d.m.Y H:i:s', strtotime($raw['article'][0]['updatedate'])); + + } + } + }); + + + $list->setColumnLabel('status', $this->i18n('status')); + $list->setColumnFormat('status', 'custom', function ($params) { + if ($params['list']->getValue('status') == "1") { + return ''; + } elseif ($params['list']->getValue('status') == "0") { + return ''; + } elseif ($params['list']->getValue('status') == "-1") { + return ''; + } elseif ($params['list']->getValue('status') == "2") { + return ''; + } else { + + $api_key = ''; + if ($params['list']->getValue('api_key') != "") { + $api_key = $params['list']->getValue('api_key'); + } + + $param = ''; + if ($params['list']->getValue('param') != "") { + $param = $params['list']->getValue('param'); + $param = explode(',', $param); + $param = '&'.implode('&', $param); + } + + if ($params['list']->getValue('is_ssl') == 1) { + + return ''; + } + + if ($params['list']->getValue('is_ssl') == 0) { + + return ''; + } + } + }); + + $list->setColumnLayout('status', ['###VALUE###', '###VALUE###']); + + $list->setColumnLabel('maintenance', $this->i18n('maintenance_short')); + $list->setColumnFormat('maintenance', 'custom', function ($params) { + + if ($params['list']->getValue('maintenance') == "1") { + return ''; + } elseif ($params['list']->getValue('maintenance') == "0") { + return ''; + } elseif ($params['list']->getValue('maintenance') == null) { + return ''; + } + }); + + $list->setColumnLayout('maintenance', ['###VALUE###', '###VALUE###']); + + + $list->addColumn($this->i18n('pm_client_version'), false, -1, ['###VALUE###', '###VALUE### ']); + $list->setColumnLabel($this->i18n('pm_client_version'), $this->i18n('pm_client_version')); + $list->setColumnFormat($this->i18n('pm_client_version'), 'custom', function ($params) { + if ($params['list']->getValue('raw')) { + $raw= json_decode($params['list']->getValue('raw'), true); + return $raw['client_version']; + } + }); + + $list->addColumn($this->i18n('cms_version'), false, -1, ['###VALUE###', '###VALUE###']); + $list->setColumnLabel($this->i18n('cms_version'), $this->i18n('cms_version')); + $list->setColumnFormat($this->i18n('cms_version'), 'custom', function ($params) { + if ($params['list']->getValue('raw')) { + $raw= json_decode($params['list']->getValue('raw'), true); + + if (rex_config::get('project_manager_plus/server', 'cms_min') != "") { + $cms_min = rex_config::get('project_manager_plus/server', 'cms_min'); + } else { + $cms_min = '5.3.0'; + } + + if (rex_config::get('project_manager_plus/server', 'cms_4_min') != "") { + $cms_4_min = rex_config::get('project_manager_plus/server', 'cms_4_min'); + } else { + $cms_4_min = '4.7.0'; + } + + if ($params['list']->getValue('cms') == '4') { + if ($raw['cms_version'] < $cms_4_min) { + return ''.$raw['cms_version'].''; + } else { + return $raw['cms_version']; + } + } elseif ($params['list']->getValue('cms') == '5') { + if (version_compare($raw['cms_version'], $cms_min) < 0) { + return ''.$raw['cms_version'].''; + } else { + return $raw['cms_version']; + } + } + + return $raw['cms_version']; + } + }); + + + $list->addColumn($this->i18n('php_version'), false, -1, ['###VALUE###', '###VALUE###']); + + $list->setColumnLabel($this->i18n('php_version'), $this->i18n('php_version')); + $list->setColumnFormat($this->i18n('php_version'), 'custom', function ($params) { + if ($params['list']->getValue('raw')) { + $raw= json_decode($params['list']->getValue('raw'), true); + + if (rex_config::get('project_manager_plus/server', 'php_min') != "") { + $php_min = rex_config::get('project_manager_plus/server', 'php_min'); + } else { + $php_min = '5.3'; + } + + if (version_compare($raw['php_version'], $php_min) < 0) { + return ''.substr($raw['php_version'], 0, 3).''; + } else { + return substr($raw['php_version'], 0, 3); + } + } + }); + + $list->addColumn($this->i18n('updates'), false, -1, ['###VALUE###', '###VALUE###']); + $list->setColumnLabel($this->i18n('updates'), ($this->i18n('updates'))); + $list->setColumnFormat($this->i18n('updates'), 'custom', function ($params) { + $addon = ''; + $addon = $params['field']; + if ($params['list']->getValue('raw')) { + $log = json_decode($params['list']->getValue('raw'), true); + + + if (is_array($log) && array_key_exists("rex_addons", $log)) { + + if (json_last_error() === JSON_ERROR_NONE && $log["rex_addons"] && count($log["rex_addons"])) { + $i = 0; + $j = 0; + foreach ($log["rex_addons"] as $addon) { + + $skip_addon_config = ''; + $skip_addon_config = rex_config::get('project_manager_plus/server', 'skip_addon'); + if ($skip_addon_config != "") { + $skip_addons = explode(',', $skip_addon_config); + if (in_array($addon['name'], $skip_addons)) { + continue; + } + } + + if (version_compare($addon['version_current'], $addon['version_latest']) < 0) { + + $skip_addon_version_config = ''; + $skip_addon_version_config = rex_config::get('project_manager_plus/server', 'skip_addon_version'); + + if ($skip_addon_version_config != "") { + $skip_addon_versions = explode(',', $skip_addon_version_config); + } + + $skip = false; + + if (isset($skip_addon_versions) && is_array($skip_addon_versions)) { + foreach ($skip_addon_versions as $skip_addon_version) { + + if (strpos($addon['version_latest'], $skip_addon_version)) { + $skip = true; + } + } + } + + if ($addon['version_latest'] == 0) { + $skip = true; + } + + if ($skip === false) { + $i++; + } + + } else { + $j++; + } + } + + if ($i > 0) { + return $i ." ". $this->i18n('updates_necessary'); + } else { + return "-"; + } + } else { + return ""; + } + } elseif ($params['list']->getValue('cms') == 4) { + return "-"; + } + } + }); + + + $list->addColumn($this->i18n('syslog'), false, -1, ['###VALUE###', '###VALUE###']); + $list->setColumnLabel($this->i18n('syslog'), $this->i18n('syslog')); + $list->setColumnFormat($this->i18n('syslog'), 'custom', function ($params) { + if ($params['list']->getValue('raw')) { + $raw= json_decode($params['list']->getValue('raw'), true); + if (is_array($raw) && array_key_exists("syslog", $raw)) { + + $syslog = $raw['syslog']; + $show_triangle = false; + + foreach ($syslog as $entry) { + if ($entry["syslog_type"] != 'Info') { + $show_triangle = true; + } + } + if ($show_triangle == true) { + return ''; + } else { + return ''; + } + } elseif ($params['list']->getValue('cms') == 5) { + return ''; + } else { + return '-'; + } + } + }); + + $list->setColumnParams($this->i18n('domain'), ['page' => 'project_manager_plus/server/projects', 'domain' => '###domain###']); + + $list->addColumn(rex_i18n::msg('view'), ''); + $list->setColumnLayout(rex_i18n::msg('view'), ['', '###VALUE###']); + $list->setColumnParams(rex_i18n::msg('view'), ['page' => 'project_manager_plus/server/projects', 'domain' => '###domain###'] + $csrf->getUrlParams()); + + $list->addColumn(rex_i18n::msg('function'), ''); + $list->setColumnLayout(rex_i18n::msg('function'), ['###VALUE###', '###VALUE###']); + $list->setColumnParams(rex_i18n::msg('function'), ['data_id' => '###id###', 'func' => 'edit']); + + + $list->addColumn(rex_i18n::msg('delete'), ''); + $list->setColumnLayout(rex_i18n::msg('delete'), ['', '###VALUE###']); + $list->setColumnParams(rex_i18n::msg('delete'), ['data_id' => '###id###', 'func' => 'delete'] + $csrf->getUrlParams()); + $list->addLinkAttribute(rex_i18n::msg('delete'), 'onclick', 'return confirm(\' id=###id### ' . rex_i18n::msg('delete') . ' ?\')'); + + $showArticle = function ($params) { + $id = $params['list']->getValue($params['field']); + if ($id == 0) { + return $this->i18n('root'); + } else { + if (($article = rex_article::get($id))) { + if ($article->isStartArticle()) { + $link = 'index.php?page=structure&category_id='.$id.'&clang=1'; + } else { + $link = 'index.php?page=content&article_id='.$id.'&mode=edit&clang=1'; + } + return $article->getName().' ['.$id.']'; + } + } + return '['.$id.']'; + }; + + $content = $list->get(); + $content = str_replace('setVar('title', $this->i18n('projects')); + $fragment->setVar('content', $content, false); + echo $fragment->parse('core/page/section.php'); +} diff --git a/pages/settings.client.php b/pages/settings.client.php new file mode 100644 index 0000000..c505697 --- /dev/null +++ b/pages/settings.client.php @@ -0,0 +1,19 @@ +i18n('project_manager_plus_client_title')); + +$form = rex_config_form::factory($addon->getName()); + +// API Key +$field = $form->addInputField('text', 'project_manager_plus_api_key', null, ['class' => 'form-control']); +$field->setLabel($addon->i18n('project_manager_plus_api_key_label')); +$field->setNotice($addon->i18n('project_manager_plus_api_key_notice') . ' 13f15d69755585c3a825c3eccf2d654fc6578dadb7e05475'); + +$fragment = new rex_fragment(); +$fragment->setVar('class', 'edit', false); +$fragment->setVar('title', $addon->i18n('project_manager_plus_client_title'), false); +$fragment->setVar('body', $form->get(), false); + +echo $fragment->parse('core/page/section.php'); diff --git a/pages/settings.pagespeed.php b/pages/settings.pagespeed.php new file mode 100644 index 0000000..d27aeb5 --- /dev/null +++ b/pages/settings.pagespeed.php @@ -0,0 +1,18 @@ +i18n('project_manager_plus_pagespeed_api_key_title')); + +$form = rex_config_form::factory($addon->getName()); + +// API Key +$field = $form->addInputField('text', 'project_manager_plus_pagespeed_api_key', null, ['class' => 'form-control']); +$field->setLabel($addon->i18n('project_manager_plus_pagespeed_api_key_label')); +$field->setNotice($addon->i18n('project_manager_plus_pagespeed_api_key_notice')); + +$fragment = new rex_fragment(); +$fragment->setVar('class', 'edit', false); +$fragment->setVar('title', $addon->i18n('project_manager_plus_pagespeed_api_key_title'), false); +$fragment->setVar('body', $form->get(), false); +echo $fragment->parse('core/page/section.php'); diff --git a/pages/settings.server.php b/pages/settings.server.php new file mode 100644 index 0000000..5132e12 --- /dev/null +++ b/pages/settings.server.php @@ -0,0 +1,41 @@ +i18n('project_manager_plus_server_title')); + +$form = rex_config_form::factory($addon->getName()); + +// PHP MIN +$field = $form->addSelectField('php_min', null, ['class' => 'form-control']); +$field->setLabel($addon->i18n('project_manager_plus_server_php_min')); +$select = $field->getSelect(); +$phpVersions = $addon->getProperty('php_versions'); +foreach ($phpVersions as $version) { + $select->addOption($version, $version); +} + +// CMS MIN +$field = $form->addSelectField('cms_min', null, ['class' => 'form-control']); +$field->setLabel($addon->i18n('project_manager_plus_server_cms_min')); +$select = $field->getSelect(); +$cmsVersions = $addon->getProperty('cms_versions'); +foreach ($cmsVersions as $version) { + $select->addOption($version, $version); +} + +// Skip Addon +$field = $form->addInputField('text', 'skip_addon', null, ['class' => 'form-control']); +$field->setLabel($addon->i18n('project_manager_plus_server_skip_addon')); +$field->setNotice($addon->i18n('project_manager_plus_server_skip_addon_notice')); + +// Skip Addon Version +$field = $form->addInputField('text', 'skip_addon_version', null, ['class' => 'form-control']); +$field->setLabel($addon->i18n('project_manager_plus_server_skip_addon_version')); +$field->setNotice($addon->i18n('project_manager_plus_server_skip_addon_version_notice')); + +$fragment = new rex_fragment(); +$fragment->setVar('class', 'edit', false); +$fragment->setVar('title', $addon->i18n('project_manager_plus_server_title'), false); +$fragment->setVar('body', $form->get(), false); +echo $fragment->parse('core/page/section.php'); diff --git a/plugins/client/boot.php b/plugins/client/boot.php deleted file mode 100644 index 0d1704b..0000000 --- a/plugins/client/boot.php +++ /dev/null @@ -1,4 +0,0 @@ -getArray('SELECT VERSION()'); - $update_article = $sql->getArray('SELECT `updatedate` FROM `'.$REX['TABLE_PREFIX'].'article_slice` ORDER BY `updatedate` DESC'); - $update_media = $sql->getArray('SELECT `updatedate` FROM `'.$REX['TABLE_PREFIX'].'file` ORDER BY `updatedate` DESC'); - - $project_manager["mysql_version"] = $res[0]['VERSION()']; - $project_manager["update_article"] = $update_article[0]['updatedate']; - $project_manager["update_media"] = $update_media[0]['updatedate']; - - } - -} -echo json_encode($project_manager); \ No newline at end of file diff --git a/plugins/client/lang/de_de.lang b/plugins/client/lang/de_de.lang deleted file mode 100644 index 1ed913a..0000000 --- a/plugins/client/lang/de_de.lang +++ /dev/null @@ -1,21 +0,0 @@ - - -client_navigation_title = Navigation [ main_navi.md ] -client_content_title = Inhalt [ {0} ] - -client_noparser = Kein Markdown-Parser vorhanden! Bitte zuerst einen Parser installieren (Addon markitup oder textile) - -client_navinotfound = Navigations-Datei {0} wurde nicht gefunden!
Diese Datei ist zwingend erforderlich! -client_filenotfound = Datei {0} wurde nicht gefunden. Inhalt existiert (noch) nicht.

Wir freuen uns über Mithilfe: {1} - -project_manager_client_menu_entry = Client -project_manager_client_page_entry = Einstellungen -project_manager_client_title = Einstellungen -project_manager_client_readme = Hilfe -project_manager_api_key_title = Client -project_manager_api_key_label = API-Schlüssel -project_manager_api_key_notice = API-Schlüssel aus Server Plugin eintragen, z.B. -project_manager_save = Speichern - - -perm_general_project_manager_client[] = project_manager_client[] - Rechte für Projekt Manager Client \ No newline at end of file diff --git a/plugins/client/lang/en_gb.lang b/plugins/client/lang/en_gb.lang deleted file mode 100644 index df474a2..0000000 --- a/plugins/client/lang/en_gb.lang +++ /dev/null @@ -1,21 +0,0 @@ - - -client_navigation_title = Navigation [ main_navi.md ] -client_content_title = Content [ {0} ] - -client_noparser = No Markdown parser available! Please install a parser first (ex. addon markitup or textile) - -client_navinotfound = Navigation file {0} not found!
This file is required! -client_filenotfound = File {0} not found! Content does not (yet) exist.

Help wanted and welcome: {1} - -project_manager_client_menu_entry = Client -project_manager_client_page_entry = Settings -project_manager_client_title = Settings -project_manager_client_readme = Help -project_manager_api_key_title = Client -project_manager_api_key_label = API key -project_manager_api_key_notice = Enter API key from Server plugin, ex.: -project_manager_save = Save - - -perm_general_project_manager_client[] = project_manager_client[] - Rights for Project Manager Client \ No newline at end of file diff --git a/plugins/client/lang/es_es.lang b/plugins/client/lang/es_es.lang deleted file mode 100644 index 963b0f8..0000000 --- a/plugins/client/lang/es_es.lang +++ /dev/null @@ -1,19 +0,0 @@ -client_navigation_title = Navegación [main_navi.md] -client_content_title = Contenido [ {0} ] - -client_noparser = ¡No hay analizador de rebajas disponible! Primero instale un analizador (marcado adicional o textil) - -client_navinotfound = ¡No se encontró el archivo de navegación {0} !
¡Este archivo es obligatorio! -client_filenotfound = No se encontró el archivo {0} . El contenido no existe (todavía).

Nos complace ayudar: {1} - -project_manager_client_menu_entry = Cliente -project_manager_client_page_entry = Ajustes -project_manager_client_title = Ajustes -project_manager_client_readme = Ayuda -project_manager_api_key_title = Cliente -project_manager_api_key_label = Clave API -project_manager_api_key_notice = Ingrese la clave API del complemento del servidor, por ejemplo: -project_manager_save = Guardar - - -perm_general_project_manager_client[] = project_manager_client[] - Derechos para Project Manager Client \ No newline at end of file diff --git a/plugins/client/lang/pt_br.lang b/plugins/client/lang/pt_br.lang deleted file mode 100644 index fed2d11..0000000 --- a/plugins/client/lang/pt_br.lang +++ /dev/null @@ -1,9 +0,0 @@ -documentation_menu_entry = Documentação - -documentation_navigation_title = Navegação [ main_navi.md ] -documentation_content_title = Conteúdo [ {0} ] - -documentation_noparser = Nenhum analisador Markdown disponível! Instale primeiro um analisador (AddOn markitup or textile) - -documentation_navinotfound = Arquivo de navegação {0} não localizado!
Este arquivo é necessário! -documentation_filenotfound = Arquivo {0} não localizado. Conteúdos não existem (ainda)

Ficaríamos felizes se você quisesse ajudar: {1} diff --git a/plugins/client/lang/sv_se.lang b/plugins/client/lang/sv_se.lang deleted file mode 100644 index 7a7938b..0000000 --- a/plugins/client/lang/sv_se.lang +++ /dev/null @@ -1,21 +0,0 @@ - - -client_navigation_title = Navigation [ main_navi.md ] -client_content_title = Innehåll [ {0} ] - -client_noparser = Ingen markdown-parser tillgänglig! Installera först en parser (addon markitup eller textile) - -client_navinotfound = Navigationsfil {0} hittades inte!
Den här filen är ett måste! -client_filenotfound = Filen {0} hittades inte. Innehållet finns inte (ännu).

Vi hjälper gärna till: {1} - -project_manager_client_menu_entry = Client -project_manager_client_page_entry = Inställningar -project_manager_client_title = Inställningar -project_manager_client_readme = Hjälp -project_manager_api_key_title = Client -project_manager_api_key_label = API-key -project_manager_api_key_notice = Ange API-nyckel från serverplugin, t.ex. -project_manager_save = Spara - - -perm_general_project_manager_client[] = project_manager_client [] - Rättigheter för Project Manager Client \ No newline at end of file diff --git a/plugins/client/lib/rex_api_project_manager.php b/plugins/client/lib/rex_api_project_manager.php deleted file mode 100644 index cb4b750..0000000 --- a/plugins/client/lib/rex_api_project_manager.php +++ /dev/null @@ -1,147 +0,0 @@ -getProperty('version'); - $params['client_version'] = rex_plugin::get('project_manager', 'client')->getProperty('version'); - $params['rex_version'] = rex::getVersion(); - $params['cms'] = "REDAXO"; - $params['cms_version'] = rex::getVersion(); - $params['rex_url_backend'] = rex_url::backend(); - $params['php_version'] = phpversion(); - $params['mysql_version'] = rex_sql::getServerVersion(); - $params['status'] = 1; - $params['debug'] = rex::isDebugMode(); - - # / REDAXO / SERVER / ALLGEMEIN - - # ADDONS - - $rex_addons = rex_addon::getInstalledAddons(); - - rex_install_webservice::deleteCache(); - - try { - $installer_addons = rex_install_packages::getAddPackages(); - } catch (rex_functional_exception $e) { - $params['message'][] = $e->getMessage(); - } - - foreach($rex_addons as $key => $addon) { - $params['rex_addons'][$key]['name'] = $addon->getName(); - $params['rex_addons'][$key]['install'] = $addon->getProperty('install'); - $params['rex_addons'][$key]['status'] = $addon->getProperty('status'); - $params['rex_addons'][$key]['version_current'] = $addon->getProperty('version'); - if(!empty($installer_addons[$key])) { - $params['rex_addons'][$key]['version_latest'] = current($installer_addons[$key]["files"])["version"]; - } else { - $params['rex_addons'][$key]['version_latest'] = 0; - } - } - - # / ADDONS - - # DOMAINS / WEBSITES - - $params['domains'][rex::getServer()]['name'] = rex::getServer(); - $params['domains'][rex::getServer()]['url'] = rex_getUrl(rex_article::getSiteStartArticleId()); - $params['domains'][rex::getServer()]['url_404'] = rex_getUrl(rex_article::getNotfoundArticleId()); - - if(rex_addon::get('yrewrite')->isAvailable()) { - - $yrewrite_domains = rex_yrewrite::getDomains(true); - foreach($yrewrite_domains as $key => $domain) { - $params['domains'][$key]['name'] = $domain->getName(); - $params['domains'][$key]['url'] = $domain->getUrl(); - $params['domains'][$key]['url_404'] = rex_yrewrite::getFullUrlByArticleId($domain->getNotfoundId()); - } - } - - # / DOMAINS / WEBSITES - - # SYSLOG - - if (version_compare(rex::getVersion(), '5.9') >= 0) { - $log = new rex_log_file(rex_path::log('system.log')); - } else { - $log = new rex_log_file(rex_path::coreData('system.log')); - } - - $i = 0; - foreach (new LimitIterator($log, 0, 30) as $entry) { - $data = $entry->getData(); - $params['syslog'][$i]['timestamp'] = $entry->getTimestamp('%d.%m.%Y %H:%M:%S'); - $params['syslog'][$i]['syslog_type'] = $data[0]; - $params['syslog'][$i]['syslog_message'] = $data[1]; - $params['syslog'][$i]['syslog_file'] = (isset($data[2]) ? $data[2] : ''); - $params['syslog'][$i]['syslog_line'] = (isset($data[3]) ? $data[3] : ''); - $i++; - } - - # / SYSLOG - - - # USER - $params['user'] = rex_sql::factory()->getArray('SELECT `name`, `login`, `email`, `status`, `admin`, `lasttrydate`, `lastlogin` FROM '.rex::getTablePrefix().'user ORDER BY `admin`, `id`'); - # / USER - - # TODO: Letzte Artikel - $params['article'] = rex_sql::factory()->getArray('SELECT `name`, `updateuser`, `updatedate`, `pid` FROM `'.rex::getTablePrefix().'article` ORDER BY `updatedate` DESC LIMIT 10'); - # / Letzte Artikel - - # TODO: Letzte Medien - $params['media'] = rex_sql::factory()->getArray('SELECT `filename`, `updateuser`, `updatedate` FROM `'.rex::getTablePrefix().'media` ORDER BY `updatedate` DESC LIMIT 10'); - # / Letzte Medien - - # Modules - $params['module'] = rex_sql::factory()->getArray('SELECT `name`, `updateuser`, `updatedate` FROM `'.rex::getTablePrefix().'module` ORDER BY `name` ASC'); - # / Modules - } - - - - } else { - $params['pm_version'] = rex_addon::get('project_manager')->getProperty('version'); - $params['cms'] = "REDAXO"; - $params['status'] = 0; - $params['message'][] = "Falscher API-Schlüssel."; - } - - // TODO: EP, um weitere Parameter einzuhängen - - header('Content-Type: application/json; charset=UTF-8'); - $response = json_encode($params, true); - echo $response; - exit(); - } -} - -?> \ No newline at end of file diff --git a/plugins/client/package.yml b/plugins/client/package.yml deleted file mode 100644 index be67495..0000000 --- a/plugins/client/package.yml +++ /dev/null @@ -1,17 +0,0 @@ -package: project_manager/client -version: '1.1.0' -author: 'Friends Of REDAXO' -supportpage: https://github.com/FriendsOfREDAXO/project_manager - -page: - title: 'translate:client_menu_entry' - icon: rex-icon fa-wrench # Icon von Font Awesome - perm: project_manager_client[] - -pages: - project_manager/client/page: - title: translate:project_manager_client_page_entry - -requires: - packages: - project_manager: '^1.2.0' \ No newline at end of file diff --git a/plugins/client/pages/project_manager.client.page.php b/plugins/client/pages/project_manager.client.page.php deleted file mode 100644 index 64f1f23..0000000 --- a/plugins/client/pages/project_manager.client.page.php +++ /dev/null @@ -1,49 +0,0 @@ -setConfig(rex_post('settings', [ - ['project_manager_api_key', 'string'] - ])); - - $message = $this->i18n('project_manager_api_key_saved_successful'); -} - -$content = ''; - - -$formElements = []; -$n = []; -$n['label'] = ''; -$n['field'] = ''; -$n['note'] = $this->i18n('project_manager_api_key_notice').' 13f15d69755585c3a825c3eccf2d654fc6578dadb7e05475'; - -$formElements[] = $n; - - - -$fragment = new rex_fragment(); -$fragment->setVar('elements', $formElements, false); -$fragment->setVar('class', "panel panel-warning", false); -$content .= $fragment->parse('core/form/form.php'); - -$formElements = []; -$n = []; -$n['field'] = ''; -$formElements[] = $n; - -$fragment = new rex_fragment(); -$fragment->setVar('flush', true); -$fragment->setVar('elements', $formElements, false); -$buttons = $fragment->parse('core/form/submit.php'); - -$fragment = new rex_fragment(); -$fragment->setVar('class', 'edit', false); -$fragment->setVar('title', $this->i18n('project_manager_client_title'), false); -$fragment->setVar('body', $content, false); -$fragment->setVar('buttons', $buttons, false); -$content = $fragment->parse('core/page/section.php'); -echo ' -
- ' . $content . ' -'; \ No newline at end of file diff --git a/plugins/client/pages/project_manager.client.readme.php b/plugins/client/pages/project_manager.client.readme.php deleted file mode 100644 index e69de29..0000000 diff --git a/plugins/hosting/boot.php b/plugins/hosting/boot.php deleted file mode 100644 index 146a58b..0000000 --- a/plugins/hosting/boot.php +++ /dev/null @@ -1,39 +0,0 @@ -isAvailable()) { - rex_cronjob_manager::registerType('rex_cronjob_project_manager_hosting'); -} - -// PROJECT_MANAGER_SERVER_DETAIL_HOOK -if (rex::isBackend() && rex::getUser()) { - - rex_extension::register('PROJECT_MANAGER_SERVER_DETAIL_HOOK', function (rex_extension_point $ep) { - - $exist = ''; - if ($ep->getSubject() != "") { - $exist = $ep->getSubject(); - } - - $params = $ep->getParams(); - $panel = include(rex_path::plugin('project_manager', 'hosting', 'pages/content.hosting.php')); - - $fragment = new rex_fragment(); - $fragment->setVar('title', "Hosting", false); - $fragment->setVar('body', $panel, false); - $fragment->setVar('class', 'panel panel-info', false); - $fragment->setVar('domain', $params["domain"], false); - - $fragment->setVar('collapse', true); - $fragment->setVar('collapsed', true); - $hosting = '
'.$fragment->parse('core/page/section.php').'
'; - - return $exist.$hosting; - - }, rex_extension::LATE); -} - - -if (rex::isBackend() && is_object(rex::getUser())) { - rex_perm::register('project_manager_hosting[]'); -} - diff --git a/plugins/hosting/install.php b/plugins/hosting/install.php deleted file mode 100644 index 0c076f4..0000000 --- a/plugins/hosting/install.php +++ /dev/null @@ -1,47 +0,0 @@ -ensurePrimaryIdColumn() - ->ensureColumn(new rex_sql_column('domain', 'varchar(255)', false, null, ''))->setPrimaryKey('domain') - ->ensureColumn(new rex_sql_column('raw', 'longtext', true)) - ->ensureColumn(new rex_sql_column('ip', 'text')) - ->ensureColumn(new rex_sql_column('createdate', 'timestamp', false, '0000-00-00 00:00:00', 'on update CURRENT_TIMESTAMP')) - ->ensureColumn(new rex_sql_column('status', 'text')) - ->ensure(); - - -// Create cronjob -$now = new DateTime(); -$startdate = date('Y-m-d 00:00:00',strtotime( "tomorrow" )); - -$cronjob = rex_sql::factory(); -$cronjob->setDebug(true); -$cronjob->setQuery('SELECT id FROM '.rex::getTable('cronjob'). ' WHERE type LIKE "rex_cronjob_project_manager_hosting"'); - -if ($cronjob->getRows() == 0) { - - $cronjob = rex_sql::factory(); - $cronjob->setDebug(true); - $cronjob->setTable(rex::getTable('cronjob')); - $cronjob->setValue('name','Projekt Manager: Hosting Daten'); - $cronjob->setValue('description',''); - $cronjob->setValue('type','rex_cronjob_project_manager_hosting'); - $cronjob->setValue('interval','{"minutes":[0],"hours":[0],"days":"all","weekdays":"all","months":"all"}'); - $cronjob->setValue('environment','|backend|'); - $cronjob->setValue('execution_start','1970-01-01 01:00:00'); - $cronjob->setValue('status','1'); - $cronjob->setValue('parameters','[]'); - $cronjob->setValue('nexttime',$startdate); - $cronjob->setValue('createdate',$now->format('Y-m-d H:i:s')); - $cronjob->setValue('updatedate',$now->format('Y-m-d H:i:s')); - $cronjob->setValue('createuser',rex::getUser()->getLogin()); - $cronjob->setValue('updateuser',rex::getUser()->getLogin()); - - try { - $cronjob->insertOrUpdate(); - echo rex_view::success('Der Cronjob "Projekt Manager: Hosting Daten" wurde angelegt. '); - } catch (rex_sql_exception $e) { - echo rex_view::warning('Der Cronjob "Projekt Manager: Hosting Daten" wurde nicht angelegt.
Wahrscheinlich existiert er schon.'); - } -} \ No newline at end of file diff --git a/plugins/hosting/lang/de_de.lang b/plugins/hosting/lang/de_de.lang deleted file mode 100644 index 09fb7a4..0000000 --- a/plugins/hosting/lang/de_de.lang +++ /dev/null @@ -1,19 +0,0 @@ -project_manager_hosting_menu_entry = Hosting - -project_manager_hosting_projects = Projekte -project_manager_hosting_title = Übersicht -project_manager_hosting_domain_norows_message = Kein Projekt vorhanden -project_manager_cronjob_hosting_name = Projekt Manager: Hole Hosting Daten - -project_manager_hosting_name = Projektname -project_manager_hosting_domain = Domain -project_manager_hosting_createdate = Letzte Änderung -project_manager_hosting_ip = IPv4-Adresse -project_manager_hosting_is_ssl = SSL -project_manager_hosting_organisation = Organisation -project_manager_hosting_isp = ISP -project_manager_hosting_domain_norows_message = Keine Einträge vorhanden -project_manager_hosting_validTo = Zertifikat Enddatum -project_manager_hosting_validFrom = Zertifikat Startdatum - -perm_general_project_manager_hosting[] = project_manager_hosting[] - Rechte für Projekt Manager Hosting \ No newline at end of file diff --git a/plugins/hosting/lang/en_gb.lang b/plugins/hosting/lang/en_gb.lang deleted file mode 100644 index 98f6bce..0000000 --- a/plugins/hosting/lang/en_gb.lang +++ /dev/null @@ -1,19 +0,0 @@ -project_manager_hosting_menu_entry = Hosting - -project_manager_hosting_projects = Projects -project_manager_hosting_title = Overview -project_manager_hosting_domain_norows_message = no entries found -project_manager_cronjob_hosting_name = Project Manager: get hosting date - -project_manager_hosting_name = Projectname -project_manager_hosting_domain = Domain -project_manager_hosting_createdate = Last changes -project_manager_hosting_ip = IPv4-Address -project_manager_hosting_is_ssl = SSL -project_manager_hosting_organisation = Organisation -project_manager_hosting_isp = ISP -project_manager_hosting_domain_norows_message = no entries found -project_manager_hosting_validTo = Certificate enddate -project_manager_hosting_validFrom = Certificate startdate - -perm_general_project_manager_hosting[] = project_manager_hosting[] - Permissions for Project Manager Hosting diff --git a/plugins/hosting/lang/es_es.lang b/plugins/hosting/lang/es_es.lang deleted file mode 100644 index 34478ce..0000000 --- a/plugins/hosting/lang/es_es.lang +++ /dev/null @@ -1,19 +0,0 @@ -project_manager_hosting_menu_entry = Hosting - -project_manager_hosting_projects = Projects -project_manager_hosting_title = Overview -project_manager_hosting_domain_norows_message = no entries found -project_manager_cronjob_hosting_name = Project Manager: get hosting date - -project_manager_hosting_name = Projectname -project_manager_hosting_domain = Domain -project_manager_hosting_createdate = Last changes -project_manager_hosting_ip = IPv4-Address -project_manager_hosting_is_ssl = SSL -project_manager_hosting_organisation = Organisation -project_manager_hosting_isp = ISP -project_manager_hosting_domain_norows_message = no entries found -project_manager_hosting_validTo = Certificate enddate -project_manager_hosting_validFrom = Certificate startdate - -perm_general_project_manager_hosting[] = project_manager_hosting[] - Project Manager Hosting \ No newline at end of file diff --git a/plugins/hosting/lang/pt_br.lang b/plugins/hosting/lang/pt_br.lang deleted file mode 100644 index fd01df2..0000000 --- a/plugins/hosting/lang/pt_br.lang +++ /dev/null @@ -1,19 +0,0 @@ -project_manager_hosting_menu_entry = Hosting - -project_manager_hosting_projects = Projects -project_manager_hosting_title = Overview -project_manager_hosting_domain_norows_message = no projects found -project_manager_cronjob_hosting_name = Project Manager: get hosting date - -project_manager_hosting_name = Projectname -project_manager_hosting_domain = Domain -project_manager_hosting_createdate = Last changes -project_manager_hosting_ip = IPv4-Address -project_manager_hosting_is_ssl = SSL -project_manager_hosting_organisation = Organisation -project_manager_hosting_isp = ISP -project_manager_hosting_domain_norows_message = no entries found -project_manager_hosting_validTo = Certificate enddate -project_manager_hosting_validFrom = Certificate startdate - -perm_general_project_manager_hosting[] = project_manager_hosting[] - Project Manager Hosting \ No newline at end of file diff --git a/plugins/hosting/lang/sv_se.lang b/plugins/hosting/lang/sv_se.lang deleted file mode 100644 index 34478ce..0000000 --- a/plugins/hosting/lang/sv_se.lang +++ /dev/null @@ -1,19 +0,0 @@ -project_manager_hosting_menu_entry = Hosting - -project_manager_hosting_projects = Projects -project_manager_hosting_title = Overview -project_manager_hosting_domain_norows_message = no entries found -project_manager_cronjob_hosting_name = Project Manager: get hosting date - -project_manager_hosting_name = Projectname -project_manager_hosting_domain = Domain -project_manager_hosting_createdate = Last changes -project_manager_hosting_ip = IPv4-Address -project_manager_hosting_is_ssl = SSL -project_manager_hosting_organisation = Organisation -project_manager_hosting_isp = ISP -project_manager_hosting_domain_norows_message = no entries found -project_manager_hosting_validTo = Certificate enddate -project_manager_hosting_validFrom = Certificate startdate - -perm_general_project_manager_hosting[] = project_manager_hosting[] - Project Manager Hosting \ No newline at end of file diff --git a/plugins/hosting/lib/project-manager-hosting.cronjob.php b/plugins/hosting/lib/project-manager-hosting.cronjob.php deleted file mode 100644 index d041dd3..0000000 --- a/plugins/hosting/lib/project-manager-hosting.cronjob.php +++ /dev/null @@ -1,132 +0,0 @@ -setDebug(0)->getArray('SELECT D.domain AS domain, D.is_ssl as is_ssl FROM - (SELECT domain, createdate FROM rex_project_manager_domain_hosting) AS H - RIGHT JOIN - (SELECT domain, updatedate, is_ssl FROM rex_project_manager_domain) AS D - ON - H.domain = D.domain - GROUP BY D.domain - ORDER BY H.createdate ASC'); - - - $message = ''; - $error = false; - - foreach($websites as $website) { - - // because call limit ip-api.com - usleep(800000); - $domain = $website['domain']; - $ip = gethostbyname(idn_to_ascii($domain, INTL_IDNA_VARIANT_UTS46)); - $url = 'http://ip-api.com/json/'.$ip; - - $ch = curl_init(); - - $options = array( - CURLOPT_FOLLOWLOCATION => true, - CURLOPT_AUTOREFERER => true, - CURLOPT_MAXREDIRS => 4, - CURLOPT_HEADER => false, - CURLOPT_SSL_VERIFYPEER => false, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_TIMEOUT => 10, - CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0', - CURLOPT_URL => $url - ); - - curl_setopt_array($ch, $options); - $resps[$domain .";hosting"] = curl_exec($ch); - - curl_close($ch); - - if($website['is_ssl']) { - $prefix = "https://"; - - // SSL Certificate - set_error_handler(function(){return true;}); - $orignal_parse = parse_url($prefix.$domain, PHP_URL_HOST); - $get = stream_context_create(array("ssl" => array("capture_peer_cert" => TRUE))); - $read = stream_socket_client("ssl://".$orignal_parse.":443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $get); - $cert = stream_context_get_params($read); - restore_error_handler(); - $certinfo = openssl_x509_parse($cert['options']['ssl']['peer_certificate']); - - $arr = json_decode($resps[$domain .";hosting"], TRUE); - $arr['validFrom'] = $certinfo['validFrom_time_t']; - $arr['validTo'] = $certinfo['validTo_time_t']; - $resps[$domain .";hosting"] = json_encode($arr); - - } else { - - $arr = json_decode($resps[$domain .";hosting"], TRUE); - $arr['validFrom'] = "-"; - $arr['validTo'] = "-"; - $resps[$domain .";hosting"] = json_encode($arr); - - } - - } - - foreach ($resps as $key => $response) { - - $domain = explode(";", $key)[0]; - $mode = explode(";", $key)[1]; - - $hosting = json_decode($response, true); - $ip = ''; - $ip = gethostbyname(idn_to_ascii($domain)); - - if(json_last_error() === JSON_ERROR_NONE && (!array_key_exists("message", $hosting))) { - if($mode == "hosting") { - - rex_sql::factory()->setDebug(0)->setQuery('INSERT INTO ' . rex::getTable('project_manager_domain_hosting') . ' (`domain`, `raw`, `createdate`, `ip`, `status`) VALUES(:domain, :response, NOW(), :ip, 1) - ON DUPLICATE KEY UPDATE domain = :domain, `raw` = :response, createdate = NOW(), `ip` = :ip, `status` = 1', [":domain" => $domain, ":response" => $response, ":ip" => $ip] ); - - } - } else { - - // ERROR HANDLE - if($mode == "hosting") { - - rex_sql::factory()->setDebug(0)->setQuery('INSERT INTO ' . rex::getTable('project_manager_domain_hosting') . ' (`domain`, `raw`, `createdate`, `ip`, `status`) VALUES(:domain, :response, NOW(), :ip, -1) - ON DUPLICATE KEY UPDATE domain = :domain, `raw` = :response, createdate = NOW(), `ip` = :ip, `status` = -1', [":domain" => $domain, ":response" => $response, ":ip" => $ip] ); - - } - - $message .= $domain.': '.$hosting['status'].' '.$hosting['message'].'\n'; - $error = true; - - } - } - - - - - if ($error === true) { - $this->setMessage($message); - return false; - } else { - return true; - } - - return true; - } - - public function getTypeName() - { - return rex_i18n::msg('project_manager_cronjob_hosting_name'); - } - - public function getParamFields() - { - return []; - } -} -?> \ No newline at end of file diff --git a/plugins/hosting/package.yml b/plugins/hosting/package.yml deleted file mode 100644 index 426ce7b..0000000 --- a/plugins/hosting/package.yml +++ /dev/null @@ -1,19 +0,0 @@ -package: project_manager/hosting -version: '1.0.8' -author: 'Friends Of REDAXO' -supportpage: https://github.com/FriendsOfREDAXO/project_manager - -page: - title: 'translate:hosting_menu_entry' - icon: rex-icon fa-server # Icon von Font Awesome - perm: project_manager_hosting[] - -pages: - project_manager/hosting/overview: - title: translate:project_manager_hosting_title - -requires: - packages: - project_manager: '^1.2.0' - cronjob: '>=2.3.0' - project_manager/server: '>=1.3.8' \ No newline at end of file diff --git a/plugins/hosting/pages/content.hosting.php b/plugins/hosting/pages/content.hosting.php deleted file mode 100644 index 1430c59..0000000 --- a/plugins/hosting/pages/content.hosting.php +++ /dev/null @@ -1,52 +0,0 @@ -setDebug(0)->getArray($query, [$domain]); - - if (count($result) > 0) { - - $item = $result[0]; - $raw = json_decode($item['raw'], true); - - if(is_array($raw)) { - - if (is_numeric($raw['validTo'])) { - - if ($raw['validTo'] < (time() + 2764800) ) { - $validTo = ''.rex_formatter::format($raw['validTo'],'date','d.m.Y H:i:s').''; - $validFrom = rex_formatter::format($raw['validFrom'],'date','d.m.Y H:i:s'); - } else if ($raw['validTo'] < time()) { - $validTo = ''.rex_formatter::format($raw['validTo'],'date','d.m.Y H:i:s').''; - $validFrom = rex_formatter::format($raw['validFrom'],'date','d.m.Y H:i:s'); - } else { - $validTo = rex_formatter::format($raw['validTo'],'date','d.m.Y H:i:s'); - $validFrom = rex_formatter::format($raw['validFrom'],'date','d.m.Y H:i:s'); - } - } else { - $validFrom = "-"; - $validTo = "-"; - } - - $output = '
'; - $output .= ''; - $output .= '
'.$this->i18n('organisation').''.$this->i18n('isp').''. $this->i18n('project_manager_hosting_ip').''.$this->i18n('validFrom').''.$this->i18n('validTo').'
'.(isset($raw['org']) ? $raw['org'] : '').''.(isset($raw['isp']) ? $raw['isp'] : '').'
'.(isset($raw['zip']) ? $raw['zip'] : '').' '.(isset($raw['city']) ? $raw['city'] : '').'
'.(isset($raw['country']) ? $raw['country'] : '').'
'.(isset($item['ip']) ? $item['ip']: '').''.$validFrom.''.$validTo.'
'; - } - - } else { - $output = "Keine Hostingdaten vorhanden!"; - } - - return $output; - -} - - diff --git a/plugins/hosting/pages/project_manager.hosting.overview.php b/plugins/hosting/pages/project_manager.hosting.overview.php deleted file mode 100644 index 556ef20..0000000 --- a/plugins/hosting/pages/project_manager.hosting.overview.php +++ /dev/null @@ -1,173 +0,0 @@ -getValue(); -$csrf = rex_csrf_token::factory('project_manager'); - -############### -### -### LISTVIEW -### -############### -if ($showlist) { - - $sql = 'SELECT * FROM ( - SELECT * FROM '. rex::getTable('project_manager_domain') . ' as X ORDER BY name ASC - ) AS D - LEFT JOIN ( - SELECT status as status_hosting, createdate as createdate_hosting, domain as hostingdomain, ip, raw - FROM ' . rex::getTable('project_manager_domain_hosting') . ' - ) as H - ON D.domain = H.hostingdomain - GROUP by D.domain - ORDER BY name ASC'; - - $items = rex_sql::factory()->getArray($sql); - - // Cronjobcall - $sql2 = 'SELECT * FROM '. rex::getTable('cronjob').' - WHERE type = "rex_cronjob_project_manager_hosting"'; - $cronjob = rex_sql::factory()->getArray($sql2); - $cronjobId = $cronjob[0]['id']; - - $refresh = ''; - if ($cronjobId != NULL) { - $refresh = ' Hosting Daten aktualisieren'; - } - echo rex_view::info("Anzahl der Domains und Projekte: ".count($items) . $refresh); - - $list = rex_list::factory($sql, 1000); - $list->addTableAttribute('class', 'table-striped'); - $list->setNoRowsMessage($this->i18n('project_manager_hosting_domain_norows_message')); - - - $list->setColumnFormat('id', 'Id'); - $list->addParam('page', 'project_manager/server'); - - $list->setColumnParams('id', ['data_id' => '###id###', 'func' => 'edit']); - $list->setColumnSortable('id'); - - $list->removeColumn('id'); - $list->removeColumn('description'); - $list->removeColumn('api_key'); - $list->removeColumn('tags'); - $list->removeColumn('cms'); - $list->removeColumn('cms_version'); - $list->removeColumn('createdate'); - $list->removeColumn('createdate_hosting'); - $list->removeColumn('rex_version'); - $list->removeColumn('status'); - $list->removeColumn('http_code'); - $list->removeColumn('raw'); - $list->removeColumn('domain'); - $list->removeColumn('hostingdomain'); - $list->removeColumn('updatedate'); - $list->removeColumn('logdate'); - $list->removeColumn('maintenance'); - $list->removeColumn('param'); - - $list->setColumnLabel('name', $this->i18n('project_manager_hosting_name')); - $list->setColumnParams('name', ['page' => 'project_manager/server/projects', 'func' => 'updateinfos', 'domain' => '###domain###']); - - $list->setColumnLabel('createdate_psi', $this->i18n('project_manager_hosting_updatedate')); - $list->setColumnFormat('createdate_psi', 'custom', function ($params) { - return (rex_formatter::format($params['list']->getValue('createdate_psi'),'date','d.m.Y H:i:s')); - }); - - // icon column (Domain hinzufügen bzw. bearbeiten) - $thIcon = ''; - $tdIcon = ''; - $list->addColumn($thIcon, $tdIcon, 0, ['###VALUE###', '###VALUE###']); - $list->setColumnParams($thIcon, ['func' => 'domain_edit', 'id' => '###id###']); - $list->setColumnFormat($thIcon, 'custom', function ($params) { - $filename = ''; - if (file_exists(rex_plugin::get('project_manager', 'server')->getAssetsPath('favicon/'.$params['list']->getValue('domain').'.png'))) { - $filename = rex_plugin::get('project_manager', 'server')->getAssetsUrl('favicon/'.$params['list']->getValue('domain').'.png'); - return ''; - } else { - return ''; - } - }); - - $list->addColumn($this->i18n('project_manager_hosting_domain'), '###domain###', 3); - //$list->setColumnParams($this->i18n('project_manager_hosting_domain'), ['page' => 'project_manager/server/projects', 'func' => 'updateinfos', 'domain' => '###domain###']); - $list->setColumnFormat($this->i18n('project_manager_hosting_domain'), 'custom', function ($params) { - return ''.$params['list']->getValue('domain').''; - }); - - - $list->setColumnLabel('is_ssl', $this->i18n('is_ssl')); - $list->setColumnLayout('is_ssl', ['###VALUE###', '###VALUE###']); - $list->setColumnFormat('is_ssl', 'custom', function ($params) { - if ($params['list']->getValue('is_ssl') == "1") { - return ''; - } else if ($params['list']->getValue('is_ssl') == "0") { - return ''; - } else { - return "?"; - } - }); - - $list->addColumn($this->i18n('organisation'), false, -1, ['###VALUE###', '###VALUE### ']); - $list->setColumnLabel($this->i18n('organisation'), $this->i18n('organisation')); - $list->setColumnFormat($this->i18n('organisation'), 'custom', function ($params) { - - if($params['list']->getValue('raw')) { - $raw= json_decode($params['list']->getValue('raw'), true); - if (array_key_exists("org", $raw)) { - return $raw['org']; - } - } - }); - - $list->setColumnLabel('ip', $this->i18n('project_manager_hosting_ip')); - - $list->setColumnLabel('status_hosting', $this->i18n('status')); - $list->setColumnFormat('status_hosting', 'custom', function ($params) { - if ($params['list']->getValue('status_hosting') == "1") { - return ''; - } else if ($params['list']->getValue('status_hosting') == "0") { - return ''; - } else if ($params['list']->getValue('status_hosting') == "-1") { - return ''; - } else if ($params['list']->getValue('status_hosting') == "2") { - return ''; - } - }); - $list->setColumnLayout('status', ['###VALUE###', '###VALUE###']); - - $list->addColumn($this->i18n('validTo'), false, -1, ['###VALUE###', '###VALUE### ']); - $list->setColumnLabel($this->i18n('validTo'), $this->i18n('validTo')); - $list->setColumnFormat($this->i18n('validTo'), 'custom', function ($params) { - - if($params['list']->getValue('raw')) { - $raw= json_decode($params['list']->getValue('raw'), true); - if (array_key_exists("validTo", $raw)) { - - if (is_numeric($raw['validTo'])) { - - if ($raw['validTo'] < (time() + 2764800) ) { - return ''.rex_formatter::format($raw['validTo'],'date','d.m.Y H:i:s').''; - } else if ($raw['validTo'] < time()) { - return ''.rex_formatter::format($raw['validTo'],'date','d.m.Y H:i:s').''; - } else { - return rex_formatter::format($raw['validTo'],'date','d.m.Y H:i:s'); - } - } else { - return "-"; - } - - } - } - }); - - $content = $list->get(); - $content = str_replace('setVar('title', $this->i18n('projects')); - $fragment->setVar('content', $content, false); - echo $fragment->parse('core/page/section.php'); -} diff --git a/plugins/hosting/uninstall.php b/plugins/hosting/uninstall.php deleted file mode 100644 index 8c55575..0000000 --- a/plugins/hosting/uninstall.php +++ /dev/null @@ -1,5 +0,0 @@ -setQuery("DELETE FROM ". rex::getTablePrefix() ."cronjob WHERE type LIKE 'rex_cronjob_project_manager_hosting%'"); - -rex_sql_table::get(rex::getTable('project_manager_domain_hosting'))->drop(); diff --git a/plugins/pagespeed/boot.php b/plugins/pagespeed/boot.php deleted file mode 100644 index 1cf9d7d..0000000 --- a/plugins/pagespeed/boot.php +++ /dev/null @@ -1,40 +0,0 @@ -isAvailable()) { - rex_cronjob_manager::registerType('rex_cronjob_project_manager_pagespeed'); -} - -// PROJECT_MANAGER_SERVER_DETAIL_HOOK -if (rex::isBackend() && rex::getUser()) { - - rex_extension::register('PROJECT_MANAGER_SERVER_DETAIL_HOOK', function (rex_extension_point $ep) { - - $exist = ''; - if ($ep->getSubject() != "") { - $exist = $ep->getSubject(); - } - - $params = $ep->getParams(); - $panel = include(rex_path::plugin('project_manager', 'pagespeed', 'pages/content.pagespeed.php')); - - $fragment = new rex_fragment(); - $fragment->setVar('title', "PageSpeed", false); - $fragment->setVar('body', $panel, false); - $fragment->setVar('class', 'panel panel-info', false); - $fragment->setVar('domain', $params["domain"], false); - - $fragment->setVar('collapse', true); - $fragment->setVar('collapsed', true); - $pagespeed = '
'.$fragment->parse('core/page/section.php').'
'; - - return $exist.$pagespeed; - - }); - -} - - -if (rex::isBackend() && is_object(rex::getUser())) { - rex_perm::register('project_manager_pagespeed[]'); -} - diff --git a/plugins/pagespeed/install.php b/plugins/pagespeed/install.php deleted file mode 100644 index bdf212c..0000000 --- a/plugins/pagespeed/install.php +++ /dev/null @@ -1,48 +0,0 @@ -ensurePrimaryIdColumn() - ->ensureColumn(new rex_sql_column('domain', 'varchar(255)', false, null, ''))->setPrimaryKey('domain') - ->ensureColumn(new rex_sql_column('raw', 'longtext', true)) - ->ensureColumn(new rex_sql_column('createdate', 'timestamp', false, '0000-00-00 00:00:00', 'on update CURRENT_TIMESTAMP')) - ->ensureColumn(new rex_sql_column('score_desktop', 'text')) - ->ensureColumn(new rex_sql_column('score_mobile', 'text')) - ->ensureColumn(new rex_sql_column('status', 'text')) - ->ensure(); - - -// Create cronjob -$now = new DateTime(); -$startdate = date('Y-m-d 00:00:00',strtotime( "tomorrow" )); - -$cronjob = rex_sql::factory(); -$cronjob->setDebug(true); -$cronjob->setQuery('SELECT id FROM '.rex::getTable('cronjob'). ' WHERE type LIKE "rex_cronjob_project_manager_pagespeed"'); - -if ($cronjob->getRows() == 0) { - - $cronjob = rex_sql::factory(); - $cronjob->setDebug(true); - $cronjob->setTable(rex::getTable('cronjob')); - $cronjob->setValue('name','Projekt Manager: PageSpeed Daten'); - $cronjob->setValue('description',''); - $cronjob->setValue('type','rex_cronjob_project_manager_pagespeed'); - $cronjob->setValue('interval','{"minutes":[0],"hours":[0],"days":"all","weekdays":"all","months":"all"}'); - $cronjob->setValue('environment','|backend|'); - $cronjob->setValue('execution_start','1970-01-01 01:00:00'); - $cronjob->setValue('status','1'); - $cronjob->setValue('parameters','[]'); - $cronjob->setValue('nexttime',$startdate); - $cronjob->setValue('createdate',$now->format('Y-m-d H:i:s')); - $cronjob->setValue('updatedate',$now->format('Y-m-d H:i:s')); - $cronjob->setValue('createuser',rex::getUser()->getLogin()); - $cronjob->setValue('updateuser',rex::getUser()->getLogin()); - - try { - $cronjob->insertOrUpdate(); - echo rex_view::success('Der Cronjob "Projekt Manager: PageSpeed Daten" wurde angelegt. '); - } catch (rex_sql_exception $e) { - echo rex_view::warning('Der Cronjob "Projekt Manager: PageSpeed Daten" wurde nicht angelegt.
Wahrscheinlich existiert er schon.'); - } -} \ No newline at end of file diff --git a/plugins/pagespeed/lang/de_de.lang b/plugins/pagespeed/lang/de_de.lang deleted file mode 100644 index e899eea..0000000 --- a/plugins/pagespeed/lang/de_de.lang +++ /dev/null @@ -1,19 +0,0 @@ -project_manager_pagespeed_menu_entry = PageSpeed - -project_manager_pagespeed_projects = Projekte -project_manager_pagespeed_title = Übersicht -project_manager_pagespeed_config = Einstellungen -project_manager_pagespeed_api_key_title = Einstellungen -project_manager_pagespeed_api_key_label = PageSpeed API-Schlüssel -project_manager_pagespeed_api_key_notice = PageSpeed API-Schlüssel, z.B. AIzaSyCp0Em_UPY78238es-9CZViEbq7CB_zcFBs -project_manager_pagespeed_domain_norows_message = Kein Projekt vorhanden -project_manager_cronjob_pagespeed_name = Projekt Manager: Hole Pagespeed Daten - - -project_manager_pagespeed_name = Projektname -project_manager_pagespeed_domain = Domain -project_manager_pagespeed_updatedate = Letzte Änderung -project_manager_pagespeed_logdate = Letzter Datenfetch -project_manager_pagespeed_domain_norows_message = Keine Einträge vorhanden - -perm_general_project_manager_pagespeed[] = project_manager_pagespeed[] - Rechte für Projekt Manager PageSpeed \ No newline at end of file diff --git a/plugins/pagespeed/lang/en_gb.lang b/plugins/pagespeed/lang/en_gb.lang deleted file mode 100644 index 36bef67..0000000 --- a/plugins/pagespeed/lang/en_gb.lang +++ /dev/null @@ -1,19 +0,0 @@ -project_manager_pagespeed_menu_entry = PageSpeed - -project_manager_pagespeed_projects = Projects -project_manager_pagespeed_title = Overview -project_manager_pagespeed_config = Settings -project_manager_pagespeed_api_key_title = Settings -project_manager_pagespeed_api_key_label = PageSpeed API key -project_manager_pagespeed_api_key_notice = PageSpeed API key, ex. AIzaSyCp0Em_UPY78238es-9CZViEbq7CB_zcFBs -project_manager_pagespeed_domain_norows_message = No entries found -project_manager_cronjob_pagespeed_name = Project manager: get PageSpeed data - - -project_manager_pagespeed_name = Project name -project_manager_pagespeed_domain = Domain -project_manager_pagespeed_updatedate = Last update -project_manager_pagespeed_logdate = Last data fetch -project_manager_pagespeed_domain_norows_message = No entries found - -perm_general_project_manager_pagespeed[] = project_manager_pagespeed[] - Permissions for Project Manager Pagespeed \ No newline at end of file diff --git a/plugins/pagespeed/lang/es_es.lang b/plugins/pagespeed/lang/es_es.lang deleted file mode 100644 index 9147065..0000000 --- a/plugins/pagespeed/lang/es_es.lang +++ /dev/null @@ -1,9 +0,0 @@ -documentation_menu_entry = Documentación - -documentation_navigation_title = Navegación [main_navi.md] -documentation_content_title = Contenido [ {0} ] - -documentation_noparser = ¡No hay ningún Markdown parser disponible! Instale primero un analizador (addon markitup o textil) - -documentation_navinotfound = ¡No se encontró el archivo de navegación {0}!
¡Este archivo es obligatorio! -documentation_filenotfound = No se encontró el archivo {0}. El contenido no existe (aún).

Estamos entusiasmados con la ayuda: {1} diff --git a/plugins/pagespeed/lang/pt_br.lang b/plugins/pagespeed/lang/pt_br.lang deleted file mode 100644 index fed2d11..0000000 --- a/plugins/pagespeed/lang/pt_br.lang +++ /dev/null @@ -1,9 +0,0 @@ -documentation_menu_entry = Documentação - -documentation_navigation_title = Navegação [ main_navi.md ] -documentation_content_title = Conteúdo [ {0} ] - -documentation_noparser = Nenhum analisador Markdown disponível! Instale primeiro um analisador (AddOn markitup or textile) - -documentation_navinotfound = Arquivo de navegação {0} não localizado!
Este arquivo é necessário! -documentation_filenotfound = Arquivo {0} não localizado. Conteúdos não existem (ainda)

Ficaríamos felizes se você quisesse ajudar: {1} diff --git a/plugins/pagespeed/lang/sv_se.lang b/plugins/pagespeed/lang/sv_se.lang deleted file mode 100644 index af42eb4..0000000 --- a/plugins/pagespeed/lang/sv_se.lang +++ /dev/null @@ -1,19 +0,0 @@ -project_manager_pagespeed_menu_entry = PageSpeed - -project_manager_pagespeed_projects = Projekter -project_manager_pagespeed_title = Översikt -project_manager_pagespeed_config = Inställningar -project_manager_pagespeed_api_key_title = Inställningar -project_manager_pagespeed_api_key_label = PageSpeed API-key -project_manager_pagespeed_api_key_notice = PageSpeed API-nyckel, t.ex. AIzaSyCp0Em_UPY78238es-9CZViEbq7CB_zcFBs -project_manager_pagespeed_domain_norows_message = Inga poster tillgängliga -project_manager_cronjob_pagespeed_name = Projektledare: Hämta PageSpeed-uppgifter - - -project_manager_pagespeed_name = Projektnamn -project_manager_pagespeed_domain = Domän -project_manager_pagespeed_updatedate = Senaste ändring -project_manager_pagespeed_logdate = Senaste datafetch -project_manager_pagespeed_domain_norows_message = Inga poster tillgängliga - -perm_general_project_manager_pagespeed[] = project_manager_pagespeed [] - Rättigheter till Projekt Manager PageSpeed \ No newline at end of file diff --git a/plugins/pagespeed/lib/project-manager-pagespeed.cronjob.php b/plugins/pagespeed/lib/project-manager-pagespeed.cronjob.php deleted file mode 100644 index b200adb..0000000 --- a/plugins/pagespeed/lib/project-manager-pagespeed.cronjob.php +++ /dev/null @@ -1,135 +0,0 @@ -setDebug(0)->getArray('SELECT count(*) as count FROM rex_project_manager_domain'); - if ($count[0]['count'] <= 10) { - $count = 1; - } else { - $count = $count[0]['count'] / 10; - $count = round($count, 0, PHP_ROUND_HALF_UP); - } - - for ($i = 0; $i < $count; $i++) { - $this->getData(); - } - - return true; - - } - - public function getData() { - - $websites = rex_sql::factory()->setDebug(0)->getArray('SELECT D.domain AS domain, D.is_ssl as is_ssl FROM - (SELECT domain, createdate FROM rex_project_manager_domain_psi) AS PSI - RIGHT JOIN - (SELECT domain, updatedate, is_ssl FROM rex_project_manager_domain) AS D - ON - PSI.domain = D.domain - GROUP BY D.domain - ORDER BY PSI.createdate ASC LIMIT 10'); - - $error = false; - $multi_curl = curl_multi_init(); - $resps = array(); - $options = array( - CURLOPT_FOLLOWLOCATION => true, - CURLOPT_AUTOREFERER => true, - CURLOPT_MAXREDIRS => 4, - CURLOPT_HEADER => false, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_SSL_VERIFYPEER => false, - CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0', - CURLOPT_TIMEOUT => 30 // seconds - ); - - foreach($websites as $website) { - - $fstreams = array(); - - $domain = $website['domain']; - if($website['is_ssl']) { - $prefix = "https://"; - } else { - $prefix = "http://"; - } - - $url_desktop = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed?filter_third_party_resources=false&locale=de_DE&screenshot=true&snapshots=false&strategy=desktop&key='.rex_config::get('project_manager/pagespeed', 'project_manager_pagespeed_api_key').'&url='.urlencode($prefix.$website['domain']); - $url_mobile = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed?filter_third_party_resources=false&locale=de_DE&screenshot=true&snapshots=false&strategy=mobile&key='.rex_config::get('project_manager/pagespeed', 'project_manager_pagespeed_api_key').'&url='.urlencode($prefix.$website['domain']); - $resps[$domain.";mobile"] = curl_init($url_mobile); - $resps[$domain.";desktop"] = curl_init($url_desktop); - curl_setopt_array($resps[$domain.";mobile"], $options); - curl_setopt_array($resps[$domain.";desktop"], $options); - curl_multi_add_handle($multi_curl, $resps[$domain.";mobile"]); - curl_multi_add_handle($multi_curl, $resps[$domain.";desktop"]); - - } - - $active = null; - do { - curl_multi_exec($multi_curl, $active); - } while ($active > 0); - - - foreach ($resps as $key => $response) { - $domain = explode(";", $key)[0]; - $mode = explode(";", $key)[1]; - $resp = curl_multi_getcontent($response); - curl_multi_remove_handle($multi_curl, $response); - $pagespeed = json_decode($resp, true); - - $score_mobile = 0; - $score_desktop = 0; - if (isset($pagespeed['lighthouseResult'])) { - if ($pagespeed['lighthouseResult']['categories']['performance']['score'] != NULL) $score_mobile = $pagespeed['lighthouseResult']['categories']['performance']['score']; - if ($pagespeed['lighthouseResult']['categories']['performance']['score'] != NULL) $score_desktop = $pagespeed['lighthouseResult']['categories']['performance']['score']; - } - if(json_last_error() === JSON_ERROR_NONE && (!array_key_exists("error", $pagespeed))) { - if($mode == "mobile") { - rex_sql::factory()->setDebug(0)->setQuery('INSERT INTO ' . rex::getTable('project_manager_domain_psi') . ' (`domain`, `raw`, `createdate`, `score_mobile`, `status`) VALUES(:domain, :resp, NOW(), :score_mobile, 1) - ON DUPLICATE KEY UPDATE domain = :domain, `raw` = :resp, createdate = NOW(), `score_mobile` = :score_mobile, `status` = 1', [":domain" => $domain, ":resp" => $resp, ":score_mobile" => $score_mobile] ); - } else if($mode == "desktop") { - rex_sql::factory()->setDebug(0)->setQuery('INSERT INTO ' . rex::getTable('project_manager_domain_psi') . ' (`domain`, `raw`, `createdate`, `score_desktop`, `status`) VALUES(:domain, :resp, NOW(), :score_desktop, 1) - ON DUPLICATE KEY UPDATE domain = :domain, `raw` = :resp, createdate = NOW(), `score_desktop` = :score_desktop, `status` = 1', [":domain" => $domain, ":resp" => $resp, ":score_desktop" => $score_desktop] ); - } - } else { - - // ERROR HANDLE - if($mode == "desktop") { - - rex_sql::factory()->setDebug(0)->setQuery('INSERT INTO ' . rex::getTable('project_manager_domain_psi') . ' (`domain`, `raw`, `createdate`, `status`) VALUES(:domain, :resp, NOW(), -1) - ON DUPLICATE KEY UPDATE domain = :domain, `raw` = :resp, createdate = NOW(), `status` = -1', [":domain" => $domain, ":resp" => $resp] ); - - } else if($mode == "mobile") { - rex_sql::factory()->setDebug(0)->setQuery('INSERT INTO ' . rex::getTable('project_manager_domain_psi') . ' (`domain`, `raw`, `createdate`, `status`) VALUES(:domain, :resp, NOW(), -1) - ON DUPLICATE KEY UPDATE domain = :domain, `raw` = :resp, createdate = NOW(), `status` = -1', [":domain" => $domain, ":resp" => $resp] ); - - } - - $this->setMessage($pagespeed['error']['errors'][0]['message'].': '.$pagespeed['error']['errors'][0]['reason']); - $error = true; - - } - } - curl_multi_close($multi_curl); - - if ($error === true) { - return false; - } else { - return true; - } - } - public function getTypeName() - { - return rex_i18n::msg('project_manager_cronjob_pagespeed_name'); - } - - public function getParamFields() - { - return []; - } -} -?> \ No newline at end of file diff --git a/plugins/pagespeed/package.yml b/plugins/pagespeed/package.yml deleted file mode 100644 index 7d7222d..0000000 --- a/plugins/pagespeed/package.yml +++ /dev/null @@ -1,21 +0,0 @@ -package: project_manager/pagespeed -version: '1.2.4' -author: 'Friends Of REDAXO' -supportpage: https://github.com/FriendsOfREDAXO/project_manager - -page: - title: 'translate:pagespeed_menu_entry' - icon: rex-icon fa-tachometer # Icon von Font Awesome - perm: project_manager_pagespeed[] - -pages: - project_manager/pagespeed/overview: - title: 'translate:project_manager_pagespeed_title' - project_manager/pagespeed/config: - title: 'translate:project_manager_pagespeed_config' - -requires: - packages: - project_manager: '^1.0.0' - cronjob: '>=2.3.0' - project_manager/server: '>=1.3.8' \ No newline at end of file diff --git a/plugins/pagespeed/pages/content.pagespeed.php b/plugins/pagespeed/pages/content.pagespeed.php deleted file mode 100644 index de82f27..0000000 --- a/plugins/pagespeed/pages/content.pagespeed.php +++ /dev/null @@ -1,75 +0,0 @@ -setDebug(0)->getArray($query, [$domain])[0]; - - $raw = json_decode($item['raw'], true); - - if(is_array($raw)) { - - // PSI - $query = ' - SELECT * FROM (SELECT * FROM ' . rex::getTable('project_manager_domain') . ' ORDER BY domain) AS D - LEFT JOIN ( - SELECT domain, raw, score_desktop AS psi_score_desktop - FROM ' . rex::getTable('project_manager_domain_psi') . ' - WHERE score_desktop NOT LIKE "") as PSI - ON D.domain = PSI.domain - LEFT JOIN ( - SELECT domain, score_mobile AS psi_score_mobile - FROM ' . rex::getTable('project_manager_domain_psi') . ' - WHERE score_mobile NOT LIKE "") as PSI2 - ON D.domain = PSI2.domain - WHERE D.domain = ? - GROUP BY D.domain - ORDER BY D.domain - '; - - $item = rex_sql::factory()->setDebug(0)->getArray($query, [$domain])[0]; - - // Screenshot - $raw= json_decode($item['raw'], true); - $image = ''; - $data = ''; - if (isset($raw['lighthouseResult'])) { - $data = $raw['lighthouseResult']['audits']['final-screenshot']['details']['data']; - $image = $data; - } - - if($item['psi_score_desktop'] < 0.7) { - $class = ' '; - } else if($item['psi_score_desktop'] < 0.9) { - $class = ' '; - } else { - $class = ' '; - } - - if($item['psi_score_mobile'] < 0.7) { - $classmobile = ' '; - } else if($item['psi_score_mobile'] < 0.9) { - $classmobile = ' '; - } else { - $classmobile = ' '; - } - - $output = ''; - $output = '
'; - $output .= ''; - $output .= '
NameResultScreenshot
Page Speed'.$class.$item['psi_score_desktop'].' | '.$classmobile.$item['psi_score_mobile'].'
'; - - return $output; - - } -} - - diff --git a/plugins/pagespeed/pages/project_manager.pagespeed.config.php b/plugins/pagespeed/pages/project_manager.pagespeed.config.php deleted file mode 100644 index 76abd00..0000000 --- a/plugins/pagespeed/pages/project_manager.pagespeed.config.php +++ /dev/null @@ -1,46 +0,0 @@ -setConfig(rex_post('config', [ - ['project_manager_pagespeed_api_key', 'string'] - ])); - - $message = $this->i18n('project_manager_pagespeed_api_key_saved_successful'); -} - -$content = ''; - - -$formElements = []; -$n = []; -$n['label'] = ''; -$n['field'] = ''; -$n['note'] = $this->i18n('project_manager_pagespeed_api_key_notice'); -$formElements[] = $n; - -$fragment = new rex_fragment(); -$fragment->setVar('elements', $formElements, false); -$fragment->setVar('class', "panel panel-warning", false); -$content .= $fragment->parse('core/form/form.php'); - -$formElements = []; -$n = []; -$n['field'] = ''; -$formElements[] = $n; - -$fragment = new rex_fragment(); -$fragment->setVar('flush', true); -$fragment->setVar('elements', $formElements, false); -$buttons = $fragment->parse('core/form/submit.php'); - -$fragment = new rex_fragment(); -$fragment->setVar('class', 'edit', false); -$fragment->setVar('title', $this->i18n('project_manager_pagespeed_api_key_title'), false); -$fragment->setVar('body', $content, false); -$fragment->setVar('buttons', $buttons, false); -$content = $fragment->parse('core/page/section.php'); -echo ' -
- ' . $content . ' -
'; \ No newline at end of file diff --git a/plugins/pagespeed/pages/project_manager.pagespeed.overview.php b/plugins/pagespeed/pages/project_manager.pagespeed.overview.php deleted file mode 100644 index 4f54b3e..0000000 --- a/plugins/pagespeed/pages/project_manager.pagespeed.overview.php +++ /dev/null @@ -1,154 +0,0 @@ -getValue(); -$csrf = rex_csrf_token::factory('project_manager'); - -############### -### -### LISTVIEW -### -############### -if ($showlist) { - - $sql = 'SELECT * FROM ( - SELECT * FROM '. rex::getTable('project_manager_domain') . ' as X ORDER BY name ASC - ) AS D - LEFT JOIN ( - SELECT status as status_psi, createdate as createdate_psi, domain as psidomain, score_desktop AS psi_score_desktop, score_mobile AS psi_score_mobile - FROM ' . rex::getTable('project_manager_domain_psi') . ' - ) as PSI - ON D.domain = PSI.psidomain - GROUP by D.domain - ORDER BY name ASC - '; - - $items = rex_sql::factory()->getArray($sql); - - $sql2 = 'SELECT * FROM '. rex::getTable('cronjob').' - WHERE type = "rex_cronjob_project_manager_pagespeed"'; - $cronjob = rex_sql::factory()->getArray($sql2); - $cronjobId = $cronjob[0]['id']; - - $refresh = ''; - if ($cronjobId != NULL) { - $refresh = ' PageSpeed Daten aktualisieren'; - } - echo rex_view::info("Anzahl der Domains und Projekte: ".count($items) . $refresh); - - $list = rex_list::factory($sql, 1000); - $list->addTableAttribute('class', 'table-striped'); - $list->setNoRowsMessage($this->i18n('project_manager_pagespeed_domain_norows_message')); - - $list->setColumnFormat('id', 'Id'); - $list->addParam('page', 'project_manager/server'); - - $list->setColumnParams('id', ['data_id' => '###id###', 'func' => 'edit']); - $list->setColumnSortable('id'); - - $list->removeColumn('id'); - $list->removeColumn('is_ssl'); - $list->removeColumn('description'); - $list->removeColumn('api_key'); - $list->removeColumn('tags'); - $list->removeColumn('cms'); - $list->removeColumn('cms_version'); - $list->removeColumn('createdate'); - $list->removeColumn('rex_version'); - $list->removeColumn('status'); - $list->removeColumn('http_code'); - $list->removeColumn('is_ssl'); - $list->removeColumn('domain'); - $list->removeColumn('psidomain'); - $list->removeColumn('updatedate'); - $list->removeColumn('createdate'); - $list->removeColumn('psi_domain'); - $list->removeColumn('psi_score_desktop'); - $list->removeColumn('psi_score_mobile'); - $list->removeColumn('maintenance'); - $list->removeColumn('param'); - - $list->setColumnLabel('name', $this->i18n('project_manager_pagespeed_name')); - $list->setColumnParams('name', ['page' => 'project_manager/server/projects', 'func' => 'updateinfos', 'domain' => '###domain###']); - - $list->setColumnLabel('createdate_psi', $this->i18n('project_manager_pagespeed_updatedate')); - $list->setColumnFormat('createdate_psi', 'custom', function ($params) { - return (rex_formatter::format($params['list']->getValue('createdate_psi'),'date','d.m.Y H:i:s')); - }); - - // icon column (Domain hinzufügen bzw. bearbeiten) - $thIcon = ''; - $tdIcon = ''; - $list->addColumn($thIcon, $tdIcon, 0, ['###VALUE###', '###VALUE###']); - $list->setColumnParams($thIcon, ['func' => 'domain_edit', 'id' => '###id###']); - $list->setColumnFormat($thIcon, 'custom', function ($params) { - $filename = ''; - if (file_exists(rex_plugin::get('project_manager', 'server')->getAssetsPath('favicon/'.$params['list']->getValue('domain').'.png'))) { - $filename = rex_plugin::get('project_manager', 'server')->getAssetsUrl('favicon/'.$params['list']->getValue('domain').'.png'); - return ''; - } else { - return ''; - } - }); - - $list->addColumn($this->i18n('project_manager_pagespeed_domain'), '###domain###', 3); - //$list->setColumnParams($this->i18n('project_manager_pagespeed_domain'), ['page' => 'project_manager/server/projects', 'func' => 'updateinfos', 'domain' => '###domain###']); - $list->setColumnFormat($this->i18n('project_manager_pagespeed_domain'), 'custom', function ($params) { - return ''.$params['list']->getValue('domain').''; - }); - - - $list->setColumnLabel('status_psi', $this->i18n('status')); - $list->setColumnFormat('status_psi', 'custom', function ($params) { - if ($params['list']->getValue('status_psi') == "1") { - return ''; - } else if ($params['list']->getValue('status_psi') == "0") { - return ''; - } else if ($params['list']->getValue('status_psi') == "-1") { - return ''; - } else if ($params['list']->getValue('status_psi') == "2") { - return ''; - } else { - if ($params['list']->getValue('is_ssl') == 1) - return ''; - - if ($params['list']->getValue('is_ssl') == 0) - return ''; - } - }); - - $list->setColumnLayout('status', ['###VALUE###', '###VALUE###']); - - - $list->addColumn("Pagespeed", false, -1, ['PageSpeed', '###VALUE###']); - $list->setColumnFormat("Pagespeed", 'custom', function ($params) { - - if($params['list']->getValue('psi_score_desktop') < 0.7) { - $return = ' '.$params['list']->getValue('psi_score_desktop'); - } else if($params['list']->getValue('psi_score_desktop') < 0.9) { - $return = ' '.$params['list']->getValue('psi_score_desktop'); - } else { - $return = ' '.$params['list']->getValue('psi_score_desktop'); - } - $return .= " | "; - if($params['list']->getValue('psi_score_mobile') < 0.7) { - $return .= ' '.$params['list']->getValue('psi_score_mobile'); - } else if($params['list']->getValue('psi_score_mobile') < 0.9) { - $return .= ' '.$params['list']->getValue('psi_score_mobile'); - } else { - $return .= ' '.$params['list']->getValue('psi_score_mobile'); - } - return $return; - }); - - - $content = $list->get(); - $content = str_replace('setVar('title', $this->i18n('projects')); - $fragment->setVar('content', $content, false); - echo $fragment->parse('core/page/section.php'); -} diff --git a/plugins/pagespeed/uninstall.php b/plugins/pagespeed/uninstall.php deleted file mode 100644 index 186d651..0000000 --- a/plugins/pagespeed/uninstall.php +++ /dev/null @@ -1,5 +0,0 @@ -setQuery("DELETE FROM ". rex::getTablePrefix() ."cronjob WHERE type LIKE 'rex_cronjob_project_manager_pagespeed%'"); - -rex_sql_table::get(rex::getTable('project_manager_domain_psi'))->drop(); diff --git a/plugins/server/assets/css/bootstrap-tagsinput.css b/plugins/server/assets/css/bootstrap-tagsinput.css deleted file mode 100644 index 86de112..0000000 --- a/plugins/server/assets/css/bootstrap-tagsinput.css +++ /dev/null @@ -1,66 +0,0 @@ -.bootstrap-tagsinput { - max-width: 100%; - cursor: text; - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.428571429; - color: #324050; - background-color: #f3f6fb; - background-image: none; - border: 1px solid #c1c9d4; - border-radius: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; - -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; - transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; -} -.bootstrap-tagsinput input { - border: none; - box-shadow: none; - outline: none; - background-color: transparent; - padding: 0 6px; - margin: 0; - width: auto; - max-width: inherit; - min-width: 300px; -} -.bootstrap-tagsinput.form-control input::-moz-placeholder { - color: #777; - opacity: 1; -} -.bootstrap-tagsinput.form-control input:-ms-input-placeholder { - color: #777; -} -.bootstrap-tagsinput.form-control input::-webkit-input-placeholder { - color: #777; -} -.bootstrap-tagsinput input:focus { - border: none; - box-shadow: none; -} -.bootstrap-tagsinput .tag { - margin-right: 2px; - color: white; - background-color: #192A42; - font-size: 100%; - font-weight: normal; -} -.bootstrap-tagsinput .tag [data-role="remove"] { - margin-left: 8px; - cursor: pointer; -} -.bootstrap-tagsinput .tag [data-role="remove"]:after { - content: "x"; - padding: 0px 2px; -} -.bootstrap-tagsinput .tag [data-role="remove"]:hover { - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} -.bootstrap-tagsinput .tag [data-role="remove"]:hover:active { - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} diff --git a/plugins/server/assets/css/theme.css b/plugins/server/assets/css/theme.css deleted file mode 100644 index 67f519d..0000000 --- a/plugins/server/assets/css/theme.css +++ /dev/null @@ -1,67 +0,0 @@ -td.alert-danger.project-manager, -.tablesorter-default td.alert-danger { - background-color: #d9534f !important; - border-color: #d9534f !important; - color: #fff !important; -} -td.alert-warning.project-manager, -.tablesorter-default td.alert-warning { - background-color: #ffaeac !important; - border-color: ffaeac !important; - color: #fff !important; -} - -button.loading .fa-refresh, -a.loading .fa-refresh { - -webkit-animation: rotating 2s linear infinite; - -moz-animation: rotating 2s linear infinite; - -ms-animation: rotating 2s linear infinite; - -o-animation: rotating 2s linear infinite; - animation: rotating 2s linear infinite; -} - - -@-webkit-keyframes rotating /* Safari and Chrome */ { - from { - -webkit-transform: rotate(0deg); - -o-transform: rotate(0deg); - transform: rotate(0deg); - } - to { - -webkit-transform: rotate(360deg); - -o-transform: rotate(360deg); - transform: rotate(360deg); - } -} -@keyframes rotating { - from { - -ms-transform: rotate(0deg); - -moz-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - -o-transform: rotate(0deg); - transform: rotate(0deg); - } - to { - -ms-transform: rotate(360deg); - -moz-transform: rotate(360deg); - -webkit-transform: rotate(360deg); - -o-transform: rotate(360deg); - transform: rotate(360deg); - } -} -.rotating { - -webkit-animation: rotating 2s linear infinite; - -moz-animation: rotating 2s linear infinite; - -ms-animation: rotating 2s linear infinite; - -o-animation: rotating 2s linear infinite; - animation: rotating 2s linear infinite; -} - -.btn-toolbar .btn.btn-project-manager-update { - margin-bottom: 20px; -} - -.project-manager-server--redaxo-favicon { - height: 15px; - margin-top: -3px; -} \ No newline at end of file diff --git a/plugins/server/assets/css/theme.default.min.css b/plugins/server/assets/css/theme.default.min.css deleted file mode 100644 index 923f45e..0000000 --- a/plugins/server/assets/css/theme.default.min.css +++ /dev/null @@ -1 +0,0 @@ -.tablesorter-default{width:100%;background-color:#fff;border-spacing:0;margin:10px 0 15px;text-align:left}.tablesorter-default th,.tablesorter-default thead td{background-color:#fff;border-collapse:collapse;border-bottom:#ccc 2px solid;padding:0}.tablesorter-default tfoot td,.tablesorter-default tfoot th{border:0}.tablesorter-default .header,.tablesorter-default .tablesorter-header{background-image:url(data:image/gif;base64,R0lGODlhFQAJAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==);background-position:center right;background-repeat:no-repeat;cursor:pointer;white-space:normal;padding:4px 20px 4px 4px}.tablesorter-default thead .headerSortUp,.tablesorter-default thead .tablesorter-headerAsc,.tablesorter-default thead .tablesorter-headerSortUp{background-image:url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);border-bottom:#000 2px solid}.tablesorter-default thead .headerSortDown,.tablesorter-default thead .tablesorter-headerDesc,.tablesorter-default thead .tablesorter-headerSortDown{background-image:url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);border-bottom:#000 2px solid}.tablesorter-default thead .sorter-false{background-image:none;cursor:default;padding:4px}.tablesorter-default tfoot .tablesorter-headerAsc,.tablesorter-default tfoot .tablesorter-headerDesc,.tablesorter-default tfoot .tablesorter-headerSortDown,.tablesorter-default tfoot .tablesorter-headerSortUp{border-top:#000 2px solid}.tablesorter-default td{background-color:#fff;border-bottom:#ccc 1px solid;padding:4px;vertical-align:top}.tablesorter-default tbody>tr.even:hover>td,.tablesorter-default tbody>tr.hover>td,.tablesorter-default tbody>tr.odd:hover>td,.tablesorter-default tbody>tr:hover>td{background-color:#fff;color:#000}.tablesorter-default .tablesorter-processing{background-position:center center!important;background-repeat:no-repeat!important;background-image:url(data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=)!important}.tablesorter-default tr.odd>td{background-color:#dfdfdf}.tablesorter-default tr.even>td{background-color:#efefef}.tablesorter-default tr.odd td.primary{background-color:#bfbfbf}.tablesorter-default td.primary,.tablesorter-default tr.even td.primary{background-color:#d9d9d9}.tablesorter-default tr.odd td.secondary{background-color:#d9d9d9}.tablesorter-default td.secondary,.tablesorter-default tr.even td.secondary{background-color:#e6e6e6}.tablesorter-default tr.odd td.tertiary{background-color:#e6e6e6}.tablesorter-default td.tertiary,.tablesorter-default tr.even td.tertiary{background-color:#f2f2f2}.tablesorter-default>caption{background-color:#fff}.tablesorter-default .tablesorter-filter-row{background-color:#eee}.tablesorter-default .tablesorter-filter-row td{background-color:#eee;border-bottom:#ccc 1px solid;line-height:normal;text-align:center;-webkit-transition:line-height .1s ease;-moz-transition:line-height .1s ease;-o-transition:line-height .1s ease;transition:line-height .1s ease}.tablesorter-default .tablesorter-filter-row .disabled{opacity:.5;cursor:not-allowed}.tablesorter-default .tablesorter-filter-row.hideme td{padding:2px;margin:0;line-height:0;cursor:pointer}.tablesorter-default .tablesorter-filter-row.hideme *{height:1px;min-height:0;border:0;padding:0;margin:0;/* don't use visibility: hidden because it disables tabbing */opacity:0}.tablesorter-default input.tablesorter-filter,.tablesorter-default select.tablesorter-filter{width:95%;height:auto;margin:4px auto;padding:4px;background-color:#fff;border:1px solid #bbb;color:#333;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:height .1s ease;-moz-transition:height .1s ease;-o-transition:height .1s ease;transition:height .1s ease}.tablesorter .filtered{display:none}.tablesorter .tablesorter-errorRow td{text-align:center;cursor:pointer;background-color:#e6bf99} \ No newline at end of file diff --git a/plugins/server/assets/favicon/favicon b/plugins/server/assets/favicon/favicon deleted file mode 100644 index e69de29..0000000 diff --git a/plugins/server/assets/js/bootstrap-tagsinput.js b/plugins/server/assets/js/bootstrap-tagsinput.js deleted file mode 100644 index 570d062..0000000 --- a/plugins/server/assets/js/bootstrap-tagsinput.js +++ /dev/null @@ -1,683 +0,0 @@ -(function ($) { - "use strict"; - - var defaultOptions = { - tagClass: function(item) { - return 'label label-info'; - }, - focusClass: 'focus', - itemValue: function(item) { - return item ? item.toString() : item; - }, - itemText: function(item) { - return this.itemValue(item); - }, - itemTitle: function(item) { - return null; - }, - freeInput: true, - addOnBlur: true, - maxTags: undefined, - maxChars: undefined, - confirmKeys: [13, 44], - delimiter: ',', - delimiterRegex: null, - cancelConfirmKeysOnEmpty: false, - onTagExists: function(item, $tag) { - $tag.hide().fadeIn(); - }, - trimValue: false, - allowDuplicates: false, - triggerChange: true - }; - - /** - * Constructor function - */ - function TagsInput(element, options) { - this.isInit = true; - this.itemsArray = []; - - this.$element = $(element); - this.$element.hide(); - - this.isSelect = (element.tagName === 'SELECT'); - this.multiple = (this.isSelect && element.hasAttribute('multiple')); - this.objectItems = options && options.itemValue; - this.placeholderText = element.hasAttribute('placeholder') ? this.$element.attr('placeholder') : ''; - this.inputSize = Math.max(1, this.placeholderText.length); - - this.$container = $('
'); - this.$input = $('').appendTo(this.$container); - - this.$element.before(this.$container); - - this.build(options); - this.isInit = false; - } - - TagsInput.prototype = { - constructor: TagsInput, - - /** - * Adds the given item as a new tag. Pass true to dontPushVal to prevent - * updating the elements val() - */ - add: function(item, dontPushVal, options) { - var self = this; - - if (self.options.maxTags && self.itemsArray.length >= self.options.maxTags) - return; - - // Ignore falsey values, except false - if (item !== false && !item) - return; - - // Trim value - if (typeof item === "string" && self.options.trimValue) { - item = $.trim(item); - } - - // Throw an error when trying to add an object while the itemValue option was not set - if (typeof item === "object" && !self.objectItems) - throw("Can't add objects when itemValue option is not set"); - - // Ignore strings only containg whitespace - if (item.toString().match(/^\s*$/)) - return; - - // If SELECT but not multiple, remove current tag - if (self.isSelect && !self.multiple && self.itemsArray.length > 0) - self.remove(self.itemsArray[0]); - - if (typeof item === "string" && this.$element[0].tagName === 'INPUT') { - var delimiter = (self.options.delimiterRegex) ? self.options.delimiterRegex : self.options.delimiter; - var items = item.split(delimiter); - if (items.length > 1) { - for (var i = 0; i < items.length; i++) { - this.add(items[i], true); - } - - if (!dontPushVal) - self.pushVal(self.options.triggerChange); - return; - } - } - - var itemValue = self.options.itemValue(item), - itemText = self.options.itemText(item), - tagClass = self.options.tagClass(item), - itemTitle = self.options.itemTitle(item); - - // Ignore items allready added - var existing = $.grep(self.itemsArray, function(item) { return self.options.itemValue(item) === itemValue; } )[0]; - if (existing && !self.options.allowDuplicates) { - // Invoke onTagExists - if (self.options.onTagExists) { - var $existingTag = $(".tag", self.$container).filter(function() { return $(this).data("item") === existing; }); - self.options.onTagExists(item, $existingTag); - } - return; - } - - // if length greater than limit - if (self.items().toString().length + item.length + 1 > self.options.maxInputLength) - return; - - // raise beforeItemAdd arg - var beforeItemAddEvent = $.Event('beforeItemAdd', { item: item, cancel: false, options: options}); - self.$element.trigger(beforeItemAddEvent); - if (beforeItemAddEvent.cancel) - return; - - // register item in internal array and map - self.itemsArray.push(item); - - // add a tag element - - var $tag = $('' + htmlEncode(itemText) + ''); - $tag.data('item', item); - self.findInputWrapper().before($tag); - $tag.after(' '); - - // Check to see if the tag exists in its raw or uri-encoded form - var optionExists = ( - $('option[value="' + encodeURIComponent(itemValue) + '"]', self.$element).length || - $('option[value="' + htmlEncode(itemValue) + '"]', self.$element).length - ); - - // add '),e.fn.detach?r.detach():r.remove();var s=e(t).find("colgroup.tablesorter-savemyplace");r.insertAfter(s),s.remove(),t.isProcessing=!1},clearTableBody:function(t){e(t)[0].config.$tbodies.children().detach()},characterEquivalents:{a:"áàâãäąå",A:"ÁÀÂÃÄĄÅ",c:"çćč",C:"ÇĆČ",e:"éèêëěę",E:"ÉÈÊËĚĘ",i:"íìİîïı",I:"ÍÌİÎÏ",o:"óòôõöō",O:"ÓÒÔÕÖŌ",ss:"ß",SS:"ẞ",u:"úùûüů",U:"ÚÙÛÜŮ"},replaceAccents:function(e){var r,o="[",s=t.characterEquivalents;if(!t.characterRegex){t.characterRegexArray={};for(r in s)"string"==typeof r&&(o+=s[r],t.characterRegexArray[r]=new RegExp("["+s[r]+"]","g"));t.characterRegex=new RegExp(o+"]")}if(t.characterRegex.test(e))for(r in s)"string"==typeof r&&(e=e.replace(t.characterRegexArray[r],r));return e},validateOptions:function(r){var o,s,a,n,i="headers sortForce sortList sortAppend widgets".split(" "),d=r.originalSettings;if(d){t.debug(r,"core")&&(n=new Date);for(o in d)if("undefined"===(a=typeof t.defaults[o]))console.warn('Tablesorter Warning! "table.config.'+o+'" option not recognized');else if("object"===a)for(s in d[o])a=t.defaults[o]&&typeof t.defaults[o][s],e.inArray(o,i)<0&&"undefined"===a&&console.warn('Tablesorter Warning! "table.config.'+o+"."+s+'" option not recognized');t.debug(r,"core")&&console.log("validate options time:"+t.benchmark(n))}},restoreHeaders:function(r){var o,s,a=e(r)[0].config,n=a.$table.find(a.selectorHeaders),i=n.length;for(o=0;o tr").children("th, td");!1===o&&e.inArray("uitheme",i.widgets)>=0&&(n.triggerHandler("applyWidgetId",["uitheme"]),n.triggerHandler("applyWidgetId",["zebra"])),d.find("tr").not(l).remove(),a="sortReset update updateRows updateAll updateHeaders updateCell addRows updateComplete sorton appendCache updateCache applyWidgetId applyWidgets refreshWidgets removeWidget destroy mouseup mouseleave "+"keypress sortBegin sortEnd resetToLoadState ".split(" ").join(i.namespace+" "),n.removeData("tablesorter").unbind(a.replace(t.regex.spaces," ")),i.$headers.add(c).removeClass([t.css.header,i.cssHeader,i.cssAsc,i.cssDesc,t.css.sortAsc,t.css.sortDesc,t.css.sortNone].join(" ")).removeAttr("data-column").removeAttr("aria-label").attr("aria-disabled","true"),l.find(i.selectorSort).unbind("mousedown mouseup keypress ".split(" ").join(i.namespace+" ").replace(t.regex.spaces," ")),t.restoreHeaders(r),n.toggleClass(t.css.table+" "+i.tableClass+" tablesorter-"+i.theme,!1===o),n.removeClass(i.namespace.slice(1)),r.hasInitialized=!1,delete r.config.cache,"function"==typeof s&&s(r),t.debug(i,"core")&&console.log("tablesorter has been removed")}}};e.fn.tablesorter=function(r){return this.each(function(){var o=this,s=e.extend(!0,{},t.defaults,r,t.instanceMethods);s.originalSettings=r,!o.hasInitialized&&t.buildTable&&"TABLE"!==this.nodeName?t.buildTable(o,s):t.setup(o,s)})},window.console&&window.console.log||(t.logs=[],console={},console.log=console.warn=console.error=console.table=function(){var e=arguments.length>1?arguments:arguments[0];t.logs[t.logs.length]={date:Date.now(),log:e}}),t.addParser({id:"no-parser",is:function(){return!1},format:function(){return""},type:"text"}),t.addParser({id:"text",is:function(){return!0},format:function(r,o){var s=o.config;return r&&(r=e.trim(s.ignoreCase?r.toLocaleLowerCase():r),r=s.sortLocaleCompare?t.replaceAccents(r):r),r},type:"text"}),t.regex.nondigit=/[^\w,. \-()]/g,t.addParser({id:"digit",is:function(e){return t.isDigit(e)},format:function(r,o){var s=t.formatFloat((r||"").replace(t.regex.nondigit,""),o);return r&&"number"==typeof s?s:r?e.trim(r&&o.config.ignoreCase?r.toLocaleLowerCase():r):r},type:"numeric"}),t.regex.currencyReplace=/[+\-,. ]/g,t.regex.currencyTest=/^\(?\d+[\u00a3$\u20ac\u00a4\u00a5\u00a2?.]|[\u00a3$\u20ac\u00a4\u00a5\u00a2?.]\d+\)?$/,t.addParser({id:"currency",is:function(e){return e=(e||"").replace(t.regex.currencyReplace,""),t.regex.currencyTest.test(e)},format:function(r,o){var s=t.formatFloat((r||"").replace(t.regex.nondigit,""),o);return r&&"number"==typeof s?s:r?e.trim(r&&o.config.ignoreCase?r.toLocaleLowerCase():r):r},type:"numeric"}),t.regex.urlProtocolTest=/^(https?|ftp|file):\/\//,t.regex.urlProtocolReplace=/(https?|ftp|file):\/\/(www\.)?/,t.addParser({id:"url",is:function(e){return t.regex.urlProtocolTest.test(e)},format:function(r){return r?e.trim(r.replace(t.regex.urlProtocolReplace,"")):r},type:"text"}),t.regex.dash=/-/g,t.regex.isoDate=/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}/,t.addParser({id:"isoDate",is:function(e){return t.regex.isoDate.test(e)},format:function(e){var r=e?new Date(e.replace(t.regex.dash,"/")):e;return r instanceof Date&&isFinite(r)?r.getTime():e},type:"numeric"}),t.regex.percent=/%/g,t.regex.percentTest=/(\d\s*?%|%\s*?\d)/,t.addParser({id:"percent",is:function(e){return t.regex.percentTest.test(e)&&e.length<15},format:function(e,r){return e?t.formatFloat(e.replace(t.regex.percent,""),r):e},type:"numeric"}),t.addParser({id:"image",is:function(e,t,r,o){return o.find("img").length>0},format:function(t,r,o){return e(o).find("img").attr(r.config.imgAttr||"alt")||t},parsed:!0,type:"text"}),t.regex.dateReplace=/(\S)([AP]M)$/i,t.regex.usLongDateTest1=/^[A-Z]{3,10}\.?\s+\d{1,2},?\s+(\d{4})(\s+\d{1,2}:\d{2}(:\d{2})?(\s+[AP]M)?)?$/i,t.regex.usLongDateTest2=/^\d{1,2}\s+[A-Z]{3,10}\s+\d{4}/i,t.addParser({id:"usLongDate",is:function(e){return t.regex.usLongDateTest1.test(e)||t.regex.usLongDateTest2.test(e)},format:function(e){var r=e?new Date(e.replace(t.regex.dateReplace,"$1 $2")):e;return r instanceof Date&&isFinite(r)?r.getTime():e},type:"numeric"}),t.regex.shortDateTest=/(^\d{1,2}[\/\s]\d{1,2}[\/\s]\d{4})|(^\d{4}[\/\s]\d{1,2}[\/\s]\d{1,2})/,t.regex.shortDateReplace=/[\-.,]/g,t.regex.shortDateXXY=/(\d{1,2})[\/\s](\d{1,2})[\/\s](\d{4})/,t.regex.shortDateYMD=/(\d{4})[\/\s](\d{1,2})[\/\s](\d{1,2})/,t.convertFormat=function(e,r){e=(e||"").replace(t.regex.spaces," ").replace(t.regex.shortDateReplace,"/"),"mmddyyyy"===r?e=e.replace(t.regex.shortDateXXY,"$3/$1/$2"):"ddmmyyyy"===r?e=e.replace(t.regex.shortDateXXY,"$3/$2/$1"):"yyyymmdd"===r&&(e=e.replace(t.regex.shortDateYMD,"$1/$2/$3"));var o=new Date(e);return o instanceof Date&&isFinite(o)?o.getTime():""},t.addParser({id:"shortDate",is:function(e){return e=(e||"").replace(t.regex.spaces," ").replace(t.regex.shortDateReplace,"/"),t.regex.shortDateTest.test(e)},format:function(e,r,o,s){if(e){var a=r.config,n=a.$headerIndexed[s],i=n.length&&n.data("dateFormat")||t.getData(n,t.getColumnData(r,a.headers,s),"dateFormat")||a.dateFormat;return n.length&&n.data("dateFormat",i),t.convertFormat(e,i)||e}return e},type:"numeric"}),t.regex.timeTest=/^(0?[1-9]|1[0-2]):([0-5]\d)(\s[AP]M)$|^((?:[01]\d|[2][0-4]):[0-5]\d)$/i,t.regex.timeMatch=/(0?[1-9]|1[0-2]):([0-5]\d)(\s[AP]M)|((?:[01]\d|[2][0-4]):[0-5]\d)/i,t.addParser({id:"time",is:function(e){return t.regex.timeTest.test(e)},format:function(e){var r,o=(e||"").match(t.regex.timeMatch),s=new Date(e),a=e&&(null!==o?o[0]:"00:00 AM"),n=a?new Date("2000/01/01 "+a.replace(t.regex.dateReplace,"$1 $2")):a;return n instanceof Date&&isFinite(n)?(r=s instanceof Date&&isFinite(s)?s.getTime():0,r?parseFloat(n.getTime()+"."+s.getTime()):n.getTime()):e},type:"numeric"}),t.addParser({id:"metadata",is:function(){return!1},format:function(t,r,o){var s=r.config,a=s.parserMetadataName?s.parserMetadataName:"sortValue";return e(o).metadata()[a]},type:"numeric"}),t.addWidget({id:"zebra",priority:90,format:function(t,r,o){var s,a,n,i,d,l,c,g=new RegExp(r.cssChildRow,"i"),p=r.$tbodies.add(e(r.namespace+"_extra_table").children("tbody:not(."+r.cssInfoBlock+")"));for(d=0;d> Using",f?m:"cookies"),e.parseJSON&&(f?h=e.parseJSON(t[m][l]||"null")||{}:(c=r.cookie.split(/[;\s|=]/),h=0!==(o=e.inArray(l,c)+1)?e.parseJSON(c[o]||"null")||{}:{})),void 0===s||!t.JSON||!JSON.hasOwnProperty("stringify"))return h&&h[v]?h[v][_]:"";h[v]||(h[v]={}),h[v][_]=s,f?t[m][l]=JSON.stringify(h):((d=new Date).setTime(d.getTime()+31536e6),r.cookie=l+"="+JSON.stringify(h).replace(/\"/g,'"')+"; expires="+d.toGMTString()+"; path=/")}}(e,window,document),function(e){"use strict";var t=e.tablesorter||{};t.themes={bootstrap:{table:"table table-bordered table-striped",caption:"caption",header:"bootstrap-header",sortNone:"",sortAsc:"",sortDesc:"",active:"",hover:"",icons:"",iconSortNone:"bootstrap-icon-unsorted",iconSortAsc:"glyphicon glyphicon-chevron-up",iconSortDesc:"glyphicon glyphicon-chevron-down",filterRow:"",footerRow:"",footerCells:"",even:"",odd:""},jui:{table:"ui-widget ui-widget-content ui-corner-all",caption:"ui-widget-content",header:"ui-widget-header ui-corner-all ui-state-default",sortNone:"",sortAsc:"",sortDesc:"",active:"ui-state-active",hover:"ui-state-hover",icons:"ui-icon",iconSortNone:"ui-icon-carat-2-n-s ui-icon-caret-2-n-s",iconSortAsc:"ui-icon-carat-1-n ui-icon-caret-1-n",iconSortDesc:"ui-icon-carat-1-s ui-icon-caret-1-s",filterRow:"",footerRow:"",footerCells:"",even:"ui-widget-content",odd:"ui-state-default"}},e.extend(t.css,{wrapper:"tablesorter-wrapper"}),t.addWidget({id:"uitheme",priority:10,format:function(r,i,a){var l,s,n,o,c,d,f,h,u,p,g,m,b,y=t.themes,_=i.$table.add(e(i.namespace+"_extra_table")),v=i.$headers.add(e(i.namespace+"_extra_headers")),w=i.theme||"jui",x=y[w]||{},S=e.trim([x.sortNone,x.sortDesc,x.sortAsc,x.active].join(" ")),C=e.trim([x.iconSortNone,x.iconSortDesc,x.iconSortAsc].join(" ")),z=t.debug(i,"uitheme");for(z&&(c=new Date),_.hasClass("tablesorter-"+w)&&i.theme===i.appliedTheme&&a.uitheme_applied||(a.uitheme_applied=!0,p=y[i.appliedTheme]||{},g=(b=!e.isEmptyObject(p))?[p.sortNone,p.sortDesc,p.sortAsc,p.active].join(" "):"",m=b?[p.iconSortNone,p.iconSortDesc,p.iconSortAsc].join(" "):"",b&&(a.zebra[0]=e.trim(" "+a.zebra[0].replace(" "+p.even,"")),a.zebra[1]=e.trim(" "+a.zebra[1].replace(" "+p.odd,"")),i.$tbodies.children().removeClass([p.even,p.odd].join(" "))),x.even&&(a.zebra[0]+=" "+x.even),x.odd&&(a.zebra[1]+=" "+x.odd),_.children("caption").removeClass(p.caption||"").addClass(x.caption),h=_.removeClass((i.appliedTheme?"tablesorter-"+(i.appliedTheme||""):"")+" "+(p.table||"")).addClass("tablesorter-"+w+" "+(x.table||"")).children("tfoot"),i.appliedTheme=i.theme,h.length&&h.children("tr").removeClass(p.footerRow||"").addClass(x.footerRow).children("th, td").removeClass(p.footerCells||"").addClass(x.footerCells),v.removeClass((b?[p.header,p.hover,g].join(" "):"")||"").addClass(x.header).not(".sorter-false").unbind("mouseenter.tsuitheme mouseleave.tsuitheme").bind("mouseenter.tsuitheme mouseleave.tsuitheme",function(t){e(this)["mouseenter"===t.type?"addClass":"removeClass"](x.hover||"")}),v.each(function(){var r=e(this);r.find("."+t.css.wrapper).length||r.wrapInner('
')}),i.cssIcon&&v.find("."+t.css.icon).removeClass(b?[p.icons,m].join(" "):"").addClass(x.icons||""),t.hasWidget(i.table,"filter")&&(s=function(){_.children("thead").children("."+t.css.filterRow).removeClass(b?p.filterRow||"":"").addClass(x.filterRow||"")},a.filter_initialized?s():_.one("filterInit",function(){s()}))),l=0;l> Applied "+w+" theme"+t.benchmark(c))},remove:function(e,r,i,a){if(i.uitheme_applied){var l=r.$table,s=r.appliedTheme||"jui",n=t.themes[s]||t.themes.jui,o=l.children("thead").children(),c=n.sortNone+" "+n.sortDesc+" "+n.sortAsc,d=n.iconSortNone+" "+n.iconSortDesc+" "+n.iconSortAsc;l.removeClass("tablesorter-"+s+" "+n.table),i.uitheme_applied=!1,a||(l.find(t.css.header).removeClass(n.header),o.unbind("mouseenter.tsuitheme mouseleave.tsuitheme").removeClass(n.hover+" "+c+" "+n.active).filter("."+t.css.filterRow).removeClass(n.filterRow),o.find("."+t.css.icon).removeClass(n.icons+" "+d))}}})}(e),function(e){"use strict";var t=e.tablesorter||{};t.addWidget({id:"columns",priority:65,options:{columns:["primary","secondary","tertiary"]},format:function(r,i,a){var l,s,n,o,c,d,f,h,u=i.$table,p=i.$tbodies,g=i.sortList,m=g.length,b=a&&a.columns||["primary","secondary","tertiary"],y=b.length-1;for(f=b.join(" "),s=0;s1)))for(h=1;h=]/g,query:"(q|query)",wild01:/\?/g,wild0More:/\*/g,quote:/\"/g,isNeg1:/(>=?\s*-\d)/,isNeg2:/(<=?\s*\d)/},types:{or:function(i,a,l){if((r.orTest.test(a.iFilter)||r.orSplit.test(a.filter))&&!r.regex.test(a.filter)){var s,n,o,c,d=e.extend({},a),f=a.filter.split(r.orSplit),h=a.iFilter.split(r.orSplit),u=f.length;for(s=0;s=f:s>f:r.ltTest.test(l.iFilter)&&(n=r.lteTest.test(l.iFilter)?s<=f:s=0)))}return null},exact:function(i,a){if(r.exact.test(a.iFilter)){var l=a.iFilter.replace(r.exact,""),s=t.parseFilter(i,l,a)||"";return a.anyMatch?e.inArray(s,a.rowArray)>=0:s==a.iExact}return null},range:function(e,a){if(r.toTest.test(a.iFilter)){var l,s,n,o,c=e.table,d=a.index,f=a.parsed[d],h=a.iFilter.split(r.toSplit);return s=h[0].replace(i.regex.nondigit,"")||"",n=i.formatFloat(t.parseFilter(e,s,a),c),s=h[1].replace(i.regex.nondigit,"")||"",o=i.formatFloat(t.parseFilter(e,s,a),c),(f||"numeric"===e.parsers[d].type)&&(n=""===(l=e.parsers[d].format(""+h[0],c,e.$headers.eq(d),d))||isNaN(l)?n:l,o=""===(l=e.parsers[d].format(""+h[1],c,e.$headers.eq(d),d))||isNaN(l)?o:l),!f&&"numeric"!==e.parsers[d].type||isNaN(n)||isNaN(o)?(s=isNaN(a.iExact)?a.iExact.replace(i.regex.nondigit,""):a.iExact,l=i.formatFloat(s,c)):l=a.cache,n>o&&(s=n,n=o,o=s),l>=n&&l<=o||""===n||""===o}return null},wild:function(e,i){if(r.wildOrTest.test(i.iFilter)){var a=""+(t.parseFilter(e,i.iFilter,i)||"");!r.wildTest.test(a)&&i.nestedFilters&&(a=i.isMatch?a:"^("+a+")$");try{return new RegExp(a.replace(r.wild01,"\\S{1}").replace(r.wild0More,"\\S*"),e.widgetOptions.filter_ignoreCase?"i":"").test(i.exact)}catch(e){return null}}return null},fuzzy:function(e,i){if(r.fuzzyTest.test(i.iFilter)){var a,l=0,s=i.iExact.length,n=i.iFilter.slice(1),o=t.parseFilter(e,n,i)||"";for(a=0;a]=?/,gtTest:/>/,gteTest:/>=/,ltTest:/'+(c.data("placeholder")||c.attr("data-placeholder")||g.filter_placeholder.select||"")+"":"",f=n,o=n,n.indexOf(g.filter_selectSourceSeparator)>=0&&(o=(f=n.split(g.filter_selectSourceSeparator))[1],f=f[0]),s+="");p.$table.find("thead").find("select."+a.filter+'[data-column="'+d+'"]').append(s),(h="function"==typeof(o=g.filter_selectSource)||i.getColumnData(l,o,d))&&t.buildSelect(p.table,d,"",!0,c.hasClass(g.filter_onlyAvail))}t.buildDefault(l,!0),t.bindSearch(l,p.$table.find("."+a.filter),!0),g.filter_external&&t.bindSearch(l,g.filter_external),g.filter_hideFilters&&t.hideFilters(p),p.showProcessing&&(o="filterStart filterEnd ".split(" ").join(p.namespace+"filter-sp "),p.$table.unbind(o.replace(i.regex.spaces," ")).bind(o,function(t,r){c=r?p.$table.find("."+a.header).filter("[data-column]").filter(function(){return""!==r[e(this).data("column")]}):"",i.isProcessing(l,"filterStart"===t.type,r?c:"")})),p.filteredRows=p.totalRows,o="tablesorter-initialized pagerBeforeInitialized ".split(" ").join(p.namespace+"filter "),p.$table.unbind(o.replace(i.regex.spaces," ")).bind(o,function(){t.completeInit(this)}),p.pager&&p.pager.initialized&&!g.filter_initialized?(p.$table.triggerHandler("filterFomatterUpdate"),setTimeout(function(){t.filterInitComplete(p)},100)):g.filter_initialized||t.completeInit(l)},completeInit:function(e){var r=e.config,a=r.widgetOptions,l=t.setDefaults(e,r,a)||[];l.length&&(r.delayInit&&""===l.join("")||i.setFilters(e,l,!0)),r.$table.triggerHandler("filterFomatterUpdate"),setTimeout(function(){a.filter_initialized||t.filterInitComplete(r)},100)},formatterUpdated:function(e,t){var r=e&&e.closest("table"),i=r.length&&r[0].config,a=i&&i.widgetOptions;a&&!a.filter_initialized&&(a.filter_formatterInit[t]=1)},filterInitComplete:function(r){var a,l,s=r.widgetOptions,n=0,o=function(){s.filter_initialized=!0,r.lastSearch=r.$table.data("lastSearch"),r.$table.triggerHandler("filterInit",r),t.findRows(r.table,r.lastSearch||[]),i.debug(r,"filter")&&console.log("Filter >> Widget initialized")};if(e.isEmptyObject(s.filter_formatter))o();else{for(l=s.filter_formatterInit.length,a=0;a';for(c=0;c1?'
', '']); -// $list->setColumnParams($thIcon, ['func' => 'edit', 'data_id' => '###id###']); - - $thIcon = ''; - $tdIcon = ''; - $list->addColumn($thIcon, $tdIcon, 0, ['', '']); - $list->setColumnParams($thIcon, ['func' => 'domain_edit', 'id' => '###id###']); - $list->setColumnFormat($thIcon, 'custom', function ($params) { - $filename = ''; - if (file_exists($this->getAssetsPath('favicon/'.$params['list']->getValue('domain').'.png'))) { - - $filename = $this->getAssetsUrl('favicon/'.$params['list']->getValue('domain').'.png'); - return ''; - } else { - return ''; - } - }); - - $list->setColumnParams('id', ['data_id' => '###id###', 'func' => 'edit']); - $list->setColumnSortable('id'); - - $list->removeColumn('id'); - $list->removeColumn('description'); - $list->removeColumn('api_key'); - $list->removeColumn('param'); - $list->removeColumn('domain_id'); - $list->removeColumn('raw'); - $list->removeColumn('domain'); - $list->removeColumn('cms'); - $list->removeColumn('tags'); - $list->removeColumn('createdate'); - - $list->setColumnLabel('name', $this->i18n('name')); - $list->setColumnParams('name', ['page' => 'project_manager/server/projects', 'func' => 'updateinfos', 'domain' => '###domain###']); - - $list->setColumnLabel('domain', $this->i18n('domain')); - $list->addColumn($this->i18n('domain'), '###domain###', 3); - //$list->setColumnParams($this->i18n('domain'), ['page' => 'project_manager/server/projects', 'domain' => '###domain###']); - $list->setColumnFormat($this->i18n('domain'), 'custom', function ($params) { - - $ssl = $params['list']->getValue('is_ssl'); - $protocol = ($ssl == 1) ? "https://" : "http://"; - - - if($params['list']->getValue('raw')) { - $raw= json_decode($params['list']->getValue('raw'), true); - - if (isset($raw['rex_url_backend'])) { - $rex_url_backend = ' - - '; - } - } - - $return_string = ''; - if ((isset($rex_url_backend)) && ('' !== $rex_url_backend)) { - $return_string .= $rex_url_backend; - } - $return_string .= ' ' . $params['list']->getValue('domain') . ''; - - return $return_string; - - }); - - $list->setColumnLabel('is_ssl', $this->i18n('is_ssl')); - $list->setColumnLayout('is_ssl', ['', '']); - $list->setColumnFormat('is_ssl', 'custom', function ($params) { - if ($params['list']->getValue('is_ssl') == "1") { - return ''; - } else if ($params['list']->getValue('is_ssl') == "0") { - return ''; - } else { - return "?"; - } - }); - - - $list->addColumn($this->i18n('update_content'), false, -1, ['', '']); - $list->setColumnLabel('update_content', $this->i18n('update_content')); - $list->setColumnFormat($this->i18n('update_content'), 'custom', function ($params) { - if($params['list']->getValue('raw')) { - $raw= json_decode($params['list']->getValue('raw'), true); -// dump($raw); - if (substr($raw['cms_version'], 0, 1) == 4 ) { //if REX 4.x - if (array_key_exists('update_article', $raw) && array_key_exists('update_media', $raw)) { - if ($raw['update_media'] > $raw['update_article']) { - return date('d.m.Y H:i:s', $raw['update_media']); - } else { - return date('d.m.Y H:i:s', $raw['update_article']); - } - } else { - return "-"; - } - } else { //if REX 5.x - return date('d.m.Y H:i:s', strtotime($raw['article'][0]['updatedate'])); - - } - } - }); - - - $list->setColumnLabel('status', $this->i18n('status')); - $list->setColumnFormat('status', 'custom', function ($params) { - if ($params['list']->getValue('status') == "1") { - return ''; - } else if ($params['list']->getValue('status') == "0") { - return ''; - } else if ($params['list']->getValue('status') == "-1") { - return ''; - } else if ($params['list']->getValue('status') == "2") { - return ''; - } else { - - $api_key = ''; - if ($params['list']->getValue('api_key') != "") $api_key = $params['list']->getValue('api_key'); - - $param = ''; - if ($params['list']->getValue('param') != "") { - $param = $params['list']->getValue('param'); - $param = explode(',', $param); - $param = '&'.implode('&', $param); - } - - if ($params['list']->getValue('is_ssl') == 1) { - - return ''; - } - - if ($params['list']->getValue('is_ssl') == 0) { - - return ''; - } - } - }); - - $list->setColumnLayout('status', ['', '']); - - $list->setColumnLabel('maintenance', $this->i18n('maintenance_short')); - $list->setColumnFormat('maintenance', 'custom', function ($params) { - - if ($params['list']->getValue('maintenance') == "1") { - return ''; - } else if ($params['list']->getValue('maintenance') == "0") { - return ''; - } else if ($params['list']->getValue('maintenance') == null) { - return ''; - } - }); - - $list->setColumnLayout('maintenance', ['', '']); - - - $list->addColumn($this->i18n('pm_client_version'), false, -1, ['', '']); - $list->setColumnLabel($this->i18n('pm_client_version'), $this->i18n('pm_client_version')); - $list->setColumnFormat($this->i18n('pm_client_version'), 'custom', function ($params) { - if($params['list']->getValue('raw')) { - $raw= json_decode($params['list']->getValue('raw'), true); - return $raw['client_version']; - } - }); - - $list->addColumn($this->i18n('cms_version'), false, -1, ['', '']); - $list->setColumnLabel($this->i18n('cms_version'), $this->i18n('cms_version')); - $list->setColumnFormat($this->i18n('cms_version'), 'custom', function ($params) { - if($params['list']->getValue('raw')) { - $raw= json_decode($params['list']->getValue('raw'), true); - - if (rex_config::get('project_manager/server', 'cms_min') != "") { - $cms_min = rex_config::get('project_manager/server', 'cms_min'); - } else { - $cms_min = '5.3.0'; - } - - if (rex_config::get('project_manager/server', 'cms_4_min') != "") { - $cms_4_min = rex_config::get('project_manager/server', 'cms_4_min'); - } else { - $cms_4_min = '4.7.0'; - } - - if ($params['list']->getValue('cms') == '4') { - if ( $raw['cms_version'] < $cms_4_min) { - return ''.$raw['cms_version'].''; - } else { - return $raw['cms_version']; - } - } else if ($params['list']->getValue('cms') == '5') { - if (version_compare($raw['cms_version'], $cms_min) < 0 ) { - return ''.$raw['cms_version'].''; - } else { - return $raw['cms_version']; - } - } - - return $raw['cms_version']; - } - }); - - - $list->addColumn($this->i18n('php_version'), false, -1, ['', '']); - - $list->setColumnLabel($this->i18n('php_version'), $this->i18n('php_version')); - $list->setColumnFormat($this->i18n('php_version'), 'custom', function ($params) { - if($params['list']->getValue('raw')) { - $raw= json_decode($params['list']->getValue('raw'), true); - - if (rex_config::get('project_manager/server', 'php_min') != "") { - $php_min = rex_config::get('project_manager/server', 'php_min'); - } else { - $php_min = '5.3'; - } - - if (version_compare($raw['php_version'], $php_min) < 0 ) { - return ''.substr($raw['php_version'],0,3).''; - } else { - return substr($raw['php_version'],0,3); - } - } - }); - - $list->addColumn($this->i18n('updates'), false, -1, ['', '']); - $list->setColumnLabel($this->i18n('updates'), ($this->i18n('updates'))); - $list->setColumnFormat($this->i18n('updates'), 'custom', function ($params) { - $addon = ''; - $addon = $params['field']; - if($params['list']->getValue('raw')) { - $log = json_decode($params['list']->getValue('raw'), true); - - - if (is_array($log) && array_key_exists("rex_addons", $log)) { - - if(json_last_error() === JSON_ERROR_NONE && $log["rex_addons"] && count($log["rex_addons"])) { - $i = 0; - $j = 0; - foreach($log["rex_addons"] as $addon) { - - $skip_addon_config = ''; - $skip_addon_config = rex_config::get('project_manager/server', 'skip_addon'); - if ($skip_addon_config != "") { - $skip_addons = explode(',', $skip_addon_config); - if (in_array($addon['name'], $skip_addons)) continue; - } - - if(version_compare($addon['version_current'], $addon['version_latest']) < 0) { - - $skip_addon_version_config = ''; - $skip_addon_version_config = rex_config::get('project_manager/server', 'skip_addon_version'); - - if ($skip_addon_version_config != "") $skip_addon_versions = explode(',', $skip_addon_version_config); - - $skip = false; - - if (isset($skip_addon_versions) && is_array($skip_addon_versions)) { - foreach ($skip_addon_versions as $skip_addon_version) { - - if (strpos($addon['version_latest'], $skip_addon_version)) { - $skip = true; - } - } - } - - if ($addon['version_latest'] == 0) $skip = true; - - if ($skip === false) { - $i++; - } - - } else { - $j++; - } - } - - if ($i > 0) { - return $i ." ". $this->i18n('updates_necessary'); - } else { - return "-"; - } - } else { - return ""; - } - } else if ($params['list']->getValue('cms') == 4) { - return "-"; - } - } - }); - - - $list->addColumn($this->i18n('syslog'), false, -1, ['', '']); - $list->setColumnLabel($this->i18n('syslog'), $this->i18n('syslog')); - $list->setColumnFormat($this->i18n('syslog'), 'custom', function ($params) { - if($params['list']->getValue('raw')) { - $raw= json_decode($params['list']->getValue('raw'), true); - if (is_array($raw) && array_key_exists("syslog", $raw)) { - - $syslog = $raw['syslog']; - $show_triangle = false; - - foreach ($syslog as $entry) { - if ($entry["syslog_type"] != 'Info') $show_triangle = true; - } - if ($show_triangle == true) { - return ''; - } else { - return ''; - } - } else if ($params['list']->getValue('cms') == 5) { - return ''; - }else { - return '-'; - } - } - }); - - $list->setColumnParams($this->i18n('domain'), ['page' => 'project_manager/server/projects', 'domain' => '###domain###']); - - $list->addColumn(rex_i18n::msg('view'), ''); - $list->setColumnLayout(rex_i18n::msg('view'), ['', '']); - $list->setColumnParams(rex_i18n::msg('view'), ['page' => 'project_manager/server/projects', 'domain' => '###domain###'] + $csrf->getUrlParams()); - - $list->addColumn(rex_i18n::msg('function'), ''); - $list->setColumnLayout(rex_i18n::msg('function'), ['', '']); - $list->setColumnParams(rex_i18n::msg('function'), ['data_id' => '###id###', 'func' => 'edit']); - - - $list->addColumn(rex_i18n::msg('delete'), ''); - $list->setColumnLayout(rex_i18n::msg('delete'), ['', '']); - $list->setColumnParams(rex_i18n::msg('delete'), ['data_id' => '###id###', 'func' => 'delete'] + $csrf->getUrlParams()); - $list->addLinkAttribute(rex_i18n::msg('delete'), 'onclick', 'return confirm(\' id=###id### ' . rex_i18n::msg('delete') . ' ?\')'); - - $showArticle = function ($params) { - $id = $params['list']->getValue($params['field']); - if ($id == 0) { - return $this->i18n('root'); - } else { - if (($article = rex_article::get($id))) { - if ($article->isStartArticle()) { - $link = 'index.php?page=structure&category_id='.$id.'&clang=1'; - } else { - $link = 'index.php?page=content&article_id='.$id.'&mode=edit&clang=1'; - } - return $article->getName().' ['.$id.']'; - } - } - return '['.$id.']'; - }; - - $content = $list->get(); - $content = str_replace('
").appendTo(i.$table.children("thead").eq(0)).children("td"),c=0;c").appendTo(n):((p=a.getColumnData(r,o.filter_formatter,c))?(o.filter_formatterCount++,(v=p(n,c))&&0===v.length&&(v=n.children("input")),v&&(0===v.parent().length||v.parent().length&&v.parent()[0]!==n[0])&&n.append(v)):v=e('').appendTo(n),v&&(h=d.data("placeholder")||d.attr("data-placeholder")||o.filter_placeholder.search||"",v.attr("placeholder",h))),v&&(g=(e.isArray(o.filter_cssFilter)?void 0!==o.filter_cssFilter[c]?o.filter_cssFilter[c]||"":"":o.filter_cssFilter)||"",v.addClass(s.filter+" "+g),(h=(g=o.filter_filterLabel).match(/{{([^}]+?)}}/g))||(h=["{{label}}"]),e.each(h,function(t,r){var a=new RegExp(r,"g"),s=d.attr("data-"+r.replace(/{{|}}/g,"")),i=void 0===s?d.text():s;g=g.replace(a,e.trim(i))}),v.attr({"data-column":n.attr("data-column"),"aria-label":g}),u&&(v.attr("placeholder","").addClass(s.filterDisabled)[0].disabled=!0)))},bindSearch:function(r,s,o){if(r=e(r)[0],(s=e(s)).length){var n,l=r.config,c=l.widgetOptions,d=l.namespace+"filter",f=c.filter_$externalFilters;!0!==o&&(n=c.filter_anyColumnSelector+","+c.filter_multipleColumnSelector,c.filter_$anyMatch=s.filter(n),f&&f.length?c.filter_$externalFilters=c.filter_$externalFilters.add(s):c.filter_$externalFilters=s,a.setFilters(r,l.$table.data("lastSearch")||[],!1===o)),n="keypress keyup keydown search change input ".split(" ").join(d+" "),s.attr("data-lastSearchTime",(new Date).getTime()).unbind(n.replace(a.regex.spaces," ")).bind("keydown"+d,function(e){if(e.which===i.escape&&!r.config.widgetOptions.filter_resetOnEsc)return!1}).bind("keyup"+d,function(s){c=r.config.widgetOptions;var o=parseInt(e(this).attr("data-column"),10),n="boolean"==typeof c.filter_liveSearch?c.filter_liveSearch:a.getColumnData(r,c.filter_liveSearch,o);if(void 0===n&&(n=c.filter_liveSearch.fallback||!1),e(this).attr("data-lastSearchTime",(new Date).getTime()),s.which===i.escape)this.value=c.filter_resetOnEsc?"":l.lastSearch[o];else{if(""!==this.value&&("number"==typeof n&&this.value.length=i.left&&s.which<=i.down)))return;if(!1===n&&""!==this.value&&s.which!==i.enter)return}t.searching(r,!0,!0,o)}).bind("search change keypress input blur ".split(" ").join(d+" "),function(s){var o=parseInt(e(this).attr("data-column"),10),n=s.type,d="boolean"==typeof c.filter_liveSearch?c.filter_liveSearch:a.getColumnData(r,c.filter_liveSearch,o);!r.config.widgetOptions.filter_initialized||s.which!==i.enter&&"search"!==n&&"blur"!==n&&("change"!==n&&"input"!==n||!0!==d&&(!0===d||"INPUT"===s.target.nodeName)||this.value===l.lastSearch[o])||(s.preventDefault(),e(this).attr("data-lastSearchTime",(new Date).getTime()),t.searching(r,"keypress"!==n,!0,o))})}},searching:function(e,r,s,i){var o,n=e.config.widgetOptions;void 0===i?o=!1:void 0===(o="boolean"==typeof n.filter_liveSearch?n.filter_liveSearch:a.getColumnData(e,n.filter_liveSearch,i))&&(o=n.filter_liveSearch.fallback||!1),clearTimeout(n.filter_searchTimer),void 0===r||!0===r?n.filter_searchTimer=setTimeout(function(){t.checkFilters(e,r,s)},o?n.filter_searchDelay:10):t.checkFilters(e,r,s)},equalFilters:function(t,r,a){var s,i=[],o=[],n=t.columns+1;for(r=e.isArray(r)?r:[],a=e.isArray(a)?a:[],s=0;s1?e.trim(t).split(/\s/):[e.trim(t)],n=o.length-1,l=0,c=a;for(n<1&&i>1&&(o[1]=o[0]);s.test(c);)c=c.replace(s,o[l++]||""),s.test(c)&&l(n=parseInt(i[1],10)||e.columns-1)&&(a=o,o=n,n=a),n>=e.columns&&(n=e.columns-1);o<=n;o++)u[u.length]=o;t=t.replace(s[d],"")}if(!r&&/,/.test(t))for(f=(l=t.split(/\s*,\s*/)).length,c=0;c-1})},multipleColumns:function(r,a){var s=r.widgetOptions,i=s.filter_initialized||!a.filter(s.filter_anyColumnSelector).length,o=e.trim(t.getLatestSearch(a).attr("data-column")||"");return t.findRange(r,o,!i)},processTypes:function(r,a,s){var i,o=null,n=null;for(i in t.types)e.inArray(i,s.excludeMatch)<0&&null===n&&null!==(n=t.types[i](r,a,s))&&(a.matchedOn=i,o=n);return o},matchType:function(e,t){var r,a=e.widgetOptions,i=e.$headerIndexed[t];return i.hasClass("filter-exact")?r=!1:i.hasClass("filter-match")?r=!0:(a.filter_columnFilters?i=e.$filters.find("."+s.filter).add(a.filter_$externalFilters).filter('[data-column="'+t+'"]'):a.filter_$externalFilters&&(i=a.filter_$externalFilters.filter('[data-column="'+t+'"]')),r=!!i.length&&"match"===e.widgetOptions.filter_matchType[(i[0].nodeName||"").toLowerCase()]),r},processRow:function(s,i,o){var n,l,c,d,f,u=s.widgetOptions,g=!0,p=u.filter_$anyMatch&&u.filter_$anyMatch.length,h=u.filter_$anyMatch&&u.filter_$anyMatch.length?t.multipleColumns(s,u.filter_$anyMatch):[];if(i.$cells=i.$row.children(),i.matchedOn=null,i.anyMatchFlag&&h.length>1||i.anyMatchFilter&&!p){if(i.anyMatch=!0,i.isMatch=!0,i.rowArray=i.$cells.map(function(t){if(e.inArray(t,h)>-1||i.anyMatchFilter&&!p)return i.parsed[t]?f=i.cacheArray[t]:(f=i.rawArray[t],f=e.trim(u.filter_ignoreCase?f.toLowerCase():f),s.sortLocaleCompare&&(f=a.replaceAccents(f))),f}).get(),i.filter=i.anyMatchFilter,i.iFilter=i.iAnyMatchFilter,i.exact=i.rowArray.join(" "),i.iExact=u.filter_ignoreCase?i.exact.toLowerCase():i.exact,i.cache=i.cacheArray.slice(0,-1).join(" "),o.excludeMatch=o.noAnyMatch,null!==(l=t.processTypes(s,i,o)))g=l;else if(u.filter_startsWith)for(g=!1,h=Math.min(s.columns,i.rowArray.length);!g&&h>0;)h--,g=g||0===i.rowArray[h].indexOf(i.iFilter);else g=(i.iExact+i.childRowText).indexOf(i.iFilter)>=0;if(i.anyMatch=!1,i.filters.join("")===i.filter)return g}for(h=0;h=0:i.filter===i.exact:(f=(i.iExact+i.childRowText).indexOf(t.parseFilter(s,i.iFilter,i)),n=!u.filter_startsWith&&f>=0||u.filter_startsWith&&0===f):n=l):n=l,g=!!n&&g);return g},findRows:function(s,i,o){if(!t.equalFilters(s.config,s.config.lastSearch,o)&&s.config.widgetOptions.filter_initialized){var n,l,c,d,f,u,g,p,h,m,b,y,v,w,x,C,_,$,S,z,F,R,T,I=e.extend([],i),k=s.config,A=k.widgetOptions,D=a.debug(k,"filter"),H={anyMatch:!1,filters:i,filter_regexCache:[]},N={noAnyMatch:["range","operators"],functions:[],excludeFilter:[],defaultColFilter:[],defaultAnyFilter:a.getColumnData(s,A.filter_defaultFilter,k.columns,!0)||""};for(H.parsed=[],h=0;h> Starting filter widget search",i),w=new Date),k.filteredRows=0,k.totalRows=0,o=I||[],g=0;g1&&(isNaN(F[0])?e.each(k.headerContent,function(e,t){t.toLowerCase().indexOf(F[0])>-1&&(i[R=e]=F[1])}):R=parseInt(F[0],10)-1,R>=0&&R> Searching through "+($&&_> Completed search"+a.benchmark(w)),A.filter_initialized&&(k.$table.triggerHandler("filterBeforeEnd",k),k.$table.triggerHandler("filterEnd",k)),setTimeout(function(){a.applyWidget(k.table)},0)}},getOptionSource:function(r,s,i){var o=(r=e(r)[0]).config,n=!1,l=o.widgetOptions.filter_selectSource,c=o.$table.data("lastSearch")||[],d="function"==typeof l||a.getColumnData(r,l,s);if(i&&""!==c[s]&&(i=!1),!0===d)n=l(r,s,i);else{if(d instanceof e||"string"===e.type(d)&&d.indexOf("")>=0)return d;if(e.isArray(d))n=d;else if("object"===e.type(l)&&d&&null===(n=d(r,s,i)))return null}return!1===n&&(n=t.getOptions(r,s,i)),t.processOptions(r,s,n)},processOptions:function(t,r,s){if(!e.isArray(s))return!1;var i,o,n,l,c,d,f=(t=e(t)[0]).config,u=void 0!==r&&null!==r&&r>=0&&r'+(y.data("placeholder")||y.attr("data-placeholder")||b.filter_placeholder.select||"")+"",w=m.$table.find("thead").find("select."+s.filter+'[data-column="'+i+'"]').val();if(void 0!==o&&""!==o||null!==(o=t.getOptionSource(a,i,l))){if(e.isArray(o)){for(c=0;c"}else""+h!="[object Object]"&&(d=f=h=(""+h).replace(r.quote,"""),f.indexOf(b.filter_selectSourceSeparator)>=0&&(d=(u=f.split(b.filter_selectSourceSeparator))[0],f=u[1]),v+=""!==h?"":"");o=[]}g=(m.$filters?m.$filters:m.$table.children("thead")).find("."+s.filter),b.filter_$externalFilters&&(g=g&&g.length?g.add(b.filter_$externalFilters):b.filter_$externalFilters),(p=g.filter('select[data-column="'+i+'"]')).length&&(p[n?"html":"append"](v),e.isArray(o)||p.append(o).val(w),p.val(w))}}},buildDefault:function(e,r){var s,i,o,n=e.config,l=n.widgetOptions,c=n.columns;for(s=0;s1&&(c=c.slice(1)),n===u.columns&&(c=(d=c.filter(g.filter_anyColumnSelector)).length?d:c),c.val(i[n]).trigger("change"+u.namespace)):(f[n]=c.val()||"",n===u.columns?c.slice(1).filter('[data-column*="'+c.attr("data-column")+'"]').val(f[n]):c.slice(1).val(f[n])),n===u.columns&&c.length&&(g.filter_$anyMatch=c));return f},a.setFilters=function(r,s,i,o){var n=r?e(r)[0].config:"",l=a.getFilters(r,!0,s,o);return void 0===i&&(i=!0),n&&i&&(n.lastCombinedFilter=null,n.lastSearch=[],t.searching(n.table,s,o),n.$table.triggerHandler("filterFomatterUpdate")),0!==l.length}}(e),function(e,t){"use strict";function r(t,r){var a=isNaN(r.stickyHeaders_offset)?e(r.stickyHeaders_offset):[];return a.length?a.height()||0:parseInt(r.stickyHeaders_offset,10)||0}var a=e.tablesorter||{};e.extend(a.css,{sticky:"tablesorter-stickyHeader",stickyVis:"tablesorter-sticky-visible",stickyHide:"tablesorter-sticky-hidden",stickyWrap:"tablesorter-sticky-wrapper"}),a.addHeaderResizeEvent=function(t,r,a){if((t=e(t)[0]).config){var s={timer:250},i=e.extend({},s,a),o=t.config,n=o.widgetOptions,l=function(e){var t,r,a,s,i,l,c=o.$headers.length;for(n.resize_flag=!0,r=[],t=0;t=0&&!i.$table.hasClass("hasFilters"))){var n,l,c,d,f=i.$table,u=e(o.stickyHeaders_attachTo||o.stickyHeaders_appendTo),g=i.namespace+"stickyheaders ",p=e(o.stickyHeaders_yScroll||o.stickyHeaders_attachTo||t),h=e(o.stickyHeaders_xScroll||o.stickyHeaders_attachTo||t),m=f.children("thead:first").children("tr").not(".sticky-false").children(),b=f.children("tfoot"),y=r(i,o),v=f.parent().closest("."+a.css.table).hasClass("hasStickyHeaders")?f.parent().closest("table.tablesorter")[0].config.widgetOptions.$sticky.parent():[],w=v.length?v.height():0,x=o.$sticky=f.clone().addClass("containsStickyHeaders "+a.css.sticky+" "+o.stickyHeaders+" "+i.namespace.slice(1)+"_extra_table").wrap('
'),C=x.parent().addClass(a.css.stickyHide).css({position:u.length?"absolute":"fixed",padding:parseInt(x.parent().parent().css("padding-left"),10),top:y+w,left:0,visibility:"hidden",zIndex:o.stickyHeaders_zIndex||2}),_=x.children("thead:first"),$="",S=function(e,r){var a,s,i,o,n,l=e.filter(":visible"),c=l.length;for(a=0;an.top&&m thead:gt(0), tr.sticky-false").hide(),x.find("> tbody, > tfoot").remove(),x.find("caption").toggle(o.stickyHeaders_includeCaption),d=_.children().children(),x.css({height:0,width:0,margin:0}),d.find("."+a.css.resizer).remove(),f.addClass("hasStickyHeaders").bind("pagerComplete"+g,function(){F()}),a.bindEvents(s,_.children().children("."+a.css.header)),o.stickyHeaders_appendTo?e(o.stickyHeaders_appendTo).append(C):f.after(C),i.onRenderHeader)for(l=(c=_.children("tr").children()).length,n=0;n=0&&i.$filters&&i.$filters.eq(s).find("a, select, input").filter(":visible").focus())}),a.filter.bindSearch(f,d.find("."+a.css.filter)),o.filter_hideFilters&&a.filter.hideFilters(i,x)),o.stickyHeaders_addResizeEvent&&f.bind("resize"+i.namespace+"stickyheaders",function(){F()}),R(!0),f.triggerHandler("stickyHeadersInit")}},remove:function(r,s,i){var o=s.namespace+"stickyheaders ";s.$table.removeClass("hasStickyHeaders").unbind("pagerComplete resize filterEnd stickyHeadersUpdate ".split(" ").join(o).replace(/\s+/g," ")).next("."+a.css.stickyWrap).remove(),i.$sticky&&i.$sticky.length&&i.$sticky.remove(),e(t).add(i.stickyHeaders_xScroll).add(i.stickyHeaders_yScroll).add(i.stickyHeaders_attachTo).unbind("scroll resize ".split(" ").join(o).replace(/\s+/g," ")),a.addHeaderResizeEvent(r,!0)}})}(e,window),function(e,t){"use strict";var r=e.tablesorter||{};e.extend(r.css,{resizableContainer:"tablesorter-resizable-container",resizableHandle:"tablesorter-resizable-handle",resizableNoSelect:"tablesorter-disableSelection",resizableStorage:"tablesorter-resizable"}),e(function(){var t="";e("head").append(t)}),r.resizable={init:function(t,a){if(!t.$table.hasClass("hasResizable")){t.$table.addClass("hasResizable");var s,i,o,n,l=t.$table,c=l.parent(),d=parseInt(l.css("margin-top"),10),f=a.resizable_vars={useStorage:r.storage&&!1!==a.resizable,$wrap:c,mouseXPosition:0,$target:null,$next:null,overflow:"auto"===c.css("overflow")||"scroll"===c.css("overflow")||"auto"===c.css("overflow-x")||"scroll"===c.css("overflow-x"),storedSizes:[]};for(r.resizableReset(t.table,!0),f.tableWidth=l.width(),f.fullWidth=Math.abs(c.width()-f.tableWidth)<20,f.useStorage&&f.overflow&&(r.storage(t.table,"tablesorter-table-original-css-width",f.tableWidth),n=r.storage(t.table,"tablesorter-table-resized-width")||"auto",r.resizable.setWidth(l,n,!0)),a.resizable_vars.storedSizes=o=(f.useStorage?r.storage(t.table,r.css.resizableStorage):[])||[],r.resizable.setWidths(t,a,o),r.resizable.updateStoredSizes(t,a),a.$resizable_container=e('
').css({top:d}).insertBefore(l),i=0;i').appendTo(a.$resizable_container).attr({"data-column":i,unselectable:"on"}).data("header",s).bind("selectstart",!1);r.resizable.bindings(t,a)}},updateStoredSizes:function(e,t){var r,a,s=e.columns,i=t.resizable_vars;for(i.storedSizes=[],r=0;r=3.3?0:t.$table.position().left,o.each(function(){var o=e(this),l=parseInt(o.attr("data-column"),10),c=t.columns-1,d=o.data("header");d&&(!d.is(":visible")||!a.resizable_addLastColumn&&r.resizable.checkVisibleColumns(t,l)?o.hide():(l0){for(n.storedSizes[n.target]+=d,r.resizable.setWidth(n.$target,n.storedSizes[n.target],!0),i=0;i> Saving last sort: "+s.sortList+a.benchmark(n))):(l.addClass("hasSaveSort"),d="",a.storage&&(d=t(s),f&&console.log('saveSort >> Last sort loaded: "'+d+'"'+a.benchmark(n)),l.bind("saveSortReset",function(t){t.stopPropagation(),a.storage(e,"tablesorter-savesort","")})),o&&d&&d.length>0?s.sortList=d:e.hasInitialized&&d&&d.length>0&&r(s,d)&&a.sortOn(s,d))},remove:function(e,t){t.$table.removeClass("hasSaveSort"),a.storage&&a.storage(e,"tablesorter-savesort","")}})}(e),e.tablesorter}); \ No newline at end of file diff --git a/plugins/server/assets/js/jquery.tablesorter.min.js b/plugins/server/assets/js/jquery.tablesorter.min.js deleted file mode 100644 index 3812e55..0000000 --- a/plugins/server/assets/js/jquery.tablesorter.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof module&&"object"==typeof module.exports?module.exports=e(require("jquery")):e(jQuery)}(function(e){return function(e){"use strict";var t=e.tablesorter={version:"2.30.7",parsers:[],widgets:[],defaults:{theme:"default",widthFixed:!1,showProcessing:!1,headerTemplate:"{content}",onRenderTemplate:null,onRenderHeader:null,cancelSelection:!0,tabIndex:!0,dateFormat:"mmddyyyy",sortMultiSortKey:"shiftKey",sortResetKey:"ctrlKey",usNumberFormat:!0,delayInit:!1,serverSideSorting:!1,resort:!0,headers:{},ignoreCase:!0,sortForce:null,sortList:[],sortAppend:null,sortStable:!1,sortInitialOrder:"asc",sortLocaleCompare:!1,sortReset:!1,sortRestart:!1,emptyTo:"bottom",stringTo:"max",duplicateSpan:!0,textExtraction:"basic",textAttribute:"data-text",textSorter:null,numberSorter:null,initWidgets:!0,widgetClass:"widget-{name}",widgets:[],widgetOptions:{zebra:["even","odd"]},initialized:null,tableClass:"",cssAsc:"",cssDesc:"",cssNone:"",cssHeader:"",cssHeaderRow:"",cssProcessing:"",cssChildRow:"tablesorter-childRow",cssInfoBlock:"tablesorter-infoOnly",cssNoSort:"tablesorter-noSort",cssIgnoreRow:"tablesorter-ignoreRow",cssIcon:"tablesorter-icon",cssIconNone:"",cssIconAsc:"",cssIconDesc:"",cssIconDisabled:"",pointerClick:"click",pointerDown:"mousedown",pointerUp:"mouseup",selectorHeaders:"> thead th, > thead td",selectorSort:"th, td",selectorRemove:".remove-me",debug:!1,headerList:[],empties:{},strings:{},parsers:[],globalize:0,imgAttr:0},css:{table:"tablesorter",cssHasChild:"tablesorter-hasChildRow",childRow:"tablesorter-childRow",colgroup:"tablesorter-colgroup",header:"tablesorter-header",headerRow:"tablesorter-headerRow",headerIn:"tablesorter-header-inner",icon:"tablesorter-icon",processing:"tablesorter-processing",sortAsc:"tablesorter-headerAsc",sortDesc:"tablesorter-headerDesc",sortNone:"tablesorter-headerUnSorted"},language:{sortAsc:"Ascending sort applied, ",sortDesc:"Descending sort applied, ",sortNone:"No sort applied, ",sortDisabled:"sorting is disabled",nextAsc:"activate to apply an ascending sort",nextDesc:"activate to apply a descending sort",nextNone:"activate to remove the sort"},regex:{templateContent:/\{content\}/g,templateIcon:/\{icon\}/g,templateName:/\{name\}/i,spaces:/\s+/g,nonWord:/\W/g,formElements:/(input|select|button|textarea)/i,chunk:/(^([+\-]?(?:\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)?$|^0x[0-9a-f]+$|\d+)/gi,chunks:/(^\\0|\\0$)/,hex:/^0x[0-9a-f]+$/i,comma:/,/g,digitNonUS:/[\s|\.]/g,digitNegativeTest:/^\s*\([.\d]+\)/,digitNegativeReplace:/^\s*\(([.\d]+)\)/,digitTest:/^[\-+(]?\d+[)]?$/,digitReplace:/[,.'"\s]/g},string:{max:1,min:-1,emptymin:1,emptymax:-1,zero:0,none:0,"null":0,top:!0,bottom:!1},keyCodes:{enter:13},dates:{},instanceMethods:{},setup:function(r,o){if(r&&r.tHead&&0!==r.tBodies.length&&!0!==r.hasInitialized){var s="",a=e(r),n=e.metadata;r.hasInitialized=!1,r.isProcessing=!0,r.config=o,e.data(r,"tablesorter",o),t.debug(o,"core")&&(console[console.group?"group":"log"]("Initializing tablesorter v"+t.version),e.data(r,"startoveralltimer",new Date)),o.supportsDataObject=function(e){return e[0]=parseInt(e[0],10),e[0]>1||1===e[0]&&parseInt(e[1],10)>=4}(e.fn.jquery.split(".")),o.emptyTo=o.emptyTo.toLowerCase(),o.stringTo=o.stringTo.toLowerCase(),o.last={sortList:[],clickedIndex:-1},/tablesorter\-/.test(a.attr("class"))||(s=""!==o.theme?" tablesorter-"+o.theme:""),o.namespace?o.namespace="."+o.namespace.replace(t.regex.nonWord,""):o.namespace=".tablesorter"+Math.random().toString(16).slice(2),o.table=r,o.$table=a.addClass(t.css.table+" "+o.tableClass+s+" "+o.namespace.slice(1)).attr("role","grid"),o.$headers=a.find(o.selectorHeaders),o.$table.children().children("tr").attr("role","row"),o.$tbodies=a.children("tbody:not(."+o.cssInfoBlock+")").attr({"aria-live":"polite","aria-relevant":"all"}),o.$table.children("caption").length&&((s=o.$table.children("caption")[0]).id||(s.id=o.namespace.slice(1)+"caption"),o.$table.attr("aria-labelledby",s.id)),o.widgetInit={},o.textExtraction=o.$table.attr("data-text-extraction")||o.textExtraction||"basic",t.buildHeaders(o),t.fixColumnWidth(r),t.addWidgetFromClass(r),t.applyWidgetOptions(r),t.setupParsers(o),o.totalRows=0,o.debug&&t.validateOptions(o),o.delayInit||t.buildCache(o),t.bindEvents(r,o.$headers,!0),t.bindMethods(o),o.supportsDataObject&&void 0!==a.data().sortlist?o.sortList=a.data().sortlist:n&&a.metadata()&&a.metadata().sortlist&&(o.sortList=a.metadata().sortlist),t.applyWidget(r,!0),o.sortList.length>0?t.sortOn(o,o.sortList,{},!o.initWidgets):(t.setHeadersCss(o),o.initWidgets&&t.applyWidget(r,!1)),o.showProcessing&&a.unbind("sortBegin"+o.namespace+" sortEnd"+o.namespace).bind("sortBegin"+o.namespace+" sortEnd"+o.namespace,function(e){clearTimeout(o.timerProcessing),t.isProcessing(r),"sortBegin"===e.type&&(o.timerProcessing=setTimeout(function(){t.isProcessing(r,!0)},500))}),r.hasInitialized=!0,r.isProcessing=!1,t.debug(o,"core")&&(console.log("Overall initialization time:"+t.benchmark(e.data(r,"startoveralltimer"))),t.debug(o,"core")&&console.groupEnd&&console.groupEnd()),a.triggerHandler("tablesorter-initialized",r),"function"==typeof o.initialized&&o.initialized(r)}else t.debug(o,"core")&&(r.hasInitialized?console.warn("Stopping initialization. Tablesorter has already been initialized"):console.error("Stopping initialization! No table, thead or tbody",r))},bindMethods:function(r){var o=r.$table,s=r.namespace,a="sortReset update updateRows updateAll updateHeaders addRows updateCell updateComplete sorton appendCache updateCache applyWidgetId applyWidgets refreshWidgets destroy mouseup mouseleave ".split(" ").join(s+" ");o.unbind(a.replace(t.regex.spaces," ")).bind("sortReset"+s,function(e,r){e.stopPropagation(),t.sortReset(this.config,function(e){e.isApplyingWidgets?setTimeout(function(){t.applyWidget(e,"",r)},100):t.applyWidget(e,"",r)})}).bind("updateAll"+s,function(e,r,o){e.stopPropagation(),t.updateAll(this.config,r,o)}).bind("update"+s+" updateRows"+s,function(e,r,o){e.stopPropagation(),t.update(this.config,r,o)}).bind("updateHeaders"+s,function(e,r){e.stopPropagation(),t.updateHeaders(this.config,r)}).bind("updateCell"+s,function(e,r,o,s){e.stopPropagation(),t.updateCell(this.config,r,o,s)}).bind("addRows"+s,function(e,r,o,s){e.stopPropagation(),t.addRows(this.config,r,o,s)}).bind("updateComplete"+s,function(){this.isUpdating=!1}).bind("sorton"+s,function(e,r,o,s){e.stopPropagation(),t.sortOn(this.config,r,o,s)}).bind("appendCache"+s,function(r,o,s){r.stopPropagation(),t.appendCache(this.config,s),e.isFunction(o)&&o(this)}).bind("updateCache"+s,function(e,r,o){e.stopPropagation(),t.updateCache(this.config,r,o)}).bind("applyWidgetId"+s,function(e,r){e.stopPropagation(),t.applyWidgetId(this,r)}).bind("applyWidgets"+s,function(e,r){e.stopPropagation(),t.applyWidget(this,!1,r)}).bind("refreshWidgets"+s,function(e,r,o){e.stopPropagation(),t.refreshWidgets(this,r,o)}).bind("removeWidget"+s,function(e,r,o){e.stopPropagation(),t.removeWidget(this,r,o)}).bind("destroy"+s,function(e,r,o){e.stopPropagation(),t.destroy(this,r,o)}).bind("resetToLoadState"+s,function(o){o.stopPropagation(),t.removeWidget(this,!0,!1);var s=e.extend(!0,{},r.originalSettings);(r=e.extend(!0,{},t.defaults,s)).originalSettings=s,this.hasInitialized=!1,t.setup(this,r)})},bindEvents:function(r,o,s){var a,n=(r=e(r)[0]).config,i=n.namespace,d=null;!0!==s&&(o.addClass(i.slice(1)+"_extra_headers"),(a=t.getClosest(o,"table")).length&&"TABLE"===a[0].nodeName&&a[0]!==r&&e(a[0]).addClass(i.slice(1)+"_extra_table")),a=(n.pointerDown+" "+n.pointerUp+" "+n.pointerClick+" sort keyup ").replace(t.regex.spaces," ").split(" ").join(i+" "),o.find(n.selectorSort).add(o.filter(n.selectorSort)).unbind(a).bind(a,function(r,o){var s,a,i,l=e(r.target),c=" "+r.type+" ";if(!(1!==(r.which||r.button)&&!c.match(" "+n.pointerClick+" | sort | keyup ")||" keyup "===c&&r.which!==t.keyCodes.enter||c.match(" "+n.pointerClick+" ")&&void 0!==r.which||c.match(" "+n.pointerUp+" ")&&d!==r.target&&!0!==o)){if(c.match(" "+n.pointerDown+" "))return d=r.target,void("1"===(i=l.jquery.split("."))[0]&&i[1]<4&&r.preventDefault());if(d=null,s=t.getClosest(e(this),"."+t.css.header),t.regex.formElements.test(r.target.nodeName)||l.hasClass(n.cssNoSort)||l.parents("."+n.cssNoSort).length>0||s.hasClass("sorter-false")||l.parents("button").length>0)return!n.cancelSelection;n.delayInit&&t.isEmptyObject(n.cache)&&t.buildCache(n),n.last.clickedIndex=s.attr("data-column")||s.index(),(a=n.$headerIndexed[n.last.clickedIndex][0])&&!a.sortDisabled&&t.initSort(n,a,r)}}),n.cancelSelection&&o.attr("unselectable","on").bind("selectstart",!1).css({"user-select":"none",MozUserSelect:"none"})},buildHeaders:function(r){var o,s,a,n;for(r.headerList=[],r.headerContent=[],r.sortVars=[],t.debug(r,"core")&&(a=new Date),r.columns=t.computeColumnIndex(r.$table.children("thead, tfoot").children("tr")),s=r.cssIcon?'':"",r.$headers=e(e.map(r.$table.find(r.selectorHeaders),function(o,a){var n,i,d,l,c,g=e(o);if(!t.getClosest(g,"tr").hasClass(r.cssIgnoreRow))return/(th|td)/i.test(o.nodeName)||(c=t.getClosest(g,"th, td"),g.attr("data-column",c.attr("data-column"))),n=t.getColumnData(r.table,r.headers,a,!0),r.headerContent[a]=g.html(),""===r.headerTemplate||g.find("."+t.css.headerIn).length||(l=r.headerTemplate.replace(t.regex.templateContent,g.html()).replace(t.regex.templateIcon,g.find("."+t.css.icon).length?"":s),r.onRenderTemplate&&(i=r.onRenderTemplate.apply(g,[a,l]))&&"string"==typeof i&&(l=i),g.html('
'+l+"
")),r.onRenderHeader&&r.onRenderHeader.apply(g,[a,r,r.$table]),d=parseInt(g.attr("data-column"),10),o.column=d,c=t.getOrder(t.getData(g,n,"sortInitialOrder")||r.sortInitialOrder),r.sortVars[d]={count:-1,order:c?r.sortReset?[1,0,2]:[1,0]:r.sortReset?[0,1,2]:[0,1],lockedOrder:!1,sortedBy:""},void 0!==(c=t.getData(g,n,"lockedOrder")||!1)&&!1!==c&&(r.sortVars[d].lockedOrder=!0,r.sortVars[d].order=t.getOrder(c)?[1,1]:[0,0]),r.headerList[a]=o,g.addClass(t.css.header+" "+r.cssHeader),t.getClosest(g,"tr").addClass(t.css.headerRow+" "+r.cssHeaderRow).attr("role","row"),r.tabIndex&&g.attr("tabindex",0),o})),r.$headerIndexed=[],n=0;n0))for(i+=a,n+=a;a+1>0;)s.parsers[i-a]=p,s.extractors[i-a]=u,a--;i++}y+=s.parsers.length?m:1}w&&(t.isEmptyObject(x)?console.warn(" No parsers detected!"):console[console.table?"table":"log"](x),console.log("Completed detecting parsers"+t.benchmark(f)),console.groupEnd&&console.groupEnd()),e.parsers=s.parsers,e.extractors=s.extractors},addParser:function(e){var r,o=t.parsers.length,s=!0;for(r=0;r=0;)if((n=t.parsers[l])&&"text"!==n.id&&n.is&&n.is(g,r.table,c,i))return n;return t.getParserById("text")},getElementText:function(r,o,s){if(!o)return"";var a,n=r.textExtraction||"",i=o.jquery?o:e(o);return"string"==typeof n?"basic"===n&&void 0!==(a=i.attr(r.textAttribute))?e.trim(a):e.trim(o.textContent||i.text()):"function"==typeof n?e.trim(n(i[0],r.table,s)):"function"==typeof(a=t.getColumnData(r.table,n,s))?e.trim(a(i[0],r.table,s)):e.trim(i[0].textContent||i.text())},getParsedText:function(e,r,o,s){void 0===s&&(s=t.getElementText(e,r,o));var a=""+s,n=e.parsers[o],i=e.extractors[o];return n&&(i&&"function"==typeof i.format&&(s=i.format(s,e.table,r,o)),a="no-parser"===n.id?"":n.format(""+s,e.table,r,o),e.ignoreCase&&"string"==typeof a&&(a=a.toLowerCase())),a},buildCache:function(r,o,s){var a,n,i,d,l,c,g,p,u,f,h,m,b,y,w,x,v,C,$,I,D,R,T=r.table,A=r.parsers,L=t.debug(r,"core");if(r.$tbodies=r.$table.children("tbody:not(."+r.cssInfoBlock+")"),g=void 0===s?r.$tbodies:s,r.cache={},r.totalRows=0,!A)return L?console.warn("Warning: *Empty table!* Not building a cache"):"";for(L&&(m=new Date),r.showProcessing&&t.isProcessing(T,!0),c=0;c0&&(C+=v,I+=v)),C++;else{for(y.$row=p,y.order=d,C=0,I=r.columns,l=0;l0)){for(R=0;R<=v;)i=r.duplicateSpan||0===R?n:"string"!=typeof r.textExtraction?t.getElementText(r,h,C+R)||"":"",y.raw[C+R]=i,u[C+R]=i,R++;C+=v,I+=v}C++}u[r.columns]=y,a.normalized[a.normalized.length]=u}a.colMax=x,r.totalRows+=a.normalized.length}if(r.showProcessing&&t.isProcessing(T),L){for(D=Math.min(5,r.cache[0].normalized.length),console[console.group?"group":"log"]("Building cache for "+r.totalRows+" rows (showing "+D+" rows in log) and "+r.columns+" columns"+t.benchmark(m)),n={},l=0;l-1);return o}),(u=u.not(".sorter-false").filter('[data-column="'+a[o][0]+'"]'+(1===n?":last":""))).length)for(s=0;s=0?a:n[1]%g.length}},updateAll:function(e,r,o){var s=e.table;s.isUpdating=!0,t.refreshWidgets(s,!0,!0),t.buildHeaders(e),t.bindEvents(s,e.$headers,!0),t.bindMethods(e),t.commonUpdate(e,r,o)},update:function(e,r,o){e.table.isUpdating=!0,t.updateHeader(e),t.commonUpdate(e,r,o)},updateHeaders:function(e,r){e.table.isUpdating=!0,t.buildHeaders(e),t.bindEvents(e.table,e.$headers,!0),t.resortComplete(e,r)},updateCell:function(r,o,s,a){if(e(o).closest("tr").hasClass(r.cssChildRow))console.warn('Tablesorter Warning! "updateCell" for child row content has been disabled, use "update" instead');else{if(t.isEmptyObject(r.cache))return t.updateHeader(r),void t.commonUpdate(r,s,a);r.table.isUpdating=!0,r.$table.find(r.selectorRemove).remove();var n,i,d,l,c,g,p=r.$tbodies,u=e(o),f=p.index(t.getClosest(u,"tbody")),h=r.cache[f],m=t.getClosest(u,"tr");if(o=u[0],p.length&&f>=0){if(d=p.eq(f).find("tr").not("."+r.cssChildRow).index(m),c=h.normalized[d],(g=m[0].cells.length)!==r.columns)for(l=0,n=!1,i=0;i0&&(f+=y),f++;m[r.columns]=h,r.cache[d].normalized[u]=m}t.checkResort(r,s,a)}},updateCache:function(e,r,o){e.parsers&&e.parsers.length||t.setupParsers(e,o),t.buildCache(e,r,o)},appendCache:function(e,r){var o,s,a,n,i,d,l,c=e.table,g=e.$tbodies,p=[],u=e.cache;if(t.isEmptyObject(u))return e.appender?e.appender(c,p):c.isUpdating?e.$table.triggerHandler("updateComplete",c):"";for(t.debug(e,"core")&&(l=new Date),d=0;d1))for(n=1;n=0)for(r.sortVars[m].sortedBy=b,n=0;n1))for(n=1;n-1?"sorton":"";t.updateHeaderSortCount(r,o),t.setHeadersCss(r),r.delayInit&&t.isEmptyObject(r.cache)&&t.buildCache(r),r.$table.triggerHandler("sortBegin",i),t.multisort(r),t.appendCache(r,a),r.$table.triggerHandler("sortBeforeEnd",i),r.$table.triggerHandler("sortEnd",i),t.applyWidget(i),e.isFunction(s)&&s(i)},sortReset:function(r,o){r.sortList=[];var s;for(s=0;ss)return 1}for(o=e.replace(l.chunk,"\\0$1\\0").replace(l.chunks,"").split("\\0"),s=r.replace(l.chunk,"\\0$1\\0").replace(l.chunks,"").split("\\0"),d=Math.max(o.length,s.length),i=0;in)return 1}return 0},sortNaturalAsc:function(e,r,o,s){if(e===r)return 0;var a=t.string[s.empties[o]||s.emptyTo];return""===e&&0!==a?"boolean"==typeof a?a?-1:1:-a||-1:""===r&&0!==a?"boolean"==typeof a?a?1:-1:a||1:t.sortNatural(e,r)},sortNaturalDesc:function(e,r,o,s){if(e===r)return 0;var a=t.string[s.empties[o]||s.emptyTo];return""===e&&0!==a?"boolean"==typeof a?a?-1:1:a||1:""===r&&0!==a?"boolean"==typeof a?a?1:-1:-a||-1:t.sortNatural(r,e)},sortText:function(e,t){return e>t?1:e=0&&!0!==s&&l.widgets.splice(i,1),n&&n.remove&&(t.debug(l,"core")&&console.log((s?"Refreshing":"Removing")+' "'+o[a]+'" widget'),n.remove(r,l,l.widgetOptions,s),l.widgetInit[o[a]]=!1);l.$table.triggerHandler("widgetRemoveEnd",r)},refreshWidgets:function(r,o,s){var a,n,i=(r=e(r)[0]).config.widgets,d=t.widgets,l=d.length,c=[],g=function(t){e(t).triggerHandler("refreshComplete")};for(a=0;a-1)},isEmptyObject:function(e){for(var t in e)return!1;return!0},isValueInArray:function(e,t){var r,o=t&&t.length||0;for(r=0;r'),o=d.$table.width(),n=(a=d.$tbodies.find("tr:first").children(":visible")).length,i=0;i").css("width",s));d.$table.prepend(l)}},getData:function(t,r,o){var s,a,n="",i=e(t);return i.length?(s=!!e.metadata&&i.metadata(),a=" "+(i.attr("class")||""),void 0!==i.data(o)||void 0!==i.data(o.toLowerCase())?n+=i.data(o)||i.data(o.toLowerCase()):s&&void 0!==s[o]?n+=s[o]:r&&void 0!==r[o]?n+=r[o]:" "!==a&&a.match(" "+o+"-")&&(n=a.match(new RegExp("\\s"+o+"-([\\w-]+)"))[1]||""),e.trim(n)):""},getColumnData:function(t,r,o,s,a){if("object"!=typeof r||null===r)return r;var n,i=(t=e(t)[0]).config,d=a||i.$headers,l=i.$headerIndexed&&i.$headerIndexed[o]||d.find('[data-column="'+o+'"]:last');if(void 0!==r[o])return s?r[o]:r[d.index(l)];for(n in r)if("string"==typeof n&&l.filter(n).add(l.find(n)).length)return r[n]},isProcessing:function(r,o,s){var a=(r=e(r))[0].config,n=s||r.find("."+t.css.header);o?(void 0!==s&&a.sortList.length>0&&(n=n.filter(function(){return!this.sortDisabled&&t.isValueInArray(parseFloat(e(this).attr("data-column")),a.sortList)>=0})),r.add(n).addClass(t.css.processing+" "+a.cssProcessing)):r.add(n).removeClass(t.css.processing+" "+a.cssProcessing)},processTbody:function(t,r,o){if(t=e(t)[0],o)return t.isProcessing=!0,r.before('
").appendTo(l.$table.children("thead").eq(0)).children("td"),c=0;c").appendTo(n):((p=i.getColumnData(r,s.filter_formatter,c))?(s.filter_formatterCount++,(_=p(n,c))&&0===_.length&&(_=n.children("input")),_&&(0===_.parent().length||_.parent().length&&_.parent()[0]!==n[0])&&n.append(_)):_=e('').appendTo(n),_&&(g=d.data("placeholder")||d.attr("data-placeholder")||s.filter_placeholder.search||"",_.attr("placeholder",g))),_&&(u=(e.isArray(s.filter_cssFilter)?void 0!==s.filter_cssFilter[c]?s.filter_cssFilter[c]||"":"":s.filter_cssFilter)||"",_.addClass(a.filter+" "+u),(g=(u=s.filter_filterLabel).match(/{{([^}]+?)}}/g))||(g=["{{label}}"]),e.each(g,function(t,r){var i=new RegExp(r,"g"),a=d.attr("data-"+r.replace(/{{|}}/g,"")),l=void 0===a?d.text():a;u=u.replace(i,e.trim(l))}),_.attr({"data-column":n.attr("data-column"),"aria-label":u}),h&&(_.attr("placeholder","").addClass(a.filterDisabled)[0].disabled=!0)))},bindSearch:function(r,a,s){if(r=e(r)[0],(a=e(a)).length){var n,o=r.config,c=o.widgetOptions,d=o.namespace+"filter",f=c.filter_$externalFilters;!0!==s&&(n=c.filter_anyColumnSelector+","+c.filter_multipleColumnSelector,c.filter_$anyMatch=a.filter(n),f&&f.length?c.filter_$externalFilters=c.filter_$externalFilters.add(a):c.filter_$externalFilters=a,i.setFilters(r,o.$table.data("lastSearch")||[],!1===s)),n="keypress keyup keydown search change input ".split(" ").join(d+" "),a.attr("data-lastSearchTime",(new Date).getTime()).unbind(n.replace(i.regex.spaces," ")).bind("keydown"+d,function(e){if(e.which===l.escape&&!r.config.widgetOptions.filter_resetOnEsc)return!1}).bind("keyup"+d,function(a){c=r.config.widgetOptions;var s=parseInt(e(this).attr("data-column"),10),n="boolean"==typeof c.filter_liveSearch?c.filter_liveSearch:i.getColumnData(r,c.filter_liveSearch,s);if(void 0===n&&(n=c.filter_liveSearch.fallback||!1),e(this).attr("data-lastSearchTime",(new Date).getTime()),a.which===l.escape)this.value=c.filter_resetOnEsc?"":o.lastSearch[s];else{if(""!==this.value&&("number"==typeof n&&this.value.length=l.left&&a.which<=l.down)))return;if(!1===n&&""!==this.value&&a.which!==l.enter)return}t.searching(r,!0,!0,s)}).bind("search change keypress input blur ".split(" ").join(d+" "),function(a){var s=parseInt(e(this).attr("data-column"),10),n=a.type,d="boolean"==typeof c.filter_liveSearch?c.filter_liveSearch:i.getColumnData(r,c.filter_liveSearch,s);!r.config.widgetOptions.filter_initialized||a.which!==l.enter&&"search"!==n&&"blur"!==n&&("change"!==n&&"input"!==n||!0!==d&&(!0===d||"INPUT"===a.target.nodeName)||this.value===o.lastSearch[s])||(a.preventDefault(),e(this).attr("data-lastSearchTime",(new Date).getTime()),t.searching(r,"keypress"!==n,!0,s))})}},searching:function(e,r,a,l){var s,n=e.config.widgetOptions;void 0===l?s=!1:void 0===(s="boolean"==typeof n.filter_liveSearch?n.filter_liveSearch:i.getColumnData(e,n.filter_liveSearch,l))&&(s=n.filter_liveSearch.fallback||!1),clearTimeout(n.filter_searchTimer),void 0===r||!0===r?n.filter_searchTimer=setTimeout(function(){t.checkFilters(e,r,a)},s?n.filter_searchDelay:10):t.checkFilters(e,r,a)},equalFilters:function(t,r,i){var a,l=[],s=[],n=t.columns+1;for(r=e.isArray(r)?r:[],i=e.isArray(i)?i:[],a=0;a1?e.trim(t).split(/\s/):[e.trim(t)],n=s.length-1,o=0,c=i;for(n<1&&l>1&&(s[1]=s[0]);a.test(c);)c=c.replace(a,s[o++]||""),a.test(c)&&o(n=parseInt(l[1],10)||e.columns-1)&&(i=s,s=n,n=i),n>=e.columns&&(n=e.columns-1);s<=n;s++)h[h.length]=s;t=t.replace(a[d],"")}if(!r&&/,/.test(t))for(f=(o=t.split(/\s*,\s*/)).length,c=0;c-1})},multipleColumns:function(r,i){var a=r.widgetOptions,l=a.filter_initialized||!i.filter(a.filter_anyColumnSelector).length,s=e.trim(t.getLatestSearch(i).attr("data-column")||"");return t.findRange(r,s,!l)},processTypes:function(r,i,a){var l,s=null,n=null;for(l in t.types)e.inArray(l,a.excludeMatch)<0&&null===n&&null!==(n=t.types[l](r,i,a))&&(i.matchedOn=l,s=n);return s},matchType:function(e,t){var r,i=e.widgetOptions,l=e.$headerIndexed[t];return l.hasClass("filter-exact")?r=!1:l.hasClass("filter-match")?r=!0:(i.filter_columnFilters?l=e.$filters.find("."+a.filter).add(i.filter_$externalFilters).filter('[data-column="'+t+'"]'):i.filter_$externalFilters&&(l=i.filter_$externalFilters.filter('[data-column="'+t+'"]')),r=!!l.length&&"match"===e.widgetOptions.filter_matchType[(l[0].nodeName||"").toLowerCase()]),r},processRow:function(a,l,s){var n,o,c,d,f,h=a.widgetOptions,u=!0,p=h.filter_$anyMatch&&h.filter_$anyMatch.length,g=h.filter_$anyMatch&&h.filter_$anyMatch.length?t.multipleColumns(a,h.filter_$anyMatch):[];if(l.$cells=l.$row.children(),l.matchedOn=null,l.anyMatchFlag&&g.length>1||l.anyMatchFilter&&!p){if(l.anyMatch=!0,l.isMatch=!0,l.rowArray=l.$cells.map(function(t){if(e.inArray(t,g)>-1||l.anyMatchFilter&&!p)return l.parsed[t]?f=l.cacheArray[t]:(f=l.rawArray[t],f=e.trim(h.filter_ignoreCase?f.toLowerCase():f),a.sortLocaleCompare&&(f=i.replaceAccents(f))),f}).get(),l.filter=l.anyMatchFilter,l.iFilter=l.iAnyMatchFilter,l.exact=l.rowArray.join(" "),l.iExact=h.filter_ignoreCase?l.exact.toLowerCase():l.exact,l.cache=l.cacheArray.slice(0,-1).join(" "),s.excludeMatch=s.noAnyMatch,null!==(o=t.processTypes(a,l,s)))u=o;else if(h.filter_startsWith)for(u=!1,g=Math.min(a.columns,l.rowArray.length);!u&&g>0;)g--,u=u||0===l.rowArray[g].indexOf(l.iFilter);else u=(l.iExact+l.childRowText).indexOf(l.iFilter)>=0;if(l.anyMatch=!1,l.filters.join("")===l.filter)return u}for(g=0;g=0:l.filter===l.exact:(f=(l.iExact+l.childRowText).indexOf(t.parseFilter(a,l.iFilter,l)),n=!h.filter_startsWith&&f>=0||h.filter_startsWith&&0===f):n=o):n=o,u=!!n&&u);return u},findRows:function(a,l,s){if(!t.equalFilters(a.config,a.config.lastSearch,s)&&a.config.widgetOptions.filter_initialized){var n,o,c,d,f,h,u,p,g,m,b,y,_,v,w,x,S,C,z,$,F,R,T,k=e.extend([],l),H=a.config,A=H.widgetOptions,I=i.debug(H,"filter"),O={anyMatch:!1,filters:l,filter_regexCache:[]},E={noAnyMatch:["range","operators"],functions:[],excludeFilter:[],defaultColFilter:[],defaultAnyFilter:i.getColumnData(a,A.filter_defaultFilter,H.columns,!0)||""};for(O.parsed=[],g=0;g> Starting filter widget search",l),v=new Date),H.filteredRows=0,H.totalRows=0,s=k||[],u=0;u1&&(isNaN(F[0])?e.each(H.headerContent,function(e,t){t.toLowerCase().indexOf(F[0])>-1&&(l[R=e]=F[1])}):R=parseInt(F[0],10)-1,R>=0&&R> Searching through "+(C&&S> Completed search"+i.benchmark(v)),A.filter_initialized&&(H.$table.triggerHandler("filterBeforeEnd",H),H.$table.triggerHandler("filterEnd",H)),setTimeout(function(){i.applyWidget(H.table)},0)}},getOptionSource:function(r,a,l){var s=(r=e(r)[0]).config,n=!1,o=s.widgetOptions.filter_selectSource,c=s.$table.data("lastSearch")||[],d="function"==typeof o||i.getColumnData(r,o,a);if(l&&""!==c[a]&&(l=!1),!0===d)n=o(r,a,l);else{if(d instanceof e||"string"===e.type(d)&&d.indexOf("")>=0)return d;if(e.isArray(d))n=d;else if("object"===e.type(o)&&d&&null===(n=d(r,a,l)))return null}return!1===n&&(n=t.getOptions(r,a,l)),t.processOptions(r,a,n)},processOptions:function(t,r,a){if(!e.isArray(a))return!1;var l,s,n,o,c,d,f=(t=e(t)[0]).config,h=void 0!==r&&null!==r&&r>=0&&r'+(y.data("placeholder")||y.attr("data-placeholder")||b.filter_placeholder.select||"")+"",v=m.$table.find("thead").find("select."+a.filter+'[data-column="'+l+'"]').val();if(void 0!==s&&""!==s||null!==(s=t.getOptionSource(i,l,o))){if(e.isArray(s)){for(c=0;c"}else""+g!="[object Object]"&&(d=f=g=(""+g).replace(r.quote,"""),f.indexOf(b.filter_selectSourceSeparator)>=0&&(d=(h=f.split(b.filter_selectSourceSeparator))[0],f=h[1]),_+=""!==g?"":"");s=[]}u=(m.$filters?m.$filters:m.$table.children("thead")).find("."+a.filter),b.filter_$externalFilters&&(u=u&&u.length?u.add(b.filter_$externalFilters):b.filter_$externalFilters),(p=u.filter('select[data-column="'+l+'"]')).length&&(p[n?"html":"append"](_),e.isArray(s)||p.append(s).val(v),p.val(v))}}},buildDefault:function(e,r){var a,l,s,n=e.config,o=n.widgetOptions,c=n.columns;for(a=0;a1&&(c=c.slice(1)),n===h.columns&&(c=(d=c.filter(u.filter_anyColumnSelector)).length?d:c),c.val(l[n]).trigger("change"+h.namespace)):(f[n]=c.val()||"",n===h.columns?c.slice(1).filter('[data-column*="'+c.attr("data-column")+'"]').val(f[n]):c.slice(1).val(f[n])),n===h.columns&&c.length&&(u.filter_$anyMatch=c));return f},i.setFilters=function(r,a,l,s){var n=r?e(r)[0].config:"",o=i.getFilters(r,!0,a,s);return void 0===l&&(l=!0),n&&l&&(n.lastCombinedFilter=null,n.lastSearch=[],t.searching(n.table,a,s),n.$table.triggerHandler("filterFomatterUpdate")),0!==o.length}}(e),function(e,t){"use strict";function r(t,r){var i=isNaN(r.stickyHeaders_offset)?e(r.stickyHeaders_offset):[];return i.length?i.height()||0:parseInt(r.stickyHeaders_offset,10)||0}var i=e.tablesorter||{};e.extend(i.css,{sticky:"tablesorter-stickyHeader",stickyVis:"tablesorter-sticky-visible",stickyHide:"tablesorter-sticky-hidden",stickyWrap:"tablesorter-sticky-wrapper"}),i.addHeaderResizeEvent=function(t,r,i){if((t=e(t)[0]).config){var a={timer:250},l=e.extend({},a,i),s=t.config,n=s.widgetOptions,o=function(e){var t,r,i,a,l,o,c=s.$headers.length;for(n.resize_flag=!0,r=[],t=0;t=0&&!l.$table.hasClass("hasFilters"))){var n,o,c,d,f=l.$table,h=e(s.stickyHeaders_attachTo||s.stickyHeaders_appendTo),u=l.namespace+"stickyheaders ",p=e(s.stickyHeaders_yScroll||s.stickyHeaders_attachTo||t),g=e(s.stickyHeaders_xScroll||s.stickyHeaders_attachTo||t),m=f.children("thead:first").children("tr").not(".sticky-false").children(),b=f.children("tfoot"),y=r(l,s),_=f.parent().closest("."+i.css.table).hasClass("hasStickyHeaders")?f.parent().closest("table.tablesorter")[0].config.widgetOptions.$sticky.parent():[],v=_.length?_.height():0,w=s.$sticky=f.clone().addClass("containsStickyHeaders "+i.css.sticky+" "+s.stickyHeaders+" "+l.namespace.slice(1)+"_extra_table").wrap('
'),x=w.parent().addClass(i.css.stickyHide).css({position:h.length?"absolute":"fixed",padding:parseInt(w.parent().parent().css("padding-left"),10),top:y+v,left:0,visibility:"hidden",zIndex:s.stickyHeaders_zIndex||2}),S=w.children("thead:first"),C="",z=function(e,r){var i,a,l,s,n,o=e.filter(":visible"),c=o.length;for(i=0;in.top&&m thead:gt(0), tr.sticky-false").hide(),w.find("> tbody, > tfoot").remove(),w.find("caption").toggle(s.stickyHeaders_includeCaption),d=S.children().children(),w.css({height:0,width:0,margin:0}),d.find("."+i.css.resizer).remove(),f.addClass("hasStickyHeaders").bind("pagerComplete"+u,function(){F()}),i.bindEvents(a,S.children().children("."+i.css.header)),s.stickyHeaders_appendTo?e(s.stickyHeaders_appendTo).append(x):f.after(x),l.onRenderHeader)for(o=(c=S.children("tr").children()).length,n=0;n=0&&l.$filters&&l.$filters.eq(a).find("a, select, input").filter(":visible").focus())}),i.filter.bindSearch(f,d.find("."+i.css.filter)),s.filter_hideFilters&&i.filter.hideFilters(l,w)),s.stickyHeaders_addResizeEvent&&f.bind("resize"+l.namespace+"stickyheaders",function(){F()}),R(!0),f.triggerHandler("stickyHeadersInit")}},remove:function(r,a,l){var s=a.namespace+"stickyheaders ";a.$table.removeClass("hasStickyHeaders").unbind("pagerComplete resize filterEnd stickyHeadersUpdate ".split(" ").join(s).replace(/\s+/g," ")).next("."+i.css.stickyWrap).remove(),l.$sticky&&l.$sticky.length&&l.$sticky.remove(),e(t).add(l.stickyHeaders_xScroll).add(l.stickyHeaders_yScroll).add(l.stickyHeaders_attachTo).unbind("scroll resize ".split(" ").join(s).replace(/\s+/g," ")),i.addHeaderResizeEvent(r,!0)}})}(e,window),function(e,t){"use strict";var r=e.tablesorter||{};e.extend(r.css,{resizableContainer:"tablesorter-resizable-container",resizableHandle:"tablesorter-resizable-handle",resizableNoSelect:"tablesorter-disableSelection",resizableStorage:"tablesorter-resizable"}),e(function(){var t="";e("head").append(t)}),r.resizable={init:function(t,i){if(!t.$table.hasClass("hasResizable")){t.$table.addClass("hasResizable");var a,l,s,n,o=t.$table,c=o.parent(),d=parseInt(o.css("margin-top"),10),f=i.resizable_vars={useStorage:r.storage&&!1!==i.resizable,$wrap:c,mouseXPosition:0,$target:null,$next:null,overflow:"auto"===c.css("overflow")||"scroll"===c.css("overflow")||"auto"===c.css("overflow-x")||"scroll"===c.css("overflow-x"),storedSizes:[]};for(r.resizableReset(t.table,!0),f.tableWidth=o.width(),f.fullWidth=Math.abs(c.width()-f.tableWidth)<20,f.useStorage&&f.overflow&&(r.storage(t.table,"tablesorter-table-original-css-width",f.tableWidth),n=r.storage(t.table,"tablesorter-table-resized-width")||"auto",r.resizable.setWidth(o,n,!0)),i.resizable_vars.storedSizes=s=(f.useStorage?r.storage(t.table,r.css.resizableStorage):[])||[],r.resizable.setWidths(t,i,s),r.resizable.updateStoredSizes(t,i),i.$resizable_container=e('
').css({top:d}).insertBefore(o),l=0;l').appendTo(i.$resizable_container).attr({"data-column":l,unselectable:"on"}).data("header",a).bind("selectstart",!1);r.resizable.bindings(t,i)}},updateStoredSizes:function(e,t){var r,i,a=e.columns,l=t.resizable_vars;for(l.storedSizes=[],r=0;r=3.3?0:t.$table.position().left,s.each(function(){var s=e(this),o=parseInt(s.attr("data-column"),10),c=t.columns-1,d=s.data("header");d&&(!d.is(":visible")||!i.resizable_addLastColumn&&r.resizable.checkVisibleColumns(t,o)?s.hide():(o0){for(n.storedSizes[n.target]+=d,r.resizable.setWidth(n.$target,n.storedSizes[n.target],!0),l=0;l> Saving last sort: "+a.sortList+i.benchmark(n))):(o.addClass("hasSaveSort"),d="",i.storage&&(d=t(a),f&&console.log('saveSort >> Last sort loaded: "'+d+'"'+i.benchmark(n)),o.bind("saveSortReset",function(t){t.stopPropagation(),i.storage(e,"tablesorter-savesort","")})),s&&d&&d.length>0?a.sortList=d:e.hasInitialized&&d&&d.length>0&&r(a,d)&&i.sortOn(a,d))},remove:function(e,t){t.$table.removeClass("hasSaveSort"),i.storage&&i.storage(e,"tablesorter-savesort","")}})}(e),e.tablesorter}); \ No newline at end of file diff --git a/plugins/server/assets/js/tablesorter-custom.js b/plugins/server/assets/js/tablesorter-custom.js deleted file mode 100644 index a846ff7..0000000 --- a/plugins/server/assets/js/tablesorter-custom.js +++ /dev/null @@ -1,51 +0,0 @@ - - -$(document).on('rex:ready', function (event, container) { - - var projectManagerTablesorter = $("#rex-page-project-manager-server-overview .project_manager-tablesorter"); - - projectManagerTablesorter.tablesorter({ - theme : 'default', - widthFixed: true, - widgets: ["saveSort"], - widgetOptions: { - saveSort: true - }, - dateFormat: "dd-mm-yy", - headers: { - 0: { sorter: false}, - 6: { sorter: "shortDate", dateFormat: "dd-mm-yy" }, - 7: { sorter: 'text' }, - 8: { sorter: 'text' } - } - - }); - - $("#rex-page-project-manager-hosting-overview .project_manager-tablesorter").tablesorter({ - theme : 'default', - widthFixed: true, - widgets: ["saveSort"], - widgetOptions: { - saveSort: true - }, - dateFormat : "dd-mm-yy", - headers: { - 0: { sorter: false}, - 7: { sorter: "shortDate", dateFormat: "dd-mm-yy" } - } - }); - $("#rex-page-project-manager-pagespeed-overview .project_manager-tablesorter").tablesorter({ - theme : 'default', - widthFixed: true, - widgets: ["saveSort"], - widgetOptions: { - saveSort: true - }, - dateFormat : "dd-mm-yy", - headers: { - 0: { sorter: false}, - 4: { sorter: "shortDate", dateFormat: "dd-mm-yy" } - } - }); - -}); \ No newline at end of file diff --git a/plugins/server/boot.php b/plugins/server/boot.php deleted file mode 100644 index b7258e1..0000000 --- a/plugins/server/boot.php +++ /dev/null @@ -1,37 +0,0 @@ -isAvailable()) { - rex_cronjob_manager::registerType('rex_cronjob_project_manager_data'); - rex_cronjob_manager::registerType('rex_cronjob_project_manager_favicon'); -} - -// CSS und JavaScript einbinden - -if (rex::isBackend() && is_object(rex::getUser())) { - //rex_view::addJsFile($this->getAssetsUrl('js/project-manager-server.js')); -} - -if (rex::isBackend() && is_object(rex::getUser())) { - - if (rex::getUser()->hasPerm('project_manager_server[]')) { - // set as start page to server if perm is ok - rex_extension::register('PAGES_PREPARED', function (rex_extension_point $ep) { - $pages = $ep->getSubject(); - $pages[$this->getAddOn()->getName()]->setHref(rex_url::backendPage($this->getProperty('package'))); - $ep->setSubject($pages); - }, rex_extension::LATE); - } -} - -if (rex::isBackend() && is_object(rex::getUser())) { - rex_perm::register('project_manager_server[]'); -} - -rex_view::addCssFile($this->getAssetsUrl('css/bootstrap-tagsinput.css')); -rex_view::addCssFile($this->getAssetsUrl('css/theme.default.min.css')); -rex_view::addCssFile($this->getAssetsUrl('css/theme.css')); -rex_view::addJsFile($this->getAssetsUrl('js/bootstrap-tagsinput.js')); -rex_view::addJsFile($this->getAssetsUrl('js/jquery.tablesorter.combined.min.js')); -rex_view::addJsFile($this->getAssetsUrl('js/tablesorter-custom.js')); -rex_view::addJsFile($this->getAssetsUrl('js/custom.js')); - diff --git a/plugins/server/install.php b/plugins/server/install.php deleted file mode 100644 index 3f017ec..0000000 --- a/plugins/server/install.php +++ /dev/null @@ -1,94 +0,0 @@ -ensurePrimaryIdColumn() -->ensureColumn(new rex_sql_column('name', 'varchar(255)', true)) -->ensureColumn(new rex_sql_column('domain', 'varchar(255)', true)) -->ensureColumn(new rex_sql_column('tags', 'text', true)) -->ensureColumn(new rex_sql_column('api_key', 'varchar(255)', true)) -->ensureColumn(new rex_sql_column('param', 'text', true)) -->ensureColumn(new rex_sql_column('is_ssl', 'tinyint', true)) -->ensureColumn(new rex_sql_column('description', 'text')) -->ensureColumn(new rex_sql_column('cms', 'tinyint', true)) -->ensureColumn(new rex_sql_column('maintenance', 'tinyint', true)) -->ensureColumn(new rex_sql_column('status', 'text')) -->ensureColumn(new rex_sql_column('createdate', 'timestamp', false, '0000-00-00 00:00:00')) -->ensureColumn(new rex_sql_column('updatedate', 'timestamp', false, '0000-00-00 00:00:00', 'on update CURRENT_TIMESTAMP')) -->removeColumn('logdate') -->ensure(); - -rex_sql_table::get(rex::getTable('project_manager_logs')) - ->ensurePrimaryIdColumn() - ->ensureColumn(new rex_sql_column('domain_id', 'int(10) unsigned', false)) - ->ensureForeignKey(new rex_sql_foreign_key('domain_id', rex::getTable('project_manager_domain'), ['domain_id' => 'id'])) - ->ensureColumn(new rex_sql_column('raw', 'longtext')) - ->ensureColumn(new rex_sql_column('createdate', 'timestamp', false, '0000-00-00 00:00:00', 'default CURRENT_TIMESTAMP')) - ->ensure(); - - -// Create cronjob -$now = new DateTime(); -$startdate = date('Y-m-d 00:00:00',strtotime( "tomorrow" )); - -$cronjob = rex_sql::factory(); -$cronjob->setDebug(false); -$cronjob->setQuery('SELECT id FROM '.rex::getTable('cronjob'). ' WHERE type LIKE "rex_cronjob_project_manager_data"'); - -if ($cronjob->getRows() == 0) { - - $cronjob = rex_sql::factory(); - $cronjob->setDebug(false); - $cronjob->setTable(rex::getTable('cronjob')); - $cronjob->setValue('name','Projekt Manager: Domaindaten'); - $cronjob->setValue('description',''); - $cronjob->setValue('type','rex_cronjob_project_manager_data'); - $cronjob->setValue('interval','{"minutes":[0],"hours":[0],"days":"all","weekdays":"all","months":"all"}'); - $cronjob->setValue('environment','|backend|'); - $cronjob->setValue('execution_start','1970-01-01 01:00:00'); - $cronjob->setValue('status','1'); - $cronjob->setValue('parameters','[]'); - $cronjob->setValue('nexttime',$startdate); - $cronjob->setValue('createdate',$now->format('Y-m-d H:i:s')); - $cronjob->setValue('updatedate',$now->format('Y-m-d H:i:s')); - $cronjob->setValue('createuser',rex::getUser()->getLogin()); - $cronjob->setValue('updateuser',rex::getUser()->getLogin()); - - try { - $cronjob->insertOrUpdate(); - echo rex_view::success('Der Cronjob "Projekt Manager: Domaindaten" wurde angelegt. '); - } catch (rex_sql_exception $e) { - echo rex_view::warning('Der Cronjob "Projekt Manager: Domaindaten" wurde nicht angelegt.
Wahrscheinlich existiert er schon.'); - } -} - -$cronjob = rex_sql::factory(); -$cronjob->setDebug(false); -$cronjob->setQuery('SELECT id FROM '.rex::getTable('cronjob'). ' WHERE type LIKE "rex_cronjob_project_manager_favicon"'); - -if ($cronjob->getRows() == 0) { - - $cronjob = rex_sql::factory(); - $cronjob->setDebug(false); - $cronjob->setTable(rex::getTable('cronjob')); - $cronjob->setValue('name','Projekt Manager: Favicon'); - $cronjob->setValue('description',''); - $cronjob->setValue('type','rex_cronjob_project_manager_favicon'); - $cronjob->setValue('interval','{"minutes":[0],"hours":[0],"days":"all","weekdays":"all","months":"all"}'); - $cronjob->setValue('environment','|backend|'); - $cronjob->setValue('execution_start','1970-01-01 01:00:00'); - $cronjob->setValue('status','1'); - $cronjob->setValue('parameters','[]'); - $cronjob->setValue('nexttime',$startdate); - $cronjob->setValue('createdate',$now->format('Y-m-d H:i:s')); - $cronjob->setValue('updatedate',$now->format('Y-m-d H:i:s')); - $cronjob->setValue('createuser',rex::getUser()->getLogin()); - $cronjob->setValue('updateuser',rex::getUser()->getLogin()); - - try { - $cronjob->insertOrUpdate(); - echo rex_view::success('Der Cronjob "Projekt Manager: Favicons" wurde angelegt. '); - } catch (rex_sql_exception $e) { - echo rex_view::warning('Der Cronjob "Projekt Manager: Favicons" wurde nicht angelegt.
Wahrscheinlich existiert er schon.'); - } -} \ No newline at end of file diff --git a/plugins/server/lang/de_de.lang b/plugins/server/lang/de_de.lang deleted file mode 100644 index 0327904..0000000 --- a/plugins/server/lang/de_de.lang +++ /dev/null @@ -1,84 +0,0 @@ -project_manager_server_menu_entry = Projekte - -#view -project_manager_server_projects = Projekte -project_manager_server_overview = Übersicht -project_manager_server_config = Einstellungen -project_manager_server_domain = Domain -project_manager_server_api_key = API-Schlüssel -project_manager_server_cms = REDAXO Hauptversion -project_manager_server_update_content = Letzte Änderung - -project_manager_server_updates_necessary = gefunden -project_manager_server_updates = Updates -project_manager_pm_client_version = Client -project_manager_server_php_version = PHP -project_manager_server_cms_version = Version -project_manager_server_syslog = Syslog -project_manager_server_is_ssl = SSL -project_manager_server_select_project = Projekt wählen -project_manager_server_syslog_code_1 = Keine Syslog Einträge -project_manager_server_syslog_code_2 = Syslog Einträge vorhanden -project_manager_server_status_code_0 = Falscher API-Schlüssel -project_manager_server_status_code_1 = Status Ok -project_manager_server_status_code_minus_1 = Abruf fehlerhaft -project_manager_server_maintenance_0 = Kein Wartungsvertrag -project_manager_server_maintenance_1 = Wartungsvertrag vorhanden -project_manager_server_maintenance_2 = Keine Info über Wartungsvertrag - - -#add -project_manager_add_domain = Domain hinzufügen -project_manager_server_project_added = Projekt hinzugefügt -project_manager_server_no_name_defined = Bitte Projektnamen eingeben! -project_manager_server_name_already_defined = Projektname existiert bereits! -project_manager_server_no_domain_defined = Bitte Domain eingeben! -project_manager_server_domain_already_defined = Domain existiert bereits! - -#del -project_manager_server_project_deleted = Projekt gelöscht - -project_manager_server_name = Projektname - -#edit -project_manager_server_edit_domain = Domain editieren -project_manager_server_name_info = Bitte Namen des Projekts eingeben! -project_manager_server_domain_info = Bitte Domain des Projekts eingeben! -project_manager_server_api_key_info = API-Schlüssel -project_manager_server_api_key_notice = Redaxo 5 API-Schlüssel, z.B. 83f15d69755585c3a825c3eccf2d654fc6578dadb7e05475, bei Redaxo 4 Instanzen legacy -project_manager_server_param = Parameter -project_manager_server_param_notice = Optionale Paramenter, z.B. param1=value1,param2=value2 -project_manager_server_ssl = SSL Verbindung -project_manager_server_tags = Tags -project_manager_server_maintenance = Wartungsvertrag? -project_manager_server_maintenance_short = WV - -#detail -project_manager_server_project_detail = Details -project_manager_server_project_choose = Projekt wählen - -project_manager_cronjob_favicon_name = Projekt Manager: Hole Favicon -project_manager_cronjob_data_name = Projekt Manager: Hole Domaindaten - -perm_general_project_manager_server[] = project_manager_server[] - Rechte für Projekt Manager Server Konfiguration - - -#config -project_manager_server_title = Einstellungen -project_manager_server_min_headline = Mindestanforderungen -project_manager_server_php_min = PHP Version -project_manager_server_cms_4_min = Redaxo 4 Version -project_manager_server_cms_min = Redaxo 5 Version -project_manager_server_config_saved_successful = Einstellungen gespeichert! -project_manager_server_min_color = Farbe -project_manager_server_color_notice = Farbe bitte als HEX #F1F1F1 oder als RGBA angeben rgba(0,0,0,0.1) -project_manager_server_configuration = Einstellungen -project_manager_server_skip_addon = Addons ausschließen -project_manager_server_skip_addon_version = Versionen ausschließen -project_manager_server_skip_addon_notice = Addon wird bei der Prüfung nicht berücksichtigt. z.B. structure_tweaks, modulsammlung -project_manager_server_skip_addon_version_notice = Addonversion wird bei der Prüfung nicht berücksichtigt. z.B. beta, dev, rc - - -#validate -no_name_defined = Kein Projektname angegeben! -no_domain_defined = Keine Domain angegeben! \ No newline at end of file diff --git a/plugins/server/lang/en_gb.lang b/plugins/server/lang/en_gb.lang deleted file mode 100644 index 8f992e3..0000000 --- a/plugins/server/lang/en_gb.lang +++ /dev/null @@ -1,79 +0,0 @@ -project_manager_server_menu_entry = Projects - -#view -project_manager_server_projects = Projects -project_manager_server_overview = Overview -project_manager_server_config = Settings -project_manager_server_domain = Domain -project_manager_server_api_key = API key -project_manager_server_cms = REDAXO main version -project_manager_server_update_content = Latest change - -project_manager_server_updates_necessary = found -project_manager_server_updates = Updates -project_manager_pm_client_version = Client -project_manager_server_php_version = PHP -project_manager_server_cms_version = Version -project_manager_server_syslog = Syslog -project_manager_server_is_ssl = SSL -project_manager_server_select_project = Choose project -project_manager_server_syslog_code_1 = No Syslog entries -project_manager_server_syslog_code_2 = Syslog entries found -project_manager_server_status_code_0 = Wrong API key -project_manager_server_status_code_1 = Status Ok -project_manager_server_status_code_minus_1 = JSON Error - -#add -project_manager_add_domain = Add domain -project_manager_server_project_added = Project added -project_manager_server_no_name_defined = Please enter a project name! -project_manager_server_name_already_defined = Project already exists -project_manager_server_no_domain_defined = Please enter a project domain! -project_manager_server_domain_already_defined = Domain already exists - -#del -project_manager_server_project_deleted = Project deleted - -project_manager_server_name = Project name - -#edit -project_manager_server_edit_domain = Edit domain -project_manager_server_name_info = Please enter a project name -project_manager_server_domain_info = Please enter a project domain -project_manager_server_api_key_info = API key -project_manager_server_api_key_notice = Redaxo 5 API key, ex.: 83f15d69755585c3a825c3eccf2d654fc6578dadb7e05475, for Redaxo 4 instances legacy -project_manager_server_param = Parameter -project_manager_server_param_notice = Paramenter, ex.: param1=value1,param2=value2 -project_manager_server_ssl = SSL connection -project_manager_server_tags = Tags -project_manager_server_maintenance = Maintenance contract? - -#detail -project_manager_server_project_detail = Details -project_manager_server_project_choose = Choose project - -project_manager_cronjob_favicon_name = Project Manager: fetch favicon -project_manager_cronjob_data_name = Project Manager: fetch domain data - -perm_general_project_manager_server[] = project_manager_server[] - Rights for Project Manager Server configuration - - -#config -project_manager_server_title = Settings -project_manager_server_min_headline = Minimum requirement -project_manager_server_php_min = PHP Version -project_manager_server_cms_4_min = Redaxo 4 Version -project_manager_server_cms_min = Redaxo 5 Version -project_manager_server_config_saved_successful = Configuration saved! -project_manager_server_min_color = Color -project_manager_server_color_notice = Please set color as HEX #F1F1F1 or as RGBA rgba(0,0,0,0.1) -project_manager_server_configuration = Configuration -project_manager_server_skip_addon = Skip Addon -project_manager_server_skip_addon_version = Skip Version -project_manager_server_skip_addon_notice = Addon is not included in the check. e.g. structure_tweaks, modulsammlung -project_manager_server_skip_addon_version_notice = Addonversion is not included in the check. e.g. beta, dev, rc - - -#validate -no_name_defined = No project name entered! -no_domain_defined = No domain name entered! \ No newline at end of file diff --git a/plugins/server/lang/es_es.lang b/plugins/server/lang/es_es.lang deleted file mode 100644 index af9d046..0000000 --- a/plugins/server/lang/es_es.lang +++ /dev/null @@ -1,71 +0,0 @@ -project_manager_server_menu_entry = - -#view -project_manager_server_projects = -project_manager_server_overview = -project_manager_server_config = -project_manager_server_domain = -project_manager_server_api_key = -project_manager_server_cms = -project_manager_server_update_content = - -project_manager_server_updates_necessary = -project_manager_server_updates = -project_manager_pm_client_version = -project_manager_server_php_version = -project_manager_server_cms_version = -project_manager_server_syslog = -project_manager_server_is_ssl = -project_manager_server_maintenance = -project_manager_server_select_project = - -#add -project_manager_add_domain = -project_manager_server_project_added = -project_manager_server_domain_already_defined = - -#del -project_manager_server_project_deleted = - -project_manager_server_name = - -#edit -project_manager_server_edit_domain = -project_manager_server_name_info = -project_manager_server_domain_info = -project_manager_server_api_key_info = -project_manager_server_api_key_notice = -project_manager_server_param = -project_manager_server_param_notice = -project_manager_server_ssl = -project_manager_server_tags = - -#detail -project_manager_server_project_detail = -project_manager_server_project_choose = - -project_manager_cronjob_favicon_name = -project_manager_cronjob_data_name = - -perm_general_project_manager_server[] = - - -#config -project_manager_server_title = -project_manager_server_min_headline = -project_manager_server_php_min = -project_manager_server_cms_4_min = -project_manager_server_cms_min = -project_manager_server_config_saved_successful = -project_manager_server_min_color = -project_manager_server_color_notice = -project_manager_server_configuration = -project_manager_server_skip_addon = -project_manager_server_skip_addon_version = -project_manager_server_skip_addon_notice = -project_manager_server_skip_addon_version_notice = - - -#validate -no_name_defined = ¡No se ha especificado el nombre del proyecto! -no_domain_defined = ¡Ningún dominio especificado! \ No newline at end of file diff --git a/plugins/server/lang/pt_br.lang b/plugins/server/lang/pt_br.lang deleted file mode 100644 index fed2d11..0000000 --- a/plugins/server/lang/pt_br.lang +++ /dev/null @@ -1,9 +0,0 @@ -documentation_menu_entry = Documentação - -documentation_navigation_title = Navegação [ main_navi.md ] -documentation_content_title = Conteúdo [ {0} ] - -documentation_noparser = Nenhum analisador Markdown disponível! Instale primeiro um analisador (AddOn markitup or textile) - -documentation_navinotfound = Arquivo de navegação {0} não localizado!
Este arquivo é necessário! -documentation_filenotfound = Arquivo {0} não localizado. Conteúdos não existem (ainda)

Ficaríamos felizes se você quisesse ajudar: {1} diff --git a/plugins/server/lang/sv_se.lang b/plugins/server/lang/sv_se.lang deleted file mode 100644 index 04aab1f..0000000 --- a/plugins/server/lang/sv_se.lang +++ /dev/null @@ -1,75 +0,0 @@ -project_manager_server_menu_entry = Projekter - -#view -project_manager_server_projects = Projekter -project_manager_server_overview = Översikt -project_manager_server_config = Inställnigar -project_manager_server_domain = Domän -project_manager_server_api_key = API-key -project_manager_server_cms = REDAXO huvudversion -project_manager_server_update_content = Senaste ändring - -project_manager_server_updates_necessary = hittat -project_manager_server_updates = Updates -project_manager_pm_client_version = Client -project_manager_server_php_version = PHP -project_manager_server_cms_version = Version -project_manager_server_syslog = Syslog -project_manager_server_is_ssl = SSL -project_manager_server_select_project = Välj projekt - -#add -project_manager_add_domain = Tillfoga domän -project_manager_server_project_added = Projektet lagt till -project_manager_server_no_name_defined = Vänligen ange ett projektnamn! -project_manager_server_name_already_defined = Projektnamnet finns redan! -project_manager_server_no_domain_defined = Vänligen ange domänen! -project_manager_server_domain_already_defined = Domänen finns redan! - -#del -project_manager_server_project_deleted = Projektet raderades - -project_manager_server_name = Projketnamn - -#edit -project_manager_server_edit_domain = Redigera domän -project_manager_server_name_info = Vänligen ange projektets namn! -project_manager_server_domain_info = Vänligen ange projektets domän! -project_manager_server_api_key_info = API-nyckel -project_manager_server_api_key_notice = Redaxo 5 API-nyckel, t.ex. 83f15d69755585c3a825c3eccf2d654fc6578dadb7e05475 , för Redaxo 4 instanser legacy -project_manager_server_param = Parameter -project_manager_server_param_notice = Paramenter, t.ex. param1=value1,param2=value2 -project_manager_server_ssl = SSL förbindelse -project_manager_server_tags = Tags -project_manager_server_maintenance = Underhåll -project_manager_server_maintenance_short = WV - -#detail -project_manager_server_project_detail = Detaljer -project_manager_server_project_choose = Välj projekt - -project_manager_cronjob_favicon_name = Projekt Manager: hämta Favicon -project_manager_cronjob_data_name = Projekt Manager: Hämta Domänuppgifter - -perm_general_project_manager_server[] = project_manager_server [] - Project Manager Server Configurations rättigheter - - -#config -project_manager_server_title = Inställningar -project_manager_server_min_headline = minimikrav -project_manager_server_php_min = PHP version -project_manager_server_cms_4_min = Redaxo 4 version -project_manager_server_cms_min = Redaxo 5 version -project_manager_server_config_saved_successful = Inställningarna sparades! -project_manager_server_min_color = Färg -project_manager_server_color_notice = Vänligen ange färg som HEX # F1F1F1 eller som RGBA rgba (0,0,0,0.1) -project_manager_server_configuration = Inställningar -project_manager_server_skip_addon = Uteslut tillägg -project_manager_server_skip_addon_version = Uteslut versioner -project_manager_server_skip_addon_notice = Addon prövas inte. t.ex. struktur_tweaks, modulsamling -project_manager_server_skip_addon_version_notice = Addon-versionen kommer inte att beaktas under testet. t.ex. beta, dev, rc - - -#validate -no_name_defined = Inget projektnamn har angetts! -no_domain_defined = Ingen domän har angetts! \ No newline at end of file diff --git a/plugins/server/lib/project-manager-favicon.cronjob.php b/plugins/server/lib/project-manager-favicon.cronjob.php deleted file mode 100644 index 2477541..0000000 --- a/plugins/server/lib/project-manager-favicon.cronjob.php +++ /dev/null @@ -1,175 +0,0 @@ -setDebug(0)->getArray("SELECT * FROM " . rex::getTable('project_manager_domain') . " ORDER BY updatedate asc "); - $multi_curl = curl_multi_init(); - $ch = []; - - foreach($domains as $domain) { - - $ssl = $domain['is_ssl']; - $protocol = ($ssl == 1) ? "https://" : "http://"; - $ch[$domain['domain']] = curl_init(); - $fp[$domain['domain']] = fopen(rex_path::pluginAssets('project_manager', 'server', 'favicon/'.$domain['domain'].'.png'), 'w+'); - //curl_setopt($ch[$domain['domain']], CURLOPT_URL, "https://www.google.com/s2/u/0/favicons?domain=".$domain['domain']."&sz=64"); - - $faviconUrl = self::getFavicon($protocol.$domain['domain']); - - if (is_array($faviconUrl)) { - $favicon = $faviconUrl[0]; - } else { - $favicon = $faviconUrl; - } - - if ($favicon == 'FALSE') - $favicon = rex::getServer().'/assets/addons/project_manager/plugins/server/favicon/redaxo-favicon.png'; - - curl_setopt($ch[$domain['domain']], CURLOPT_URL, $favicon); - - curl_setopt($ch[$domain['domain']], CURLOPT_FOLLOWLOCATION, true); - curl_setopt($ch[$domain['domain']], CURLOPT_HEADER, 0); - curl_setopt($ch[$domain['domain']], CURLOPT_FILE, $fp[$domain['domain']]); - curl_multi_add_handle($multi_curl,$ch[$domain['domain']]); - - } - $active = null; - do { - curl_multi_exec($multi_curl, $active); - } while ($active > 0); - - foreach($domains as $domain) { - curl_multi_remove_handle($multi_curl,$ch[$domain['domain']]); - fwrite($fp[$domain['domain']], ""); - fclose($fp[$domain['domain']]); - } - - curl_multi_close($multi_curl); - - return true; - - } - public function getTypeName() - { - return rex_i18n::msg('project_manager_cronjob_favicon_name'); - } - - public function getParamFields() - { - return []; - } - - public function getFavicon ($url) { - - $file_headers = @get_headers($url); - $found = FALSE; - // 1. CHECK THE DOM FOR THE TAG - // check if the url exists - if the header returned is not 404 - if($file_headers[0] != 'HTTP/1.1 404 Not Found') { - $dom = new DOMDocument(); - $dom->strictErrorChecking = FALSE; - @$dom->loadHTMLfile($url); //@ to discard all the warnings of malformed htmls - if (!$dom) { - // $error[]='Error parsing the DOM of the file'; - } else { - - if (!is_null($dom->baseURI)) - $domxml = simplexml_import_dom($dom); - - if ($domxml) { - - //check for the historical rel="shortcut icon" - if ($domxml->xpath('//link[@rel="shortcut icon"]')) { - $path = $domxml->xpath('//link[@rel="shortcut icon"]'); - $faviconURL = $path[0]['href']; - # check if absolute url or relative path - $favicon_elems = parse_url($faviconURL); - # if relative - if(!isset($favicon_elems['host'])){ - $faviconURL = $url . $faviconURL; - } - - $favicon_headers = @get_headers($faviconURL); - if (is_array($favicon_headers)) { - if(!in_array('HTTP/1.1 404 Not Found', $favicon_headers)) { - $found == TRUE; - return $faviconURL; - } - } - - //check for the HTML5 rel="icon" - } else if ($domxml->xpath('//link[@rel="icon"]')) { - $path = $domxml->xpath('//link[@rel="icon"]'); - $faviconURL = $path[0]['href']; - # check if absolute url or relative path - $favicon_elems = parse_url($faviconURL); - # if relative - if(!isset($favicon_elems['host'])){ - $faviconURL = $url . $faviconURL; - } - - $favicon_headers = @get_headers($faviconURL); - if (is_array($favicon_headers)) { - if(!in_array('HTTP/1.1 404 Not Found', $favicon_headers)) { - $found == TRUE; - return $faviconURL; - } - } - - } else { - //$error[]="The URL does not contain a favicon tag."; - } - - if ($found == FALSE) return 'FALSE'; - - } - - - } - - - // 2. CHECK DIRECTLY FOR favicon.ico OR favicon.png FILE - // the two seem to be most common - if ($found == FALSE) { - $parse = parse_url($url); - $favicon_headers = @get_headers("http://".$parse['host']."/favicon.ico"); - if($favicon_headers[0] != 'HTTP/1.1 404 Not Found') { - $faviconURL = "/favicon.ico"; - $favicon_elems = parse_url($faviconURL); - # if relative - if(!isset($favicon_elems['host'])){ - $faviconURL = $url . $faviconURL; - } - $found == TRUE; - return $faviconURL; - } - $favicon_headers = @get_headers("http://".$parse['host']."/favicon.png"); - if($favicon_headers[0] != 'HTTP/1.1 404 Not Found') { - $faviconURL = "/favicon.png"; - $favicon_elems = parse_url($faviconURL); - # if relative - if(!isset($favicon_elems['host'])){ - $faviconURL = $url . $faviconURL; - } - $found == TRUE; - return $faviconURL; - } - if ($found == FALSE) { - //$error[]= "Files favicon.ico and .png do not exist on the server's root."; - } - } - // if the URL does not exists ... - } else { - // $error[]="URL does not exist"; - } - - if ($found == FALSE && isset($error) ) { - return $error; - } - } -} -?> \ No newline at end of file diff --git a/plugins/server/lib/project-manager-favicon.cronjob.txt b/plugins/server/lib/project-manager-favicon.cronjob.txt deleted file mode 100644 index 90269f6..0000000 --- a/plugins/server/lib/project-manager-favicon.cronjob.txt +++ /dev/null @@ -1,173 +0,0 @@ -setDebug(0)->getArray("SELECT * FROM " . rex::getTable('project_manager_domain') . " ORDER BY updatedate asc "); - $multi_curl = curl_multi_init(); - $ch = []; - - foreach($domains as $domain) { - - $ssl = $domain['is_ssl']; - $protocol = ($ssl == 1) ? "https://" : "http://"; - $ch[$domain['domain']] = curl_init(); - $fp[$domain['domain']] = fopen(rex_path::pluginAssets('project_manager', 'server', 'favicon/'.$domain['domain'].'.png'), 'w+'); - //curl_setopt($ch[$domain['domain']], CURLOPT_URL, "https://www.google.com/s2/u/0/favicons?domain=".$domain['domain']."&sz=64"); - - $faviconUrl = self::getFavicon($protocol.$domain['domain']); - - if (is_array($faviconUrl)) { - $favicon = $faviconUrl[0]; - } else { - $favicon = $faviconUrl; - } - - if ($favicon == 'FALSE') - $favicon = rex::getServer().'/assets/addons/project_manager/plugins/server/favicon/redaxo-favicon.png'; - - curl_setopt($ch[$domain['domain']], CURLOPT_URL, $favicon); - - curl_setopt($ch[$domain['domain']], CURLOPT_FOLLOWLOCATION, true); - curl_setopt($ch[$domain['domain']], CURLOPT_HEADER, 0); - curl_setopt($ch[$domain['domain']], CURLOPT_FILE, $fp[$domain['domain']]); - curl_multi_add_handle($multi_curl,$ch[$domain['domain']]); - - } - $active = null; - do { - curl_multi_exec($multi_curl, $active); - } while ($active > 0); - - foreach($domains as $domain) { - curl_multi_remove_handle($multi_curl,$ch[$domain['domain']]); - fwrite($fp[$domain['domain']], ""); - fclose($fp[$domain['domain']]); - } - - curl_multi_close($multi_curl); - - return true; - - } - public function getTypeName() - { - return rex_i18n::msg('project_manager_cronjob_favicon_name'); - } - - public function getParamFields() - { - return []; - } - - public function getFavicon ($url) { - - $file_headers = @get_headers($url); - $found = FALSE; - // 1. CHECK THE DOM FOR THE TAG - // check if the url exists - if the header returned is not 404 - if($file_headers[0] != 'HTTP/1.1 404 Not Found') { - $dom = new DOMDocument(); - $dom->strictErrorChecking = FALSE; - @$dom->loadHTMLfile($url); //@ to discard all the warnings of malformed htmls - if (!$dom) { - // $error[]='Error parsing the DOM of the file'; - } else { - $domxml = simplexml_import_dom($dom); - - if ($domxml) { - - //check for the historical rel="shortcut icon" - if ($domxml->xpath('//link[@rel="shortcut icon"]')) { - $path = $domxml->xpath('//link[@rel="shortcut icon"]'); - $faviconURL = $path[0]['href']; - # check if absolute url or relative path - $favicon_elems = parse_url($faviconURL); - # if relative - if(!isset($favicon_elems['host'])){ - $faviconURL = $url . $faviconURL; - } - - $favicon_headers = @get_headers($faviconURL); - if(!in_array('HTTP/1.1 404 Not Found', $favicon_headers)) { - $found == TRUE; - return $faviconURL; - } - - //check for the HTML5 rel="icon" - } else if ($domxml->xpath('//link[@rel="icon"]')) { - $path = $domxml->xpath('//link[@rel="icon"]'); - $faviconURL = $path[0]['href']; - # check if absolute url or relative path - $favicon_elems = parse_url($faviconURL); - # if relative - if(!isset($favicon_elems['host'])){ - $faviconURL = $url . $faviconURL; - } - - $favicon_headers = @get_headers($faviconURL); - if(!in_array('HTTP/1.1 404 Not Found', $favicon_headers)) { - $found == TRUE; - return $faviconURL; - } - - } else { - //$error[]="The URL does not contain a favicon tag."; - } - - if ($found == FALSE) return 'FALSE'; - - - } - - - } - - - - - - // 2. CHECK DIRECTLY FOR favicon.ico OR favicon.png FILE - // the two seem to be most common - if ($found == FALSE) { - $parse = parse_url($url); - $favicon_headers = @get_headers("http://".$parse['host']."/favicon.ico"); - if($favicon_headers[0] != 'HTTP/1.1 404 Not Found') { - $faviconURL = "/favicon.ico"; - $favicon_elems = parse_url($faviconURL); - # if relative - if(!isset($favicon_elems['host'])){ - $faviconURL = $url . $faviconURL; - } - $found == TRUE; - return $faviconURL; - } - $favicon_headers = @get_headers("http://".$parse['host']."/favicon.png"); - if($favicon_headers[0] != 'HTTP/1.1 404 Not Found') { - $faviconURL = "/favicon.png"; - $favicon_elems = parse_url($faviconURL); - # if relative - if(!isset($favicon_elems['host'])){ - $faviconURL = $url . $faviconURL; - } - $found == TRUE; - return $faviconURL; - } - if ($found == FALSE) { - //$error[]= "Files favicon.ico and .png do not exist on the server's root."; - } - } - // if the URL does not exists ... - } else { - // $error[]="URL does not exist"; - } - - if ($found == FALSE && isset($error) ) { - return $error; - } - } -} -?> \ No newline at end of file diff --git a/plugins/server/lib/project-manager-logger.php b/plugins/server/lib/project-manager-logger.php deleted file mode 100644 index cfdadd7..0000000 --- a/plugins/server/lib/project-manager-logger.php +++ /dev/null @@ -1,40 +0,0 @@ -add($data); - } - - public static function getPath($domain) - { - return rex_path::log('project_manager_'.$domain.'_last.log'); - } - - public static function deleteFile($domain) - { - rex_file::delete(rex_path::log('project_manager_'.$domain.'_last.log'));; - } - - public static function close() - { - self::$logfile = null; - self::$init = false; - } -} \ No newline at end of file diff --git a/plugins/server/lib/project-manager.cronjob.php b/plugins/server/lib/project-manager.cronjob.php deleted file mode 100644 index 3f49b6a..0000000 --- a/plugins/server/lib/project-manager.cronjob.php +++ /dev/null @@ -1,136 +0,0 @@ -setDebug(0)->getArray('SELECT * FROM ' . rex::getTable('project_manager_domain') . ' ORDER BY updatedate asc'); - - /* Addon-Abruf */ - $multi_curl = curl_multi_init(); - $resps = array(); - $options = array( - CURLOPT_FOLLOWLOCATION => true, - CURLOPT_AUTOREFERER => true, - CURLOPT_MAXREDIRS => 5, - CURLOPT_HEADER => false, - CURLOPT_SSL_VERIFYPEER => true, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0', - CURLOPT_TIMEOUT => 5 // seconds - ); - foreach($websites as $website) { - - $domain = $website['domain']; - $cms = $website['cms']; - $ssl = $website['is_ssl']; - $param = $website['param']; - $param = explode(',', $param); - $param = '&'.implode('&', $param); - $protocol = ($ssl == 1) ? "https://" : "http://"; - - $timestamp = time(); - - $url = $protocol.urlencode($domain)."/index.php?rex-api-call=project_manager&api_key=".$website['api_key'].'&t='.$timestamp.$param; - - if ($cms == 5) - $url = $protocol.urlencode($domain)."/index.php?rex-api-call=project_manager&api_key=".$website['api_key'].'&t='.$timestamp.$param; - - if ($cms == 4) - $url = $protocol.urlencode($domain)."/project_manager_client.php?rex-api-call=project_manager&api_key=".$website['api_key'].'&t='.$timestamp.$param; - - $resps[$domain] = curl_init($url); - curl_setopt_array($resps[$domain], $options); - curl_multi_add_handle($multi_curl, $resps[$domain]); - - } - - $active = null; - - do { - $mrc = curl_multi_exec($multi_curl, $active); - } while ($mrc == CURLM_CALL_MULTI_PERFORM); - - while ($active && $mrc == CURLM_OK) { - if (curl_multi_select($multi_curl) != -1) { - do { - $mrc = curl_multi_exec($multi_curl, $active); - } while ($mrc == CURLM_CALL_MULTI_PERFORM); - } - } - - - - foreach ($resps as $domain => $response) { - - $resp = curl_multi_getcontent($response); - curl_multi_remove_handle($multi_curl, $response); - - $json = json_decode($resp, true); - $json_result = json_encode($json); - - project_manager_logger::deleteFile($domain); - project_manager_logger::init($domain); - project_manager_logger::log($domain . ' Abruf gestartet', 'Project Manager Server'); - project_manager_logger::log($json_result . ' -> Response', 'Project Manager Server'); - - $project_manager_domain = rex_sql::factory()->setDebug(0)->getArray('SELECT * FROM ' . rex::getTable('project_manager_domain') . ' WHERE domain = ? LIMIT 1', [$domain]); - - if(json_last_error() === JSON_ERROR_NONE && $json !== null) { - - if ($json['status'] == 1) { - - rex_sql::factory()->setDebug(0)->setQuery('DELETE FROM ' . rex::getTable('project_manager_logs') . ' WHERE domain_id = ?', [$project_manager_domain[0]['id']]); - - rex_sql::factory()->setDebug(0)->setQuery('INSERT INTO ' . rex::getTable('project_manager_logs') . ' (`domain_id`, `createdate`, `raw`) VALUES(?,NOW(),?)', [$project_manager_domain[0]['id'], $resp] ); - // SET STATUS - rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_domain') . " SET status = ?, updatedate = NOW() WHERE id = ?", [1, $project_manager_domain[0]['id']]); - - //WRITE LOGFILE - project_manager_logger::log('Status 1', 'Project Manager Server'); - - - } else { - // SET STATUS - rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_domain') . " SET status = ?, updatedate = NOW()WHERE id = ?", [0, $project_manager_domain[0]['id']]); - - // WRITE LOGFILE - project_manager_logger::log('Status 0', 'Project Manager Server'); - - } - - } else { - - // SET STATUS - rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_domain') . " SET status = ?, updatedate = NOW() WHERE id = ?", [-1, $project_manager_domain[0]['id']]); - - //WRITE LOGFILE - project_manager_logger::log('Status -1', 'Project Manager Server'); - - - } - - rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_domain') . " SET updatedate = NOW() WHERE id = ?", [$project_manager_domain[0]['id']]); - - //WRITE LOGFILE - - - } - - curl_multi_close($multi_curl); - - return true; - - } - public function getTypeName() - { - return rex_i18n::msg('project_manager_cronjob_data_name'); - } - - public function getParamFields() - { - return []; - } -} -?> \ No newline at end of file diff --git a/plugins/server/lib/rex_api_project_manager_server.php b/plugins/server/lib/rex_api_project_manager_server.php deleted file mode 100644 index a48c1ad..0000000 --- a/plugins/server/lib/rex_api_project_manager_server.php +++ /dev/null @@ -1,162 +0,0 @@ - true, - CURLOPT_AUTOREFERER => true, - CURLOPT_MAXREDIRS => 5, - CURLOPT_HEADER => false, - CURLOPT_SSL_VERIFYPEER => false, - CURLOPT_SSL_VERIFYHOST => false, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0', - CURLOPT_TIMEOUT => 5, - CURLOPT_URL => $url - )); - $resp = curl_exec($curl); - - $json = json_decode($resp, true); - - if(json_last_error() === JSON_ERROR_NONE && $json !== null) { - if ($json['delLog'] == 1) { - $params['delLog'] = 1; - } - } else { - $params['delLog'] = -1; - } - - // reload data - $url = $protocol.urlencode($domain)."/index.php?rex-api-call=project_manager&api_key=".$api_key.'&t='.$timestamp.$param; - $curl = curl_init(); - curl_setopt_array($curl, array( - CURLOPT_FOLLOWLOCATION => true, - CURLOPT_AUTOREFERER => true, - CURLOPT_MAXREDIRS => 5, - CURLOPT_HEADER => false, - CURLOPT_SSL_VERIFYPEER => false, - CURLOPT_SSL_VERIFYHOST => false, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0', - CURLOPT_TIMEOUT => 5, - CURLOPT_URL => $url - )); - - $response = curl_exec($curl); - $resp = $response; - $json = json_decode($resp, true); - - $project_manager_domain = rex_sql::factory()->setDebug(0)->getArray('SELECT * FROM ' . rex::getTable('project_manager_domain') . ' WHERE domain = ? LIMIT 1', [$domain]); - - if(json_last_error() === JSON_ERROR_NONE && $json !== null) { - - if ($json['status'] == 1) { - - rex_sql::factory()->setDebug(0)->setQuery('INSERT INTO ' . rex::getTable('project_manager_logs') . ' (`domain_id`, `createdate`, `raw`) VALUES(?,NOW(),?)', [$project_manager_domain[0]['id'], $resp] ); - // SET STATUS - rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_domain') . " SET status = ?, updatedate = NOW() WHERE id = ?", [1, $project_manager_domain[0]['id']]); - - } else { - // SET STATUS - rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_domain') . " SET status = ?, updatedate = NOW()WHERE id = ?", [0, $project_manager_domain[0]['id']]); - } - - } else { - // SET STATUS - rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_domain') . " SET status = ?, updatedate = NOW() WHERE id = ?", [-1, $project_manager_domain[0]['id']]); - } - rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_domain') . " SET updatedate = NOW() WHERE id = ?", [$project_manager_domain[0]['id']]); - - } - - if($func == "updateData") { - - // reload data - $url = $protocol.urlencode($domain)."/index.php?rex-api-call=project_manager&api_key=".$api_key.'&t='.$timestamp.$param; - $curl = curl_init(); - curl_setopt_array($curl, array( - CURLOPT_FOLLOWLOCATION => true, - CURLOPT_AUTOREFERER => true, - CURLOPT_MAXREDIRS => 5, - CURLOPT_HEADER => false, - CURLOPT_SSL_VERIFYPEER => false, - CURLOPT_SSL_VERIFYHOST => false, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_TIMEOUT => 5, - CURLOPT_URL => $url - )); - - $response = curl_exec($curl); - $resp = $response; - $json = json_decode($resp, true); - $json_result = json_encode($json); - - project_manager_logger::deleteFile($domain); - project_manager_logger::init($domain); - project_manager_logger::log($domain . ' Abruf gestartet', 'Project Manager Server'); - project_manager_logger::log($json_result . ' -> Response', 'Project Manager Server'); - - $project_manager_domain = rex_sql::factory()->setDebug(0)->getArray('SELECT * FROM ' . rex::getTable('project_manager_domain') . ' WHERE domain = ? LIMIT 1', [$domain]); - - if(json_last_error() === JSON_ERROR_NONE && $json !== null) { - - if ($json['status'] == 1) { - - rex_sql::factory()->setDebug(0)->setQuery('INSERT INTO ' . rex::getTable('project_manager_logs') . ' (`domain_id`, `createdate`, `raw`) VALUES(?,NOW(),?)', [$project_manager_domain[0]['id'], $resp] ); - // SET STATUS - rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_domain') . " SET status = ?, updatedate = NOW() WHERE id = ?", [1, $project_manager_domain[0]['id']]); - - //WRITE LOGFILE - project_manager_logger::log('Status 1', 'Project Manager Server'); - - } else { - // SET STATUS - rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_domain') . " SET status = ?, updatedate = NOW()WHERE id = ?", [0, $project_manager_domain[0]['id']]); - - // WRITE LOGFILE - project_manager_logger::log('Status 0', 'Project Manager Server'); - } - - } else { - // SET STATUS - rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_domain') . " SET status = ?, updatedate = NOW() WHERE id = ?", [-1, $project_manager_domain[0]['id']]); - - //WRITE LOGFILE - project_manager_logger::log('Status -1', 'Project Manager Server'); - } - rex_sql::factory()->setDebug(0)->setQuery("UPDATE " . rex::getTable('project_manager_domain') . " SET updatedate = NOW() WHERE id = ?", [$project_manager_domain[0]['id']]); - - } - - header('Content-Type: application/json; charset=UTF-8'); - $response = json_encode($params, true); - echo $response; - exit(); - - } -} - -?> \ No newline at end of file diff --git a/plugins/server/package.yml b/plugins/server/package.yml deleted file mode 100644 index e83a9fc..0000000 --- a/plugins/server/package.yml +++ /dev/null @@ -1,26 +0,0 @@ -package: project_manager/server -version: '1.5.5' -author: 'Friends Of REDAXO' -supportpage: https://github.com/FriendsOfREDAXO/project_manager - -page: - title: 'translate:project_manager_server_menu_entry' - icon: rex-icon fa-th-list - perm: project_manager_server[] - -pages: - project_manager/server/overview: - title: 'translate:project_manager_server_overview' - project_manager/server/projects: - title: 'translate:project_manager_server_project_detail' - project_manager/server/config: - title: 'translate:project_manager_server_config' - - -requires: - packages: - cronjob: '>=2.3.0' - project_manager: '^1.5.0' - yform: '>=3.4.2' - php: - version: '>=7.0' \ No newline at end of file diff --git a/plugins/server/pages/info.php b/plugins/server/pages/info.php deleted file mode 100644 index 7c206e8..0000000 --- a/plugins/server/pages/info.php +++ /dev/null @@ -1,54 +0,0 @@ - $h2_block) { - preg_match('/(.*)\n^(?:.|\n(?!#))*/m', $h2_block, $headline); - if (isset($headline[1])) { - $navi_list[] = '* '.$headline[1]; - $content_h2_block = '# '.$headline[0]; - preg_match_all('/(?!### )*^### (.*)\n((?:.|\n(?!### ))*)/m', $h2_block, $matches); - if (count($matches[0]) > 0) { - $navi_elements = $matches[1]; - $blocks = $matches[2]; - $content_blocks['chapter'.$h2_i] = $content_h2_block; - foreach ($navi_elements as $h3_i => $navi_element) { - $navi_list[] = ' * '.$navi_element.''; - $content_blocks["chapter".$h2_i] .= "\n## ".$navi_element.$blocks[$h3_i]; - } - } - } -} -reset($content_blocks); -$n = rex_request('n', 'string', key($content_blocks)); - -if (!isset($content_blocks[$n])) { - $n = key($content_blocks); -} -$navi_view = implode("\n", $navi_list); - $blocks_view = $content_blocks[$n]; - - $miu = rex_markdown::factory(); - -// Navigation -$navi_view = $miu->parse($navi_view); -$fragment = new rex_fragment(); -$fragment->setVar('title', rex_i18n::msg('project_manager_navigation').'', false); -$fragment->setVar('body', $navi_view, false); -$navi = $fragment->parse('core/page/section.php'); - - -$blocks_view = $miu->parse($blocks_view); -$fragment = new rex_fragment(); -$fragment->setVar('title', $this->i18n('docs'), false); -$fragment->setVar('body', $blocks_view, false); -$content = $fragment->parse('core/page/section.php'); - -echo '
-
-
'.$navi.'
-
'.$content.'
-
-
'; \ No newline at end of file diff --git a/plugins/server/pages/project_manager.server.config.php b/plugins/server/pages/project_manager.server.config.php deleted file mode 100644 index 296871f..0000000 --- a/plugins/server/pages/project_manager.server.config.php +++ /dev/null @@ -1,162 +0,0 @@ -setConfig(rex_post('config', [ - ['php_min', 'string'], - ['cms_4_min', 'string'], - ['cms_min', 'string'], - ['php_min_color', 'string'], - ['cms_min_color', 'string'], - ['skip_addon', 'string'], - ['skip_addon_version', 'string'], - ])); - - $message = $this->i18n('project_manager_server_config_saved_successful'); -} - -$content = ''; - -$formElements = []; -$n = []; -$n['label'] = '

'.$this->i18n('project_manager_server_min_headline').'

'; -$n['field'] = ''; -$formElements[] = $n; - -// PHP MIN -$n = []; -$n['label'] = ''; -$select = new rex_select(); -$select->setId('php_min'); -$select->setAttribute('class', 'form-control'); -$select->setName('config[php_min]'); -$select->addOption('5.3', '5.3'); -$select->addOption('5.4', '5.4'); -$select->addOption('5.5', '5.5'); -$select->addOption('5.6', '5.6'); -$select->addOption('7.0', '7.0'); -$select->addOption('7.1', '7.1'); -$select->addOption('7.2', '7.2'); -$select->addOption('7.3', '7.3'); -$select->addOption('7.4', '7.4'); -$select->addOption('8.0', '8.0'); -$select->addOption('8.1', '8.1'); -$select->addOption('8.2', '8.2'); -$select->addOption('8.3', '8.3'); -$select->addOption('8.4', '8.4'); -$select->addOption('8.5', '8.5'); -$select->setSelected($this->getConfig('php_min')); -$n['field'] = $select->get(); -$formElements[] = $n; - -$fragment = new rex_fragment(); -$fragment->setVar('elements', $formElements, false); -$content .= $fragment->parse('core/form/container.php'); - -// CMS 4 MIN -$formElements = []; -$n = []; -$n['label'] = ''; -$select = new rex_select(); -$select->setId('cms_4_min'); -$select->setAttribute('class', 'form-control'); -$select->setName('config[cms_4_min]'); -$select->addOption('4.7.0', '4.7.0'); -$select->addOption('4.7.1', '4.7.1'); -$select->addOption('4.7.2', '4.7.2'); -$select->addOption('4.7.3', '4.7.3'); -$select->setSelected($this->getConfig('cms_4_min')); -$n['field'] = $select->get(); -$formElements[] = $n; - -$fragment = new rex_fragment(); -$fragment->setVar('elements', $formElements, false); -$content .= $fragment->parse('core/form/container.php'); - -// CMS 5 MIN -$formElements = []; -$n = []; -$n['label'] = ''; -$select = new rex_select(); -$select->setId('cms_min'); -$select->setAttribute('class', 'form-control'); -$select->setName('config[cms_min]'); -$select->addOption('5.12.0', '5.12.0'); -$select->addOption('5.12.1', '5.12.1'); -$select->addOption('5.13.0', '5.13.0'); -$select->addOption('5.13.1', '5.13.1'); -$select->addOption('5.13.2', '5.13.2'); -$select->addOption('5.13.3', '5.13.3'); -$select->addOption('5.13.4', '5.13.4'); -$select->addOption('5.14.0', '5.14.0'); -$select->addOption('5.14.1', '5.14.1'); -$select->addOption('5.14.2', '5.14.2'); -$select->addOption('5.15.0', '5.15.0'); -$select->addOption('5.15.1', '5.15.1'); -$select->addOption('5.16.0', '5.16.0'); -$select->addOption('5.16.1', '5.16.1'); -$select->addOption('5.17.0', '5.17.0'); -$select->addOption('5.17.1', '5.17.1'); -$select->addOption('5.18.0', '5.18.0'); -$select->addOption('5.18.1', '5.18.1'); - -$select->setSelected($this->getConfig('cms_min')); -$n['field'] = $select->get(); -$formElements[] = $n; - -$fragment = new rex_fragment(); -$fragment->setVar('elements', $formElements, false); -$content .= $fragment->parse('core/form/container.php'); - -$formElements = []; -$n = []; -$n['label'] = '

'.$this->i18n('project_manager_server_configuration').'

'; -$n['field'] = ''; -$formElements[] = $n; - -$fragment = new rex_fragment(); -$fragment->setVar('elements', $formElements, false); -$content .= $fragment->parse('core/form/container.php'); - -$formElements = []; -$n = []; -$n['label'] = ''; -$n['field'] = ' -

' . $this->i18n('project_manager_server_skip_addon_notice') . '

'; -$formElements[] = $n; - -$fragment = new rex_fragment(); -$fragment->setVar('elements', $formElements, false); -$content .= $fragment->parse('core/form/container.php'); - -$formElements = []; -$n = []; -$n['label'] = ''; -$n['field'] = ' -

' . $this->i18n('project_manager_server_skip_addon_version_notice') . '

'; -$formElements[] = $n; - -$fragment = new rex_fragment(); -$fragment->setVar('elements', $formElements, false); -$content .= $fragment->parse('core/form/container.php'); - -$formElements = []; -$n = []; -$n['field'] = ''; -$formElements[] = $n; - -$fragment = new rex_fragment(); -$fragment->setVar('flush', true); -$fragment->setVar('elements', $formElements, false); -$buttons = $fragment->parse('core/form/submit.php'); - -$fragment = new rex_fragment(); -$fragment->setVar('class', 'edit', false); -$fragment->setVar('title', $this->i18n('project_manager_server_title'), false); -$fragment->setVar('body', $content, false); -$fragment->setVar('buttons', $buttons, false); -$content = $fragment->parse('core/page/section.php'); -echo ' -
- ' . $content . ' -
'; diff --git a/plugins/server/pages/project_manager.server.overview.php b/plugins/server/pages/project_manager.server.overview.php deleted file mode 100644 index 1b0f84b..0000000 --- a/plugins/server/pages/project_manager.server.overview.php +++ /dev/null @@ -1,531 +0,0 @@ -getValue(); -$csrf = rex_csrf_token::factory('project_manager'); - - -if ($func != '') { - - $yform = new rex_yform(); - $yform->setDebug(FALSE); - $yform->setHiddenField('page', 'project_manager/server/overview'); - $yform->setHiddenField('func', $func); - $yform->setHiddenField('save', '1'); - - $yform->setObjectparams('main_table', rex::getTable('project_manager_domain')); - $yform->setObjectparams('form_name', 'project_manager_form'); - - $yform->setValueField('text', ['name', $this->i18n('project_manager_server_name'), 'notice' => ''.$this->i18n('name_info').'']); - $yform->setValidateField('empty', ['name', $this->i18n('project_manager_server_no_name_defined')]); - $yform->setValidateField('unique', ['name', $this->i18n('project_manager_server_name_already_defined')]); - - $yform->setValueField('text', ['domain', $this->i18n('project_manager_server_domain'), 'notice' => ''.$this->i18n('domain_info').'']); - $yform->setValidateField('empty', ['domain', $this->i18n('project_manager_server_no_domain_defined')]); - $yform->setValidateField('unique', ['domain', $this->i18n('project_manager_server_domain_already_defined')]); - - $regex = '/^(?:(?!https?:\/\/).*)$/'; - $yform->setValidateField('preg_match', array('domain', $regex, $this->i18n('domain_no_protocol'))); - - $yform->setValueField('choice', array("is_ssl", $this->i18n('project_manager_server_ssl'),"Ja=1,Nein=0","","0","0")); - - - $yform->setValueField('hidden', array("createdate", date ('Y-m-d H:i:s', time()))); - - if ($func == 'delete') { - - if (!$csrf->isValid()) { - echo rex_view::error(rex_i18n::msg('csrf_token_invalid')); - } else { - $d = rex_sql::factory(); - $d->setQuery('delete from '.rex::getTable('project_manager_logs').' where domain_id=' . $data_id); - $e = rex_sql::factory(); - $e->setQuery('delete from '.rex::getTable('project_manager_domain').' where id=' . $data_id); - echo rex_view::success($this->i18n('project_manager_server_project_deleted')); - } - - } else if ($func == 'edit') { - - $yform->setValueField('text', ['api_key', $this->i18n('project_manager_server_api_key_info'), 'notice' => ''.$this->i18n('api_key_notice').'']); - $yform->setValidateField('empty', ['api_key', $this->i18n('no_api_key_defined')]); - // $yform->setValidateField('unique', ['api_key', $this->i18n('api_key_already_defined')]); - - $yform->setValueField('text', ['param', $this->i18n('project_manager_server_param'), 'notice' => ''.$this->i18n('param_notice').'']); - - $yform->setValueField('choice', array("cms", $this->i18n('project_manager_server_cms'),"REDAXO 5=5,REDAXO 4=4","","0","0")); - - $yform->setValueField('choice', array("maintenance", $this->i18n('project_manager_server_maintenance'),"Nein=0,Ja=1","","0","0")); - - $yform->setValueField('text', ['tags', $this->i18n('project_manager_server_tags'), '#attributes: {"data-role":"tagsinput"}']); - - $yform->setHiddenField('data_id', $data_id); - $yform->setActionField('db', [rex::getTable('project_manager_domain'), 'id=' . $data_id]); - $yform->setObjectparams('main_id', $data_id); - $yform->setObjectparams('main_where', "id=$data_id"); - $yform->setObjectparams('getdata', true); - $yform->setObjectparams('submit_btn_label', $this->i18n('save')); - $form = $yform->getForm(); - - if ($yform->objparams['actions_executed']) { - - echo rex_view::success($this->i18n('project_manager_server_project_added')); - - } else { - - $showlist = false; - - $fragment = new rex_fragment(); - $fragment->setVar('class', 'edit', false); - $fragment->setVar('title', $this->i18n('edit_domain')); - - $fragment->setVar('body', $form, false); - echo $fragment->parse('core/page/section.php'); - - } - - - } else if ($func == 'domain_add') { - - $yform->setValueField('text', ['api_key', $this->i18n('project_manager_server_api_key_info'), 'default' => bin2hex(random_bytes(24)), 'notice' => ''.$this->i18n('api_key_notice').'']); - $yform->setValidateField('empty', ['api_key', $this->i18n('no_api_key_defined')]); - //$yform->setValidateField('unique', ['api_key', $this->i18n('api_key_already_defined')]); - - $yform->setValueField('text', ['param', $this->i18n('project_manager_server_param'), 'notice' => ''.$this->i18n('param_notice').'']); - - $yform->setValueField('choice', array("cms", $this->i18n('project_manager_server_cms'),"REDAXO 5=5,REDAXO 4=4","","0","0")); - - $yform->setValueField('choice', array("maintenance", $this->i18n('project_manager_server_maintenance'),"Nein=0,Ja=1","","0","0")); - - $yform->setValueField('text', ['tags', $this->i18n('project_manager_server_tags'), '#attributes: {"data-role":"tagsinput"}']); - - $yform->setActionField('db', [rex::getTable('project_manager_domain')]); - $yform->setObjectparams('submit_btn_label', $this->i18n('save')); - $form = $yform->getForm(); - - if ($yform->objparams['actions_executed']) { - echo rex_view::success($this->i18n('project_manager_server_project_added')); - } else { - - $showlist = false; - - $fragment = new rex_fragment(); - $fragment->setVar('class', 'edit', false); - $fragment->setVar('title', $this->i18n('add_domain')); - $fragment->setVar('body', $form, false); - echo $fragment->parse('core/page/section.php'); - } - - // Insert in DB - // API Call inkl. reponse into DB - - } - - -} - -############### -### -### LISTVIEW -### -############### -if ($showlist) { - -// $sql = 'SELECT * FROM ' . rex::getTable('project_manager_domain') . ' as D -// LEFT JOIN (SELECT domain_id, status, createdate, `raw` as log_raw FROM ' . rex::getTable('project_manager_logs') . ' WHERE id IN (SELECT MAX(createdate) FROM ' . rex::getTable('project_manager_logs') . ' GROUP BY domain_id)) as L -// ON D.id = L.domain_id -// WHERE L.status = 1 -// ORDER BY L.createdate DESC -// LIMIT 1 - -// '; -// &sort=cms&sorttype=desc - - if ($sort == "") $sort = "D.name"; - if ($sorttype == "") $sorttype = "ASC"; - - $sql = 'SELECT * FROM ( - SELECT id, name, domain, is_ssl, status, cms, api_key, param, maintenance FROM `rex_project_manager_domain` ORDER BY domain ASC - ) AS D - LEFT JOIN (SELECT domain_id, `raw`, createdate FROM rex_project_manager_logs WHERE id IN (SELECT MAX(id) FROM rex_project_manager_logs GROUP BY domain_id)) AS L - ON D.id = L.domain_id - ORDER BY '.$sort.' '.$sorttype.''; - - $list = rex_list::factory($sql, 2000); - $list->setColumnFormat('id', 'Id'); - $list->addParam('page', 'project_manager/server/overview'); - - $items = rex_sql::factory()->getArray($sql); - - // Cronjobcall - $sql2 = 'SELECT * FROM '. rex::getTable('cronjob').' - WHERE type = "rex_cronjob_project_manager_data"'; - $cronjob = rex_sql::factory()->getArray($sql2); - $cronjobId = $cronjob[0]['id']; - - $refresh = ''; - if ($cronjobId != NULL) { - $refresh = ' Projektdaten aktualisieren'; - } - echo rex_view::info("Anzahl der Domains und Projekte: ".count($items) . $refresh); - - -// $tdIcon = ''; -// $thIcon = 'i18n('add_project'), 'add') . '>'; -// $list->addColumn($thIcon, $tdIcon, 0, ['
###VALUE######VALUE######VALUE######VALUE######VALUE######VALUE### ###VALUE######VALUE### ###VALUE######VALUE######VALUE######VALUE######VALUE######VALUE### ###VALUE######VALUE######VALUE######VALUE######VALUE######VALUE######VALUE######VALUE######VALUE######VALUE######VALUE######VALUE###
setVar('title', $this->i18n('projects')); - $fragment->setVar('content', $content, false); - echo $fragment->parse('core/page/section.php'); -} diff --git a/plugins/server/pages/project_manager.server.projects.php b/plugins/server/pages/project_manager.server.projects.php deleted file mode 100644 index 7da10a2..0000000 --- a/plugins/server/pages/project_manager.server.projects.php +++ /dev/null @@ -1,529 +0,0 @@ -setName('domain'); -$sel_editor->setId('rex-project-manager-domain'); -$sel_editor->setAttribute('class', 'form-control selectpicker'); -$sel_editor->setAttribute('data-live-search', 'true'); -$sel_editor->setSize(1); -$sel_editor->setSelected($domain); -$sel_editor->addDBSqlOptions("select domain as name, domain as id FROM rex_project_manager_domain ORDER BY domain"); - -$formElements = []; -$n = []; -$n['label'] = ''; -$n['field'] = $sel_editor->get(); -$formElements[] = $n; - -$fragment = new rex_fragment(); -$fragment->setVar('elements', $formElements, false); -$content = $fragment->parse('core/form/form.php'); - - -$formElements = []; -$n = []; -$n['field'] = ''; -$formElements[] = $n; - -$fragment = new rex_fragment(); -$fragment->setVar('elements', $formElements, false); -$buttons = $fragment->parse('core/form/submit.php'); - -$fragment = new rex_fragment(); -$fragment->setVar('class', 'edit', false); -$fragment->setVar('title', $this->i18n('project_detail')); -$fragment->setVar('body', $content, false); -$fragment->setVar('buttons', $buttons, false); -$content = $fragment->parse('core/page/section.php'); - -$content = ' - - - - ' . $csrfToken->getHiddenField() . ' - ' . $content . ' - '; - -echo $content; - -if($domain) { - - // Domain-Übersicht ANFANG // - $query = 'SELECT * FROM `rex_project_manager_logs` AS L - INNER JOIN `rex_project_manager_domain` as D - ON D.id = L.domain_id - WHERE domain = ? ORDER BY L.id DESC LIMIT 1'; - - - try { - $result = rex_sql::factory()->setDebug(0)->getArray($query, [$domain]); - } catch (rex_sql_exception $e) { - rex_logger::logException($e); - } - - if (!empty($result)){ - $item = $result[0]; - } - - if ((isset($item)) && (null !== $item)){ - $raw = json_decode($item['raw'], true); - } - - if((isset($raw)) && (is_array($raw))) { - - $ssl = $item['is_ssl']; - $protocol = ($ssl == 1) ? "https://" : "http://"; - - $refresh = ''; - $refresh = '
'; - - echo $refresh; - - if ($item['cms'] == 4) { - $content0 = ''; - - // VERSIONS - $output = '
'; - $output .= ''; - $output .= ''; - - if ($item['status'] == "1") { - $output .= ''; - } else if ($item['status'] == "0") { - $output .= ''; - } else if ($item['status'] == "-1") { - $output .= ''; - } else if ($item['status'] == "2") { - $output .= ''; - } - - $output .= ''; - $output .= ''; - $output .= ''; - $output .= '
InformationVersion / Status
Projekt Manager Version'.$raw['pm_version'].'
Projekt Manager Client Version'.$raw['client_version'].'
Projekt Manager Client Abruf '.$this->i18n('project_manager_server_status_code_1').'
Projekt Manager Client Abruf '.$this->i18n('project_manager_server_status_code_0').'
Projekt Manager Client Abruf '.$this->i18n('project_manager_server_status_code_minus_1').'
Projekt Manager Client Abruf '.$this->i18n('project_manager_server_status_code_2').'
REDAXO Version'.$raw['rex_version'].'
PHP Version'.$raw['php_version'].'
MySQL Version'.$raw['mysql_version'].'
'; - - $fragment = new rex_fragment(); - $fragment->setVar('class', 'danger', false); - $fragment->setVar('title', "Informationen", false); - $fragment->setVar('body', $output, false); - $content0 .= '
'.$fragment->parse('core/page/section.php').'
'; - - echo '
'.$content0.'
'; - - $content0 = ''; - - // UPDATES - $output = ''; - - if (array_key_exists('update_article', $raw) && array_key_exists('update_media', $raw)) { - $output .= ''; - $output .= ''; - } - - $output .= ''; - $output .= '
Letzte ÄnderungDatum
Artikel'.date('d.m.Y H:i:s', $raw['update_article']).'
Medienpool'.date('d.m.Y H:i:s', $raw['update_media']).'
Synchronisierung mit Projekt Manager'.date('d.m.Y H:i:s', $item['updatedate']).'
'; - - $fragment = new rex_fragment(); - $fragment->setVar('class', 'info', false); - $fragment->setVar('title', "Änderungen", false); - $fragment->setVar('body', $output, false); - $fragment->setVar('collapse', true); - $fragment->setVar('collapsed', false); - $content0 .= '
'.$fragment->parse('core/page/section.php').'
'; - - echo '
'.$content0.'
'; - } - - if ($item['cms'] == 5) { - - $content1 = ''; - - $output = ''; - $output .= ''; - $output .= ''; - - if ($item['status'] == "1") { - $output .= ''; - } else if ($item['status'] == "0") { - $output .= ''; - } else if ($item['status'] == "-1") { - $output .= ''; - } else if ($item['status'] == "2") { - $output .= ''; - } - - $output .= ''; - $output .= ''; - $output .= ''; - if ($raw['client_version'] >= "1.0.6") { - if ($raw['debug'] == 1) - $output .= ''; - if ($raw['debug'] == 0) - $output .= ''; - } - - if ($raw['client_version'] >= "1.1.0") { - if (!empty($raw['rex_url_backend'])) - $output .= ''; - } - - if ($item['maintenance'] == "1") { - $output .= ''; - } else if ($item['maintenance'] == "0") { - $output .= ''; - } else if ($item['maintenance'] == "") { - $output .= ''; - } - - - $output .= '
InformationVersion / Status
Projekt Manager Version'.$raw['pm_version'].'
Projekt Manager Client Version'.$raw['client_version'].'
Projekt Manager Client Abruf '.$this->i18n('project_manager_server_status_code_1').'
Projekt Manager Client Abruf '.$this->i18n('project_manager_server_status_code_0').'
Projekt Manager Client Abruf '.$this->i18n('project_manager_server_status_code_minus_1').'
Projekt Manager Client Abruf '.$this->i18n('project_manager_server_status_code_2').'
REDAXO Version'.$raw['rex_version'].'
PHP Version'.$raw['php_version'].'
MySQL Version'.$raw['mysql_version'].'
Debug Modus aktiv
Debug Modus nicht aktiv
REDAXO Backend '.$raw['rex_url_backend'].'
Wartungsvertrag '.$this->i18n('project_manager_server_maintenance_1').'
Wartungsvertrag '.$this->i18n('project_manager_server_maintenance_0').'
Wartungsvertrag '.$this->i18n('project_manager_server_maintenance_2').'
'; - - $fragment = new rex_fragment(); - $fragment->setVar('class', 'danger', false); - $fragment->setVar('title', "Informationen", false); - $fragment->setVar('body', $output, false); - $content1 .= '
'.$fragment->parse('core/page/section.php').'
'; - - echo '
'.$content1.'
'; - - $content1 = ''; - - // UPDATES - $output = ''; - $output .= ''; - $output .= ''; - $output .= ''; - $output .= '
Letzte ÄnderungDatum
Artikel'.rex_formatter::format($raw['article'][0]['updatedate'],'date','d.m.Y H:i:s').'
Medienpool'.rex_formatter::format($raw['media'][0]['updatedate'],'date','d.m.Y H:i:s').'
Synchronisierung mit Projekt Manager'.rex_formatter::format($item['updatedate'],'date','d.m.Y H:i:s').'
'; - - $fragment = new rex_fragment(); - $fragment->setVar('class', 'info', false); - $fragment->setVar('title', "Änderungen", false); - $fragment->setVar('body', $output, false); - $fragment->setVar('collapse', true); - $fragment->setVar('collapsed', false); - $content1 .= '
'.$fragment->parse('core/page/section.php').'
'; - - - // USER - $user = $raw['user']; - $output = ''; - foreach ($user as $login) { - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - } - $output .= '
NameBenutzerLetzter Login
'.$login["name"].''.$login["login"].''.rex_formatter::format($login["lastlogin"],'date','d.m.Y H:i:s').'
'; - - $fragment = new rex_fragment(); - $fragment->setVar('class', 'info', false); - $fragment->setVar('title', "Benutzer", false); - $fragment->setVar('body', $output, false); - $fragment->setVar('collapse', true); - $fragment->setVar('collapsed', false); - $content1 .= '
'.$fragment->parse('core/page/section.php').'
'; - - echo '
'.$content1.'
'; - - - $content2 = ''; - - // ARTICLES - $articles = $raw['article']; - - $output = ''; - foreach ($articles as $article) { - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - } - $output .= '
ArtikelBenutzerÄnderungsdatum
'.$article["name"].''.$article["updateuser"].''.rex_formatter::format($article["updatedate"],'date','d.m.Y H:i:s').'
'; - - $fragment = new rex_fragment(); - $fragment->setVar('class', 'info', false); - $fragment->setVar('title', "Artikel", false); - $fragment->setVar('body', $output, false); - $fragment->setVar('collapse', true); - $fragment->setVar('collapsed', true); - $content2 .= '
'.$fragment->parse('core/page/section.php').'
'; - - - // MEDIAFILES - $media = $raw['media']; - $output = ''; - foreach ($media as $file) { - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - } - $output .= '
DateiBenutzerÄnderungsdatum
'.$file["filename"].''.$file["updateuser"].''.rex_formatter::format($file["updatedate"],'date','d.m.Y H:i:s').'
'; - - $fragment = new rex_fragment(); - $fragment->setVar('class', 'info', false); - $fragment->setVar('title', "Medienpool", false); - $fragment->setVar('body', $output, false); - $fragment->setVar('collapse', true); - $fragment->setVar('collapsed', true); - $content2 .= '
'.$fragment->parse('core/page/section.php').'
'; - - echo '
'.$content2."
"; - - - $content2 = ''; - - // Modules - $modules = $raw['module']; - $output = ''; - foreach ($modules as $file) { - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - } - $output .= '
ModulÄnderungsdatum
'.$file["name"].''.rex_formatter::format($file["updatedate"],'date','d.m.Y H:i:s').'
'; - - $fragment = new rex_fragment(); - $fragment->setVar('class', 'info', false); - $fragment->setVar('title', "Module", false); - $fragment->setVar('body', $output, false); - $fragment->setVar('collapse', true); - $fragment->setVar('collapsed', true); - $content2 .= '
'.$fragment->parse('core/page/section.php').'
'; - - - echo '
'.$content2."
"; - - $content3 = ''; - - // ADDONS - $addons = $raw['rex_addons']; - $i = 0; - $output = ''; - foreach($addons as $key => $value) { - - if ($value['status'] == 1) $status = 'Ja'; - if ($value['status'] == 0) $status = 'Nein'; - - $output .= ''; - $output .= ''; - $output .= ''; - - $skip_addon_config = ''; - $skip_addon_config = rex_config::get('project_manager/server', 'skip_addon'); - $skip_addon_versions = ''; - - if ($skip_addon_config != "") { - $skip_addons = explode(',', $skip_addon_config); - if (in_array($value['name'], $skip_addons)) { - $output .= ''; - $output .= ''; - $output .= ''; - continue; - } - } - - if ($value['version_current'] != '' && $value['version_latest'] != '') { - if(rex_string::versionCompare($value['version_current'], $value['version_latest'], '<')) { - - $skip_addon_version_config = rex_config::get('project_manager/server', 'skip_addon_version'); - - if ($skip_addon_version_config != "") $skip_addon_versions = explode(',', $skip_addon_version_config); - - $skip = false; - if (is_array($skip_addon_versions)) { - foreach ($skip_addon_versions as $skip_addon_version) { - if (strpos($value['version_latest'],'-'.$skip_addon_version)) { - $skip = true; - } - } - } - - if ($value['version_latest'] == 0) $skip = true; - - if ($skip === false) { - $output .= ''; - $i++; - } else { - $output .= ''; - } - - } else { - $output .= ''; - } - - $output .= ''; - $output .= ''; - } - } - $output .= '
Nameaktiv?VersionInstaller
'.$value['name'].''.$status.''.$value['version_current'].''.$value['version_latest'].'
'.$value['version_current'].''.$value['version_current'].''.$value['version_current'].''.$value['version_latest'].'
'; - - $icon = ''; - if ($i > 0 ) $icon = ' '; - $updates = "(".$i." ". $this->i18n('project_manager_server_updates') ." ".$this->i18n('updates_necessary').")"; - $fragment = new rex_fragment(); - $fragment->setVar('class', 'info', false); - $fragment->setVar('title', "Installierte Addons ".$updates .' '.$icon, false); - $fragment->setVar('body', $output, false); - $fragment->setVar('collapse', true); - $fragment->setVar('collapsed', true); - $content3 .= '
'.$fragment->parse('core/page/section.php').'
'; - - echo '
'.$content3."
"; - $content3 = ""; - - - // DOMAINS - $domains = $raw['domains']; - - $output = ''; - foreach($domains as $key => $value) { - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - } - $output .= '
DomainURL404
'.$value['name'].''.$value['url'].''.$value['url_404'].'
'; - - $fragment = new rex_fragment(); - $fragment->setVar('class', 'info', false); - $fragment->setVar('title', "Domains in dieser Installation", false); - $fragment->setVar('body', $output, false); - $fragment->setVar('collapse', true); - $fragment->setVar('collapsed', true); - $content3 .= '
'.$fragment->parse('core/page/section.php').'
'; - - echo '
'.$content3.'
'; - $content3 = ""; - - - $icon = ""; - if (array_key_exists("syslog", $raw)) { - - $output = ''; - $syslog = $raw['syslog']; - $show_triangle = false; - - if (!is_null($syslog)) { - - - $output .= ''; - - foreach ($syslog as $entry) { - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - - if ($entry["syslog_type"] != 'Info') $show_triangle = true; - } - $output .= '
ZeitstempelTypNachrichtDateiZeile
'.$entry["timestamp"].''.$entry["syslog_type"].''.$entry["syslog_message"].''.$entry["syslog_file"].''.$entry["syslog_line"].'
'; - - if ($show_triangle == true) { - $icon = ' '; - } else { - $icon = ''; - } - - - if ($raw['client_version'] >= "1.0.6") - $output .= ''; - - - - } - }else { - $output = 'Keine Einträge vorhanden.'; - } - - $fragment = new rex_fragment(); - $fragment->setVar('class', 'info', false); - $fragment->setVar('title', "Syslog".$icon, false); - $fragment->setVar('body', $output, false); - $fragment->setVar('collapse', true); - $fragment->setVar('collapsed', true); - $content3 .= '
'.$fragment->parse('core/page/section.php').'
'; - - - echo '
'.$content3."
"; - $content3 = ""; - - - // LOGFILE - $icon = ""; - $output = ''; - project_manager_logger::init($domain); - - $logfile = new rex_log_file(project_manager_logger::getPath($domain)); - $show_triangle = false; - - if (!is_null($logfile)) { - - $output .= ''; - - foreach (new LimitIterator($logfile, 0, 100) as $entry) { - - $data = $entry->getData(); - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - - } - $output .= '
ZeitstempelTypNachricht
'.rex_formatter::intlDateTime($data[0], [IntlDateFormatter::SHORT, IntlDateFormatter::MEDIUM]) .''.$data[1].''.$data[2].'
'; - - $icon = ''; - if ($item['status'] == "1") { - - } else if ($item['status'] == "0") { - $icon = ' '; - } else if ($item['status'] == "-1") { - $icon = ' '; - } else if ($item['status'] == "2") { - $icon = ' '; - } - - } - - $fragment = new rex_fragment(); - $fragment->setVar('class', 'info', false); - $fragment->setVar('title', "Project Manager Log".$icon, false); - $fragment->setVar('body', $output, false); - $fragment->setVar('collapse', true); - $fragment->setVar('collapsed', true); - $content3 .= '
'.$fragment->parse('core/page/section.php').'
'; - - - - echo '
'.$content3."
"; - $content3 = ""; - } - - // ----- EXTENSION POINT - $domain = ''; - $domain_id = ''; - - $content_ep = ''; - $content_ep .= rex_extension::registerPoint(new rex_extension_point('PROJECT_MANAGER_SERVER_DETAIL_HOOK', '', [ - 'domain' => $domain, - 'domain_id' => $domain_id - ])); - - echo '
'.$content_ep."
"; - - - } -} - diff --git a/plugins/server/uninstall.php b/plugins/server/uninstall.php deleted file mode 100644 index 2b4d184..0000000 --- a/plugins/server/uninstall.php +++ /dev/null @@ -1,8 +0,0 @@ -setQuery("DELETE FROM ". rex::getTablePrefix() ."cronjob WHERE type LIKE 'rex_cronjob_project_manager%'"); - -rex_sql_table::get(rex::getTable('project_manager_logs'))->drop(); -rex_sql_table::get(rex::getTable('project_manager_domain'))->drop(); - - diff --git a/plugins/server/update.php b/plugins/server/update.php deleted file mode 100644 index b25f6e4..0000000 --- a/plugins/server/update.php +++ /dev/null @@ -1,7 +0,0 @@ -isInstalled()) { - rex_sql_table::get(rex::getTable('project_manager_domain')) - ->ensureColumn(new rex_sql_column('maintenance', 'tinyint', true)) - ->ensureColumn(new rex_sql_column('param', 'text', true)) - ->alter(); -} diff --git a/uninstall.php b/uninstall.php new file mode 100644 index 0000000..ff08b70 --- /dev/null +++ b/uninstall.php @@ -0,0 +1,17 @@ +setQuery("DELETE FROM ". rex::getTablePrefix() ."cronjob WHERE type LIKE 'rex_cronjob_project_manager_plus%'"); + +rex_sql_table::get(rex::getTable('project_manager_plus_logs'))->drop(); +rex_sql_table::get(rex::getTable('project_manager_plus_domain'))->drop(); + + +$sql = rex_sql::factory(); +$sql->setQuery("DELETE FROM ". rex::getTablePrefix() ."cronjob WHERE type LIKE 'rex_cronjob_project_manager_plus_pagespeed%'"); + +rex_sql_table::get(rex::getTable('project_manager_plus_domain_psi'))->drop(); + +$sql = rex_sql::factory(); +$sql->setQuery("DELETE FROM ". rex::getTablePrefix() ."cronjob WHERE type LIKE 'rex_cronjob_project_manager_plus_hosting%'"); + +rex_sql_table::get(rex::getTable('project_manager_plus_domain_hosting'))->drop(); diff --git a/update.php b/update.php index bdf012f..11400c4 100644 --- a/update.php +++ b/update.php @@ -1,9 +1,16 @@ -isInstalled()) { - rex_sql_table::get(rex::getTable('project_manager_domain')) - ->ensureColumn(new rex_sql_column('tags', 'text', true)) - ->ensureColumn(new rex_sql_column('api_key', 'varchar(255)', true)) - ->ensureColumn(new rex_sql_column('maintenance', 'tinyint', true)) - ->ensureColumn(new rex_sql_column('param', 'text', true)) - ->alter(); +isInstalled()) { + rex_sql_table::get(rex::getTable('project_manager_plus_domain')) + ->ensureColumn(new rex_sql_column('tags', 'text', true)) + ->ensureColumn(new rex_sql_column('api_key', 'varchar(255)', true)) + ->ensureColumn(new rex_sql_column('maintenance', 'tinyint', true)) + ->ensureColumn(new rex_sql_column('param', 'text', true)) + ->alter(); +} + +if (rex_plugin::get('project_manager_plus', 'server')->isInstalled()) { + rex_sql_table::get(rex::getTable('project_manager_plus_domain')) + ->ensureColumn(new rex_sql_column('maintenance', 'tinyint', true)) + ->ensureColumn(new rex_sql_column('param', 'text', true)) + ->alter(); }