Esempio n. 1
0
	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;
	}
Esempio n. 2
0
 public function sendToBrowserInline($filename)
 {
     Piwik_ReportRenderer::inlineToBrowser(self::SMS_CONTENT_TYPE, $this->rendering);
 }
Esempio n. 3
0
 /**
  * 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;
     }
 }
Esempio n. 4
0
 /**
  * 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;
     }
 }
Esempio n. 5
0
 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"));
 }
Esempio n. 6
0
 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);
 }
Esempio n. 7
0
 /**
  * @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);
     }
 }
Esempio n. 8
0
 /**
  * @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);
         }
     }
 }
Esempio n. 9
0
 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);
 }
Esempio n. 10
0
 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;
 }
Esempio n. 11
0
	public function sendToBrowserDownload($filename)
	{
		$filename = Piwik_ReportRenderer::appendExtension($filename, "pdf");
		$this->TCPDF->Output($filename, 'D');
	}
Esempio n. 12
0
 public function sendToBrowserInline($filename)
 {
     Piwik_ReportRenderer::inlineToBrowser(Piwik_MobileMessaging_ReportRenderer_Sms::SMS_CONTENT_TYPE, $this->rendering);
 }
Esempio n. 13
0
    /**
	 * 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;
        }
	}