public function sendToBrowserDownload($filename) { $this->epilogue(); $filename = Piwik_ReportRenderer::appendExtension($filename, "html"); Piwik::overrideCacheControlHeaders(); header('Content-Description: File Transfer'); header('Content-Type: text/html'); header('Content-Disposition: attachment; filename="'.basename($filename).'";'); header('Content-Length: '.strlen($this->rendering)); echo $this->rendering; }
public function sendToBrowserInline($filename) { Piwik_ReportRenderer::inlineToBrowser(self::SMS_CONTENT_TYPE, $this->rendering); }
/** * Generates a report file. * * @param int $idReport ID of the report to generate. * @param string $date YYYY-MM-DD * @param bool|false|string $language If not passed, will use default language. * @param bool|false|int $outputType 1 = download report, 2 = save report to disk, 3 = output report in browser, 4 = return report content to caller, defaults to download * @param bool|false|string $period Defaults to 'day'. If not specified, will default to the report's period set when creating the report * @param bool|false|string $reportFormat 'pdf', 'html' or any other format provided via the PDFReports.getReportFormats hook * @param bool|false|array $parameters array of parameters * @return array|void */ public function generateReport($idReport, $date, $language = false, $outputType = false, $period = false, $reportFormat = false, $parameters = false) { Piwik::checkUserIsNotAnonymous(); // load specified language if (empty($language)) { $language = Piwik_Translate::getInstance()->getLanguageDefault(); } Piwik_Translate::getInstance()->reloadLanguage($language); $reports = $this->getReports($idSite = false, $_period = false, $idReport); $report = reset($reports); $idSite = $report['idsite']; $reportType = $report['type']; // override report period if (empty($period)) { $period = $report['period']; } // override report format if (!empty($reportFormat)) { self::validateReportFormat($reportType, $reportFormat); $report['format'] = $reportFormat; } else { $reportFormat = $report['format']; } // override report parameters if (!empty($parameters)) { $report['parameters'] = Piwik_Common::json_decode(self::validateReportParameters($reportType, $parameters), true); } else { $parameters = $report['parameters']; } // decode report list $reportUniqueIds = $report['reports']; // available reports $availableReportMetadata = Piwik_API_API::getInstance()->getReportMetadata($idSite); // we need to lookup which reports metadata are registered in this report $reportMetadata = array(); foreach ($availableReportMetadata as $metadata) { if (in_array($metadata['uniqueId'], $reportUniqueIds)) { $reportMetadata[] = $metadata; } } // the report will be rendered with the first 23 rows and will aggregate other rows in a summary row // 23 rows table fits in one portrait page $initialFilterTruncate = Piwik_Common::getRequestVar('filter_truncate', false); $_GET['filter_truncate'] = self::REPORT_TRUNCATE; $prettyDate = null; $processedReports = array(); foreach ($reportMetadata as $action) { $apiModule = $action['module']; $apiAction = $action['action']; $apiParameters = array(); if (isset($action['parameters'])) { $apiParameters = $action['parameters']; } $mustRestoreGET = false; // all Websites dashboard should not be truncated in the report if ($apiModule == 'MultiSites') { $mustRestoreGET = $_GET; $_GET['enhanced'] = true; if ($apiAction == 'getAll') { $_GET['filter_truncate'] = false; // when a view/admin user created a report, workaround the fact that "Super User" // is enforced in Scheduled tasks, and ensure Multisites.getAll only return the websites that this user can access if (!empty($userLogin) && $userLogin != Piwik_Config::getInstance()->superuser['login']) { $_GET['_restrictSitesToLogin'] = $userLogin; } } } $processedReport = Piwik_API_API::getInstance()->getProcessedReport($idSite, $period, $date, $apiModule, $apiAction, $segment = false, $apiParameters, $idGoal = false, $language); // TODO add static method getPrettyDate($period, $date) in Piwik_Period $prettyDate = $processedReport['prettyDate']; if ($mustRestoreGET) { $_GET = $mustRestoreGET; } $processedReports[] = $processedReport; } // restore filter truncate parameter value if ($initialFilterTruncate !== false) { $_GET['filter_truncate'] = $initialFilterTruncate; } $notificationInfo = array(self::REPORT_TYPE_INFO_KEY => $reportType, self::REPORT_KEY => $report); // allow plugins to alter processed reports Piwik_PostEvent(self::PROCESS_REPORTS_EVENT, $processedReports, $notificationInfo); // retrieve report renderer instance $reportRenderer = null; Piwik_PostEvent(self::GET_RENDERER_INSTANCE_EVENT, $reportRenderer, $notificationInfo); // init report renderer $reportRenderer->setLocale($language); $reportRenderer->setRenderImageInline($outputType != self::OUTPUT_SAVE_ON_DISK); // render report $websiteName = Piwik_Site::getNameFor($idSite); $description = str_replace(array("\r", "\n"), ' ', $report['description']); $reportRenderer->renderFrontPage($websiteName, $prettyDate, $description, $reportMetadata); array_walk($processedReports, array($reportRenderer, 'renderReport')); switch ($outputType) { case self::OUTPUT_SAVE_ON_DISK: $outputFilename = strtoupper($reportFormat) . ' ' . ucfirst($reportType) . ' Report - ' . $idReport . '.' . $date . '.' . $idSite . '.' . $language; $outputFilename = $reportRenderer->sendToDisk($outputFilename); $additionalFiles = array(); if ($reportRenderer instanceof Piwik_ReportRenderer_Html) { foreach ($processedReports as &$report) { if ($report['displayGraph']) { $additionalFile = array(); $additionalFile['filename'] = $report['metadata']['name'] . '.png'; $additionalFile['cid'] = $report['metadata']['uniqueId']; $additionalFile['content'] = Piwik_ReportRenderer::getStaticGraph($report['metadata']['imageGraphUrl'], Piwik_ReportRenderer_Html::IMAGE_GRAPH_WIDTH, Piwik_ReportRenderer_Html::IMAGE_GRAPH_HEIGHT); $additionalFile['mimeType'] = 'image/png'; $additionalFile['encoding'] = Zend_Mime::ENCODING_BASE64; $additionalFiles[] = $additionalFile; } } } return array($outputFilename, $prettyDate, $websiteName, $additionalFiles); break; case self::OUTPUT_INLINE: $reportRenderer->sendToBrowserInline("{$websiteName} - {$prettyDate} - {$description}"); break; case self::OUTPUT_RETURN: return $reportRenderer->getRenderedReport(); break; default: case self::OUTPUT_DOWNLOAD: $reportRenderer->sendToBrowserDownload("{$websiteName} - {$prettyDate} - {$description}"); break; } }
/** * Generates a report file. * * @param int $idReport ID of the report to generate. If idReport=0 it will generate a report containing all reports * for the specified period & date * @param string $date YYYY-MM-DD * @param int|false $idSite * @param string|false $language If not passed, will use default language. * @param int|false $outputType 1 = download report, 2 = save report to disk, defaults to download * @param string|false $period Defaults to 'day'. If not specified, will default to the report's period set when creating the report * @param string $reportFormat pdf, html * @param int|false $aggregateReportsFormat 1 = display only tables, 2 = display only graphs, 3 = display both */ public function generateReport($idReport, $date, $idSite = false, $language = false, $outputType = false, $period = false, $reportFormat = false, $aggregateReportsFormat = false) { Piwik::checkUserIsNotAnonymous(); // Load specified language if (empty($language)) { $language = Piwik_Translate::getInstance()->getLanguageDefault(); } Piwik_Translate::getInstance()->reloadLanguage($language); // Available reports $reportMetadata = Piwik_API_API::getInstance()->getReportMetadata($idSite); // Test template: include all reports if ($idReport == 0) { if (empty($period)) { $period = 'day'; } if (empty($reportFormat)) { $reportFormat = Piwik_PDFReports::DEFAULT_FORMAT; } if (empty($aggregateReportsFormat)) { $aggregateReportsFormat = Piwik_PDFReports::DEFAULT_AGGREGATE_REPORTS_FORMAT; } $reports = array(); foreach ($reportMetadata as $report) { if ($report['category'] != 'API') { $reports[] = $report; } } $description = Piwik_Translate('PDFReports_DefaultContainingAllReports'); } else { $pdfReports = $this->getReports($idSite, $_period = false, $idReport); $pdfReport = reset($pdfReports); $reportUniqueIds = explode(',', $pdfReport['reports']); $description = $pdfReport['description']; // If period wasn't specified, we shall default to the report's period if (empty($period)) { $period = 'day'; if ($pdfReport['period'] != 'never') { $period = $pdfReport['period']; } } // If format wasn't specified, defaults to the report's format if (empty($reportFormat)) { $reportFormat = $pdfReport['format']; // Handle cases for reports created before the 'format' field if (empty($reportFormat)) { $reportFormat = Piwik_PDFReports::DEFAULT_FORMAT; } } // If $aggregateReportsFormat wasn't specified, defaults to the report configuration if (empty($aggregateReportsFormat)) { $aggregateReportsFormat = $pdfReport['aggregate_reports_format']; } // We need to lookup which reports metadata are registered in this report $reports = array(); foreach ($reportMetadata as $metadata) { if (in_array($metadata['uniqueId'], $reportUniqueIds)) { $reports[] = $metadata; } } } // prepare the report renderer $reportRenderer = Piwik_ReportRenderer::factory($reportFormat); $reportRenderer->setLocale($language); $reportRenderer->setRenderImageInline($outputType == self::OUTPUT_DOWNLOAD ? true : false); $description = str_replace(array("\r", "\n"), ' ', $description); // The report will be rendered with the first 23 rows and will aggregate other rows in a summary row $filterTruncateGET = Piwik_Common::getRequestVar('filter_truncate', false); $_GET['filter_truncate'] = 23; $websiteName = $prettyDate = false; $processedReports = array(); foreach ($reports as $action) { $apiModule = $action['module']; $apiAction = $action['action']; $apiParameters = array(); if (isset($action['parameters'])) { $apiParameters = $action['parameters']; } $report = Piwik_API_API::getInstance()->getProcessedReport($idSite, $period, $date, $apiModule, $apiAction, $segment = false, $apiParameters, $idGoal = false, $language); $websiteName = $report['website']; $prettyDate = $report['prettyDate']; $reportMetadata = $report['metadata']; $isAggregateReport = !empty($reportMetadata['dimension']); $report['displayTable'] = !$isAggregateReport || $aggregateReportsFormat == Piwik_PDFReports::AGGREGATE_REPORTS_FORMAT_TABLES || $aggregateReportsFormat == Piwik_PDFReports::AGGREGATE_REPORTS_FORMAT_TABLES_GRAPHS; $report['displayGraph'] = (!$isAggregateReport || $aggregateReportsFormat == Piwik_PDFReports::AGGREGATE_REPORTS_FORMAT_GRAPHS || $aggregateReportsFormat == Piwik_PDFReports::AGGREGATE_REPORTS_FORMAT_TABLES_GRAPHS) && Piwik::isGdExtensionEnabled() && Piwik_PluginsManager::getInstance()->isPluginActivated('ImageGraph') && !empty($reportMetadata['imageGraphUrl']); $processedReports[] = $report; } // Restore values if ($filterTruncateGET !== false) { $_GET['filter_truncate'] = $filterTruncateGET; } // generate the report $reportRenderer->renderFrontPage($websiteName, $prettyDate, $description, $reports); array_walk($processedReports, array($reportRenderer, 'renderReport')); switch ($outputType) { case self::OUTPUT_SAVE_ON_DISK: $outputFilename = 'Email Report - ' . $idReport . '.' . $date . '.' . $idSite . '.' . $language; $outputFilename = $reportRenderer->sendToDisk($outputFilename); $additionalFiles = array(); if ($reportFormat == 'html') { foreach ($processedReports as &$report) { if ($report['displayGraph']) { $additionalFile = array(); $additionalFile['filename'] = $report['metadata']['name'] . '.png'; $additionalFile['cid'] = $report['metadata']['uniqueId']; $additionalFile['content'] = Piwik_ReportRenderer::getStaticGraph($report['metadata']['imageGraphUrl'], Piwik_ReportRenderer_Html::IMAGE_GRAPH_WIDTH, Piwik_ReportRenderer_Html::IMAGE_GRAPH_HEIGHT); $additionalFile['mimeType'] = 'image/png'; $additionalFile['encoding'] = Zend_Mime::ENCODING_BASE64; $additionalFiles[] = $additionalFile; } } } return array($outputFilename, $prettyDate, $websiteName, $reportFormat, $additionalFiles); break; default: case self::OUTPUT_DOWNLOAD: $reportRenderer->sendToBrowserDownload("{$websiteName} - {$prettyDate} - {$description}"); break; } }
public function renderReport($processedReport) { $smarty = new Piwik_Smarty(); $this->assignCommonParameters($smarty); $reportMetadata = $processedReport['metadata']; $reportData = $processedReport['reportData']; $columns = $processedReport['columns']; list($reportData, $columns) = self::processTableFormat($reportMetadata, $reportData, $columns); $smarty->assign("reportName", $reportMetadata['name']); $smarty->assign("reportId", $reportMetadata['uniqueId']); $smarty->assign("reportColumns", $columns); $smarty->assign("reportRows", $reportData->getRows()); $smarty->assign("reportRowsMetadata", $processedReport['reportMetadata']->getRows()); $smarty->assign("displayTable", $processedReport['displayTable']); $displayGraph = $processedReport['displayGraph']; $evolutionGraph = $processedReport['evolutionGraph']; $smarty->assign("displayGraph", $displayGraph); if ($displayGraph) { $smarty->assign("graphWidth", self::IMAGE_GRAPH_WIDTH); $smarty->assign("graphHeight", self::IMAGE_GRAPH_HEIGHT); $smarty->assign("renderImageInline", $this->renderImageInline); if ($this->renderImageInline) { $staticGraph = parent::getStaticGraph($reportMetadata, self::IMAGE_GRAPH_WIDTH, self::IMAGE_GRAPH_HEIGHT, $evolutionGraph); $smarty->assign("generatedImageGraph", base64_encode($staticGraph)); unset($generatedImageGraph); } } $this->rendering .= $smarty->fetch(self::prefixTemplatePath("html_report_body.tpl")); }
private function paintGraph() { $imageGraph = parent::getStaticGraph($this->reportMetadata, $this->orientation == self::PORTRAIT ? self::IMAGE_GRAPH_WIDTH_PORTRAIT : self::IMAGE_GRAPH_WIDTH_LANDSCAPE, self::IMAGE_GRAPH_HEIGHT, $this->evolutionGraph); $this->TCPDF->Image('@' . $imageGraph, $x = '', $y = '', $w = 0, $h = 0, $type = '', $link = '', $align = 'N', $resize = false, $dpi = 72, $palign = '', $ismask = false, $imgmask = false, $order = 0, $fitbox = false, $hidden = false, $fitonpage = true, $alt = false, $altimgs = array()); unset($imageGraph); }
/** * @param Piwik_Event_Notification $notification notification object */ function getRendererInstance($notification) { if (self::manageEvent($notification)) { $reportRenderer =& $notification->getNotificationObject(); $notificationInfo = $notification->getNotificationInfo(); $reportFormat = $notificationInfo[Piwik_PDFReports_API::REPORT_KEY]['format']; $reportRenderer = Piwik_ReportRenderer::factory($reportFormat); } }
/** * @param Piwik_Event_Notification $notification notification object */ function getRendererInstance($notification) { if (self::manageEvent($notification)) { $reportRenderer =& $notification->getNotificationObject(); $notificationInfo = $notification->getNotificationInfo(); $reportFormat = $notificationInfo[Piwik_PDFReports_API::REPORT_KEY]['format']; $outputType = $notificationInfo[Piwik_PDFReports_API::OUTPUT_TYPE_INFO_KEY]; $reportRenderer = Piwik_ReportRenderer::factory($reportFormat); if ($reportFormat == Piwik_ReportRenderer::HTML_FORMAT) { $reportRenderer->setRenderImageInline($outputType != Piwik_PDFReports_API::OUTPUT_SAVE_ON_DISK); } } }
private function paintGraph() { if ($this->orientation == self::PORTRAIT) { $imageWidth = self::IMAGE_GRAPH_WIDTH_PORTRAIT; $imageHeight = self::IMAGE_GRAPH_HEIGHT_PORTRAIT; } else { $imageWidth = self::IMAGE_GRAPH_WIDTH_LANDSCAPE; $imageHeight = self::IMAGE_GRAPH_HEIGHT_LANDSCAPE; } $imageGraphUrl = $this->reportMetadata['imageGraphUrl']; $imageGraph = parent::getStaticGraph($imageGraphUrl, $imageWidth, $imageHeight); $this->TCPDF->Image('@' . $imageGraph, $x = '', $y = '', $w = 0, $h = 0, $type = '', $link = '', $align = 'N', $resize = false, $dpi = 72, $palign = '', $ismask = false, $imgmask = false, $order = 0, $fitbox = false, $hidden = false, $fitonpage = true, $alt = false, $altimgs = array()); unset($imageGraph); }
protected static function sendToBrowser($filename, $extension, $contentType, $content) { $filename = Piwik_ReportRenderer::appendExtension($filename, $extension); Piwik::overrideCacheControlHeaders(); header('Content-Description: File Transfer'); header('Content-Type: ' . $contentType); header('Content-Disposition: attachment; filename="' . str_replace('"', '\'', basename($filename)) . '";'); header('Content-Length: ' . strlen($content)); echo $content; }
public function sendToBrowserDownload($filename) { $filename = Piwik_ReportRenderer::appendExtension($filename, "pdf"); $this->TCPDF->Output($filename, 'D'); }
public function sendToBrowserInline($filename) { Piwik_ReportRenderer::inlineToBrowser(Piwik_MobileMessaging_ReportRenderer_Sms::SMS_CONTENT_TYPE, $this->rendering); }
/** * Generates a report file. * * @param int $idReport ID of the report to generate. If idReport=0 it will generate a report containing all reports * for the specified period & date * @param string $date YYYY-MM-DD * @param int|false $idSite * @param string|false $language If not passed, will use default language. * @param int|false $outputType 1 = download report, 2 = save report to disk, defaults to download * @param string|false $period Defaults to 'day'. If not specified, will default to the report's period set when creating the report * @param string $reportFormat pdf, html */ public function generateReport($idReport, $date, $idSite = false, $language = false, $outputType = false, $period = false, $reportFormat = false) { // Load specified language if(empty($language)) { $language = Piwik_Translate::getInstance()->getLanguageDefault(); } Piwik_Translate::getInstance()->reloadLanguage($language); // Available reports static $reportMetadata = null; if(is_null($reportMetadata)) { $reportMetadata = Piwik_API_API::getInstance()->getReportMetadata($idSite); } // Test template: include all reports if($idReport == 0) { if(empty($period)) { $period = 'day'; } if(empty($reportFormat)) { $reportFormat = Piwik_PDFReports::DEFAULT_FORMAT; } $reports = $reportMetadata; $description = Piwik_Translate('PDFReports_DefaultContainingAllReports'); } // Template is a custom template else { $pdfReports = $this->getReports($idSite, $_period = false, $idReport); $pdfReport = reset($pdfReports); $reportUniqueIds = explode(',', $pdfReport['reports']); $description = $pdfReport['description']; // If period wasn't specified, we shall default to the report's period if(empty($period)) { $period = 'day'; if($pdfReport['period'] != 'never') { $period = $pdfReport['period']; } } // If format wasn't specified, defaults to the report's format if(empty($reportFormat)) { $reportFormat = $pdfReport['format']; // Handle cases for reports created before the 'format' field if(empty($reportFormat)) { $reportFormat = Piwik_PDFReports::DEFAULT_FORMAT; } } // We need to lookup which reports metadata are registered in this report $reports = array(); foreach($reportMetadata as $metadata) { if(in_array($metadata['uniqueId'], $reportUniqueIds)) { $reports[] = $metadata; } } } // The report will be rendered with the first 30 rows and will aggregate other rows in a summary row $filterTruncateGET = Piwik_Common::getRequestVar('filter_truncate', false); $_GET['filter_truncate'] = 30; $websiteName = $prettyDate = false; $processedReports = array(); foreach ($reports as $action) { $apiModule = $action['module']; $apiAction = $action['action']; $apiParameters = array(); if(isset($action['parameters'])) { $apiParameters = $action['parameters']; } $report = Piwik_API_API::getInstance()->getProcessedReport($idSite, $period, $date, $apiModule, $apiAction, $segment = false, $apiParameters, $idGoal = false, $language); $websiteName = $report['website']; $prettyDate = $report['prettyDate']; $processedReports[] = $report; } // Restore values if($filterTruncateGET !== false) { $_GET['filter_truncate'] = $filterTruncateGET; } if(empty($reportFormat)) { $reportFormat = Piwik_PDFReports::DEFAULT_FORMAT; } // Generate the report $reportRenderer = Piwik_ReportRenderer::factory($reportFormat); $reportRenderer->setLocale($language); $reportRenderer->renderFrontPage($websiteName, $prettyDate, $description, $reports ); array_walk($processedReports, array($reportRenderer, 'renderReport')); switch($outputType) { case self::OUTPUT_SAVE_ON_DISK: $outputFilename = 'Email Report - ' . $idReport . '.' . $date . '.' . $idSite . '.' . $language; $outputFilename = $reportRenderer->sendToDisk($outputFilename); return array( $outputFilename, $prettyDate, $websiteName, $reportFormat ); break; default: case self::OUTPUT_DOWNLOAD: $reportRenderer->sendToBrowserDownload("$websiteName - $prettyDate - $description"); break; } }