diff --git a/CHANGELOG.md b/CHANGELOG.md index 2048c4b838c04c38e5eeaf7e8fa8d9ec62b90924..ce9011186d0ffc16db60d9ddb06707630d4beaab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ The Product Changelog at **[piwik.org/changelog](http://piwik.org/changelog)** l ### New APIs * A new event `Db.getActionReferenceColumnsByTable` has been added in case a plugin defines a custom log table which references data to the log_action table +* The event `System.addSystemSummaryItems` and `System.filterSystemSummaryItems` have been added so plugins can add items and filter items of the system summary widget * A new JavaScript tracker method `getPiwikUrl` has been added to retrieve the URL of where the Piwik instance is located * A new JavaScript tracker method `getCurrentUrl` has been added to retrieve the current URL of the website. * A new JavaScript tracker method `getNumTrackedPageViews` has been added to retrieve the number of tracked page views within the currently loaded page or web application. diff --git a/plugins/CoreHome/SystemSummary/Item.php b/plugins/CoreHome/SystemSummary/Item.php new file mode 100644 index 0000000000000000000000000000000000000000..7664b84124a588f33e5b5f4a128fd65eeec4ed3a --- /dev/null +++ b/plugins/CoreHome/SystemSummary/Item.php @@ -0,0 +1,94 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + * + */ +namespace Piwik\Plugins\CoreHome\SystemSummary; + +/** + * This class can be used to add a new entry / item to the system summary widget. + * + * @api + */ +class Item +{ + private $key; + private $label; + private $value; + private $urlParams; + private $icon; + private $order; + + /** + * Item constructor. + * @param string $key The key or ID for this item. The entry in the widget will have this class so it is possible + * to style it individually and other plugins can use this key to for example remove this item + * from the list of system summary items. + * @param string $label The label that will be displayed for this item. The label may already include the value such as "5 segments" + * @param string|null $value Optional label. If given, the value will be displayed after the label separated by a colon, eg: "Segments: 5" + * @param array|null $urlParams Optional URL to make the item clickable. Accepts an array of URL parameters that need to be modfified. + * @param string $icon Optional icon css class, eg "icon-user". + * @param int $order Optional sort order. The lower the value, the higher up the entry will be shown + */ + public function __construct($key, $label, $value = null, $urlParams = null, $icon = '', $order = 99) + { + $this->key = $key; + $this->label = $label; + $this->value = $value; + $this->urlParams = $urlParams; + $this->icon = $icon; + $this->order = $order; + } + + /** + * @return string + */ + public function getKey() + { + return $this->key; + } + + /** + * @return string + */ + public function getLabel() + { + return $this->label; + } + + /** + * @return mixed + */ + public function getValue() + { + return $this->value; + } + + /** + * @return array|null + */ + public function getUrlParams() + { + return $this->urlParams; + } + + /** + * @return string + */ + public function getIcon() + { + return $this->icon; + } + + /** + * @return int + */ + public function getOrder() + { + return $this->order; + } + +} diff --git a/plugins/CoreHome/Widgets/GetSystemSummary.php b/plugins/CoreHome/Widgets/GetSystemSummary.php index f68ce36d4f85c31fe69c54e91c7e4b0b71d8ecec..a90d7b0586ded035ec8e0465aaa3c99fd74dfe24 100644 --- a/plugins/CoreHome/Widgets/GetSystemSummary.php +++ b/plugins/CoreHome/Widgets/GetSystemSummary.php @@ -12,11 +12,11 @@ use Piwik\API\Request; use Piwik\Db; use Piwik\Piwik; use Piwik\Plugin; +use Piwik\Plugins\CoreHome\SystemSummary\Item; use Piwik\Plugins\SegmentEditor\Services\StoredSegmentService; use Piwik\Version; use Piwik\Widget\Widget; use Piwik\Widget\WidgetConfig; -use Piwik\View; class GetSystemSummary extends Widget { @@ -46,39 +46,70 @@ class GetSystemSummary extends Widget public function render() { - $userLogins = Request::processRequest('UsersManager.getUsersLogin', array('filter_limit' => '-1')); - $websites = Request::processRequest('SitesManager.getAllSites', array('filter_limit' => '-1')); + $mysqlVersion = $this->getMySqlVersion(); - $numUsers = count($userLogins); - if (in_array('anonymous', $userLogins)) { - $numUsers--; - } + $systemSummary = array(); + + /** + * Triggered to add system summary items that are shown in the System Summary widget. + * + * **Example** + * + * public function addSystemSummaryItem(&$systemSummary) + * { + * $numUsers = 5; + * $systemSummary[] = new SystemSummary\Item($key = 'users', Piwik::translate('General_NUsers', $numUsers), $value = null, array('module' => 'UsersManager', 'action' => 'index'), $icon = 'icon-user'); + * } + * + * @param Item[] &$systemSummary An array containing system summary items. + */ + Piwik::postEvent('System.addSystemSummaryItems', array(&$systemSummary)); + + $systemSummary[] = new Item($key = 'piwik-version', Piwik::translate('CoreHome_SystemSummaryPiwikVersion'), Version::VERSION, $url = null, $icon = '', $order = 21); + $systemSummary[] = new Item($key = 'php-version', Piwik::translate('CoreHome_SystemSummaryMysqlVersion'), $mysqlVersion, $url = null, $icon = '', $order = 22); + $systemSummary[] = new Item($key = 'mysql-version', Piwik::translate('CoreHome_SystemSummaryPhpVersion'), phpversion(), $url = null, $icon = '', $order = 23); + + $systemSummary = array_filter($systemSummary); + usort($systemSummary, function ($itemA, $itemB) { + if ($itemA->getOrder() == $itemB->getOrder()) { + return 0; + } + if ($itemA->getOrder() > $itemB->getOrder()) { + return 1; + } + return -1; + }); + + /** + * Triggered to filter system summary items that are shown in the System Summary widget. A plugin might also + * sort the system summary items differently. + * + * **Example** + * + * public function filterSystemSummaryItems(&$systemSummary) + * { + * foreach ($systemSummaryItems as $index => $item) { + * if ($item && $item->getKey() === 'users') { + * $systemSummaryItems[$index] = null; + * } + * } + * } + * + * @param Item[] &$systemSummary An array containing system summary items. + */ + Piwik::postEvent('System.filterSystemSummaryItems', array(&$systemSummary)); + + $systemSummary = array_filter($systemSummary); return $this->renderTemplate('getSystemSummary', array( - 'numWebsites' => count($websites), - 'numUsers' => $numUsers, - 'numSegments' => $this->getNumSegments(), - 'numPlugins' => $this->getNumActivatedPlugins(), - 'piwikVersion' => Version::VERSION, - 'mySqlVersion' => $this->getMySqlVersion(), - 'phpVersion' => phpversion() + 'items' => $systemSummary )); } - private function getNumSegments() - { - $segments = $this->storedSegmentService->getAllSegmentsAndIgnoreVisibility(); - return count($segments); - } - private function getMySqlVersion() { $db = Db::get(); return $db->getServerVersion(); } - private function getNumActivatedPlugins() - { - return $this->pluginManager->getNumberOfActivatedPluginsExcludingAlwaysActivated(); - } } \ No newline at end of file diff --git a/plugins/CoreHome/templates/getSystemSummary.twig b/plugins/CoreHome/templates/getSystemSummary.twig index 264162c180ec6d576987c2ed08e27cae7c787c5f..aeaa07caed875501a4b6c64c5cdecf565f3dcc42 100644 --- a/plugins/CoreHome/templates/getSystemSummary.twig +++ b/plugins/CoreHome/templates/getSystemSummary.twig @@ -1,28 +1,26 @@ <div class="widgetBody systemSummary"> - <div> - <span class="icon icon-user"></span> - <a href="{{ linkTo({'module': 'UsersManager', 'action': 'index'}) }}">{{ 'General_NUsers'|translate(numUsers) }}</a> - </div> - <div> - <span><span class="icon icon-segment"></span> {{ 'CoreHome_SystemSummaryNSegments'|translate(numSegments) }}</span> - </div> - <div> - <a href="{{ linkTo({'module': 'SitesManager', 'action': 'index'}) }}">{{ 'CoreHome_SystemSummaryNWebsites'|translate(numWebsites) }}</a> - </div> - <div> - <a href="{{ linkTo({'module': 'CorePluginsAdmin', 'action': 'plugins'}) }}">{{ 'CoreHome_SystemSummaryNActivatedPlugins'|translate(numPlugins) }}</a> - </div> - <div> - <span>{{ 'CoreHome_SystemSummaryPiwikVersion'|translate }}:</span> - <span class="piwik-version">{{ piwikVersion }}</span> - </div> - <div> - <span>{{ 'CoreHome_SystemSummaryMysqlVersion'|translate }}:</span> - <span>{{ mySqlVersion }}</span> - </div> - <div> - <span>{{ 'CoreHome_SystemSummaryPhpVersion'|translate }}:</span> - <span>{{ phpVersion }}</span> - </div> + {% for item in items %} + {% if item is not empty %} + <div class="systemSummaryItem {% if item.getKey %}{{ item.getKey }}{% endif %}"> + {% if item.getIcon %}<span class="icon {{ item.getIcon }}"></span>{% endif %} + + {% if item.getUrlParams -%} + <a href="{{ linkTo(item.getUrlParams) }}" class="itemLabel"> + {% else -%} + <span class="itemLabel"> + {% endif -%} + + {{ item.getLabel }}{% if item.getValue %}:{% endif %} + + {%- if item.getUrlParams %} + </a> + {%- else %} + </span> + {%- endif %} + + {% if item.getValue %}<span class="itemValue">{{ item.getValue }}</span>{% endif %} + </div> + {% endif %} + {% endfor %} <br /> </div> \ No newline at end of file diff --git a/plugins/CorePluginsAdmin/CorePluginsAdmin.php b/plugins/CorePluginsAdmin/CorePluginsAdmin.php index d1c0a3fee11bbc8057938f275d01a82234a633bb..8008fe529cc61f6c31431b6c5801df8db97e218b 100644 --- a/plugins/CorePluginsAdmin/CorePluginsAdmin.php +++ b/plugins/CorePluginsAdmin/CorePluginsAdmin.php @@ -9,7 +9,9 @@ namespace Piwik\Plugins\CorePluginsAdmin; use Piwik\Config; +use Piwik\Piwik; use Piwik\Plugin; +use Piwik\Plugins\CoreHome\SystemSummary; class CorePluginsAdmin extends Plugin { @@ -21,10 +23,17 @@ class CorePluginsAdmin extends Plugin return array( 'AssetManager.getJavaScriptFiles' => 'getJsFiles', 'AssetManager.getStylesheetFiles' => 'getStylesheetFiles', + 'System.addSystemSummaryItems' => 'addSystemSummaryItems', 'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys' ); } + public function addSystemSummaryItems(&$systemSummary) + { + $numPlugins = Plugin\Manager::getInstance()->getNumberOfActivatedPluginsExcludingAlwaysActivated(); + $systemSummary[] = new SystemSummary\Item($key = 'plugins', Piwik::translate('CoreHome_SystemSummaryNActivatedPlugins', $numPlugins), $value = null, $url = array('module' => 'CorePluginsAdmin', 'action' => 'plugins'), $icon = '', $order = 11); + } + public function getStylesheetFiles(&$stylesheets) { $stylesheets[] = "plugins/CorePluginsAdmin/stylesheets/plugins_admin.less"; diff --git a/plugins/SegmentEditor/SegmentEditor.php b/plugins/SegmentEditor/SegmentEditor.php index f3ea172a54fede0d4055ea1f85ab6e51b0a8ca8e..63cee53c30265922471827096d680f22c4ede636 100644 --- a/plugins/SegmentEditor/SegmentEditor.php +++ b/plugins/SegmentEditor/SegmentEditor.php @@ -9,7 +9,9 @@ namespace Piwik\Plugins\SegmentEditor; use Piwik\Config; -use Piwik\Db; +use Piwik\Container\StaticContainer; +use Piwik\Piwik; +use Piwik\Plugins\CoreHome\SystemSummary; /** */ @@ -26,10 +28,19 @@ class SegmentEditor extends \Piwik\Plugin 'AssetManager.getJavaScriptFiles' => 'getJsFiles', 'AssetManager.getStylesheetFiles' => 'getStylesheetFiles', 'Template.nextToCalendar' => 'getSegmentEditorHtml', + 'System.addSystemSummaryItems' => 'addSystemSummaryItems', 'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys', ); } + public function addSystemSummaryItems(&$systemSummary) + { + $storedSegments = StaticContainer::get('Piwik\Plugins\SegmentEditor\Services\StoredSegmentService'); + $segments = $storedSegments->getAllSegmentsAndIgnoreVisibility(); + $numSegments = count($segments); + $systemSummary[] = new SystemSummary\Item($key = 'segments', Piwik::translate('CoreHome_SystemSummaryNSegments', $numSegments), $value = null, $url = null, $icon = 'icon-segment', $order = 6); + } + function getSegmentEditorHtml(&$out) { $selector = new SegmentSelectorControl(); diff --git a/plugins/SitesManager/SitesManager.php b/plugins/SitesManager/SitesManager.php index 514f0f426d85416a9b312ea9f839284b79c3f5da..1154e2cc1050ea3f06d1d57d6a4a41ab7860ad67 100644 --- a/plugins/SitesManager/SitesManager.php +++ b/plugins/SitesManager/SitesManager.php @@ -8,12 +8,12 @@ */ namespace Piwik\Plugins\SitesManager; +use Piwik\API\Request; use Piwik\Common; -use Piwik\Archive\ArchiveInvalidator; use Piwik\Container\StaticContainer; -use Piwik\Db; +use Piwik\Piwik; +use Piwik\Plugins\CoreHome\SystemSummary; use Piwik\Plugins\PrivacyManager\PrivacyManager; -use Piwik\Measurable\Settings\Storage; use Piwik\Settings\Storage\Backend\MeasurableSettingsTable; use Piwik\Tracker\Cache; use Piwik\Tracker\Model as TrackerModel; @@ -28,7 +28,7 @@ class SitesManager extends \Piwik\Plugin const KEEP_URL_FRAGMENT_NO = 2; /** - * @see Piwik\Plugin::registerEvents + * @see \Piwik\Plugin::registerEvents */ public function registerEvents() { @@ -38,10 +38,18 @@ class SitesManager extends \Piwik\Plugin 'Tracker.Cache.getSiteAttributes' => 'recordWebsiteDataInCache', 'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys', 'SitesManager.deleteSite.end' => 'onSiteDeleted', + 'System.addSystemSummaryItems' => 'addSystemSummaryItems', 'Request.dispatch' => 'redirectDashboardToWelcomePage', ); } + public function addSystemSummaryItems(&$systemSummary) + { + $websites = Request::processRequest('SitesManager.getAllSites', array('filter_limit' => '-1')); + $numWebsites = count($websites); + $systemSummary[] = new SystemSummary\Item($key = 'websites', Piwik::translate('CoreHome_SystemSummaryNWebsites', $numWebsites), $value = null, $url = array('module' => 'SitesManager', 'action' => 'index'), $icon = '', $order = 10); + } + public function redirectDashboardToWelcomePage(&$module, &$action) { if ($module !== 'CoreHome' || $action !== 'index') { diff --git a/plugins/UsersManager/UsersManager.php b/plugins/UsersManager/UsersManager.php index f22d2b63eddcca1c84146b5c9ef43c835f546ce6..95620a6182a0cc5c1a08b6cdc2a527387a205aa9 100644 --- a/plugins/UsersManager/UsersManager.php +++ b/plugins/UsersManager/UsersManager.php @@ -9,8 +9,10 @@ namespace Piwik\Plugins\UsersManager; use Exception; +use Piwik\API\Request; use Piwik\Option; use Piwik\Piwik; +use Piwik\Plugins\CoreHome\SystemSummary; use Piwik\SettingsPiwik; /** @@ -33,10 +35,23 @@ class UsersManager extends \Piwik\Plugin 'Tracker.Cache.getSiteAttributes' => 'recordAdminUsersInCache', 'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys', 'Platform.initialized' => 'onPlatformInitialized', + 'System.addSystemSummaryItems' => 'addSystemSummaryItems', 'CronArchive.getTokenAuth' => 'getCronArchiveTokenAuth' ); } + public function addSystemSummaryItems(&$systemSummary) + { + $userLogins = Request::processRequest('UsersManager.getUsersLogin', array('filter_limit' => '-1')); + + $numUsers = count($userLogins); + if (in_array('anonymous', $userLogins)) { + $numUsers--; + } + + $systemSummary[] = new SystemSummary\Item($key = 'users', Piwik::translate('General_NUsers', $numUsers), $value = null, array('module' => 'UsersManager', 'action' => 'index'), $icon = 'icon-user', $order = 5); + } + public function onPlatformInitialized() { $lastSeenTimeLogger = new LastSeenTimeLogger(); diff --git a/tests/resources/screenshot-override/override.css b/tests/resources/screenshot-override/override.css index a38e0ed84d98eeddc9036d1a09d8d988cdbdbaa2..bda7f2a260e6d46c14b79b5c4c9e9958fef8cb23 100644 --- a/tests/resources/screenshot-override/override.css +++ b/tests/resources/screenshot-override/override.css @@ -10,6 +10,7 @@ display:none; } +.piwik-version .itemValue, span.piwik-version, span.plugin-version { visibility:hidden;