site-accueil-insa/matomo/plugins/CoreHome/Controller.php

329 lines
11 KiB
PHP

<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome;
use Exception;
use Piwik\API\Request;
use Piwik\Common;
use Piwik\DataTable\Renderer\Json;
use Piwik\Date;
use Piwik\FrontController;
use Piwik\Notification\Manager as NotificationManager;
use Piwik\Piwik;
use Piwik\Plugin\Report;
use Piwik\Plugins\Marketplace\Marketplace;
use Piwik\SettingsPiwik;
use Piwik\Widget\Widget;
use Piwik\Plugins\CoreHome\DataTableRowAction\MultiRowEvolution;
use Piwik\Plugins\CoreHome\DataTableRowAction\RowEvolution;
use Piwik\Plugins\Dashboard\DashboardManagerControl;
use Piwik\Plugins\UsersManager\API;
use Piwik\Translation\Translator;
use Piwik\UpdateCheck;
use Piwik\Url;
use Piwik\View;
use Piwik\ViewDataTable\Manager as ViewDataTableManager;
use Piwik\Widget\WidgetConfig;
class Controller extends \Piwik\Plugin\Controller
{
/**
* @var Translator
*/
private $translator;
public function __construct(Translator $translator)
{
$this->translator = $translator;
parent::__construct();
}
public function getDefaultAction()
{
return 'redirectToCoreHomeIndex';
}
public function renderReportWidget(Report $report)
{
Piwik::checkUserHasSomeViewAccess();
$this->checkSitePermission();
$report->checkIsEnabled();
return $report->render();
}
/**
* This is only used for exported widgets
* @return string
* @throws Exception
* @throws \Piwik\NoAccessException
*/
public function renderWidgetContainer()
{
Piwik::checkUserHasSomeViewAccess();
$this->checkSitePermission();
$view = new View('@CoreHome/widgetContainer');
$view->isWidgetized = (bool) Common::getRequestVar('widget', 0, 'int');
$view->containerId = Common::getRequestVar('containerId', null, 'string');
return $view->render();
}
/**
* @param Widget $widget
* @return mixed
* @throws Exception
*/
public function renderWidget($widget)
{
Piwik::checkUserHasSomeViewAccess();
$config = new WidgetConfig();
$widget::configure($config);
$content = $widget->render();
if ($config->getName() && Common::getRequestVar('showtitle', '', 'string') === '1') {
if (strpos($content, '<h2') !== false
|| strpos($content, ' content-title=') !== false
|| strpos($content, ' piwik-enriched-headline') !== false
|| strpos($content, '<h1') !== false ) {
// already includes title
return $content;
}
if (strpos($content, 'piwik-content-block') === false
&& strpos($content, 'class="card"') === false
&& strpos($content, "class='card'") === false
&& strpos($content, 'class="card-content"') === false
&& strpos($content, "class='card-content'") === false) {
$view = new View('@CoreHome/_singleWidget');
$view->title = $config->getName();
$view->content = $content;
return $view->render();
}
}
return $content;
}
function redirectToCoreHomeIndex()
{
$defaultReport = API::getInstance()->getUserPreference(
API::PREFERENCE_DEFAULT_REPORT,
Piwik::getCurrentUserLogin()
);
$module = 'CoreHome';
$action = 'index';
// User preference: default report to load is the All Websites dashboard
if ($defaultReport == 'MultiSites'
&& \Piwik\Plugin\Manager::getInstance()->isPluginActivated('MultiSites')
) {
$module = 'MultiSites';
}
if ($defaultReport == Piwik::getLoginPluginName()) {
$module = Piwik::getLoginPluginName();
}
parent::redirectToIndex($module, $action, $this->idSite);
}
public function showInContext()
{
$controllerName = Common::getRequestVar('moduleToLoad');
$actionName = Common::getRequestVar('actionToLoad', 'index');
if($controllerName == 'API') {
throw new Exception("Showing API requests in context is not supported for security reasons. Please change query parameter 'moduleToLoad'.");
}
if ($actionName == 'showInContext') {
throw new Exception("Preventing infinite recursion...");
}
$view = $this->getDefaultIndexView();
$view->content = FrontController::getInstance()->fetchDispatch($controllerName, $actionName);
return $view->render();
}
public function markNotificationAsRead()
{
Piwik::checkUserHasSomeViewAccess();
$this->checkTokenInUrl();
$notificationId = Common::getRequestVar('notificationId');
NotificationManager::cancel($notificationId);
Json::sendHeaderJSON();
return json_encode(true);
}
protected function getDefaultIndexView()
{
if (SettingsPiwik::isInternetEnabled() && Marketplace::isMarketplaceEnabled()) {
$this->securityPolicy->addPolicy('img-src', '*.matomo.org');
$this->securityPolicy->addPolicy('default-src', '*.matomo.org');
}
$view = new View('@CoreHome/getDefaultIndexView');
$this->setGeneralVariablesView($view);
$view->showMenu = true;
$view->dashboardSettingsControl = new DashboardManagerControl();
$view->content = '';
return $view;
}
protected function setDateTodayIfWebsiteCreatedToday()
{
$date = Common::getRequestVar('date', false);
if ($date == 'today'
|| Common::getRequestVar('period', false) == 'range'
) {
return;
}
if ($this->site) {
$datetimeCreationDate = $this->site->getCreationDate()->getDatetime();
$creationDateLocalTimezone = Date::factory($datetimeCreationDate, $this->site->getTimezone())->toString('Y-m-d');
$todayLocalTimezone = Date::factory('now', $this->site->getTimezone())->toString('Y-m-d');
if ($creationDateLocalTimezone == $todayLocalTimezone) {
Piwik::redirectToModule('CoreHome', 'index',
array('date' => 'today',
'idSite' => $this->idSite,
'period' => Common::getRequestVar('period'))
);
}
}
}
public function index()
{
$this->setDateTodayIfWebsiteCreatedToday();
$view = $this->getDefaultIndexView();
return $view->render();
}
// --------------------------------------------------------
// ROW EVOLUTION
// The following methods render the popover that shows the
// evolution of a single or multiple rows in a data table
// --------------------------------------------------------
/** Render the entire row evolution popover for a single row */
public function getRowEvolutionPopover()
{
$rowEvolution = $this->makeRowEvolution($isMulti = false);
$view = new View('@CoreHome/getRowEvolutionPopover');
return $rowEvolution->renderPopover($this, $view);
}
/** Render the entire row evolution popover for multiple rows */
public function getMultiRowEvolutionPopover()
{
$rowEvolution = $this->makeRowEvolution($isMulti = true);
$view = new View('@CoreHome/getMultiRowEvolutionPopover');
return $rowEvolution->renderPopover($this, $view);
}
/** Generic method to get an evolution graph or a sparkline for the row evolution popover */
public function getRowEvolutionGraph($fetch = false, $rowEvolution = null)
{
if (empty($rowEvolution)) {
$label = Common::getRequestVar('label', '', 'string');
$isMultiRowEvolution = strpos($label, ',') !== false;
$rowEvolution = $this->makeRowEvolution($isMultiRowEvolution, $graphType = 'graphEvolution');
$rowEvolution->useAvailableMetrics();
}
$view = $rowEvolution->getRowEvolutionGraph();
return $this->renderView($view);
}
/** Utility function. Creates a RowEvolution instance. */
private function makeRowEvolution($isMultiRowEvolution, $graphType = null)
{
if ($isMultiRowEvolution) {
return new MultiRowEvolution($this->idSite, $this->date, $graphType);
} else {
return new RowEvolution($this->idSite, $this->date, $graphType);
}
}
/**
* Forces a check for updates and re-renders the header message.
*
* This will check piwik.org at most once per 10s.
*/
public function checkForUpdates()
{
Piwik::checkUserHasSomeAdminAccess();
$this->checkTokenInUrl();
// perform check (but only once every 10s)
UpdateCheck::check($force = false, UpdateCheck::UI_CLICK_CHECK_INTERVAL);
$view = new View('@CoreHome/checkForUpdates');
$this->setGeneralVariablesView($view);
return $view->render();
}
/**
* Redirects the user to a paypal so they can donate to Piwik.
*/
public function redirectToPaypal()
{
$parameters = Request::getRequestArrayFromString($request = null);
foreach ($parameters as $name => $param) {
if ($name == 'idSite'
|| $name == 'module'
|| $name == 'action'
) {
unset($parameters[$name]);
}
}
$paypalParameters = [
"cmd" => "_s-xclick"
];
if (empty($parameters["onetime"]) || $parameters["onetime"] != "true") {
$paypalParameters["hosted_button_id"] = "DVKLY73RS7JTE";
$paypalParameters["currency_code"] = "USD";
$paypalParameters["on0"] = "Piwik Supporter";
if (!empty($parameters["os0"])) {
$paypalParameters["os0"] = $parameters["os0"];
}
} else {
$paypalParameters["hosted_button_id"] = "RPL23NJURMTFA";
}
$url = "https://www.paypal.com/cgi-bin/webscr?" . Url::getQueryStringFromParameters($paypalParameters);
Url::redirectToUrl($url);
exit;
}
public function saveViewDataTableParameters()
{
Piwik::checkUserIsNotAnonymous();
$this->checkTokenInUrl();
$reportId = Common::getRequestVar('report_id', null, 'string');
$parameters = (array) Common::getRequestVar('parameters', null, 'json');
$login = Piwik::getCurrentUserLogin();
$containerId = Common::getRequestVar('containerId', '', 'string');
ViewDataTableManager::saveViewDataTableParameters($login, $reportId, $parameters, $containerId);
}
}