Ticket #2706: 2706.patch

File 2706.patch, 34.5 KB (added by JulienM, 3 years ago)
  • core/ReportRenderer/Pdf.php

     
    4949        private $rowTopBottomBorder = array(231, 231, 231); 
    5050        private $report; 
    5151        private $reportMetadata; 
     52        private $displayGraph; 
     53        private $displayTable; 
    5254        private $reportColumns; 
    5355        private $reportRowsMetadata; 
    5456        private $currentPage = 0; 
    55         private $lastTableIsSmallReport = false; 
    5657        private $reportFont = Piwik_ReportRenderer::DEFAULT_REPORT_FONT; 
    5758        private $TCPDF; 
    5859 
     
    151152         */ 
    152153        private function paintReportHeader() 
    153154        { 
    154                 $currentTableIsSmallReport = count($this->reportColumns) == 2; 
     155                $isAggregateReport = Piwik_PDFReports_API::isAggregateReport($this->reportMetadata); 
     156 
     157                // Graph-only report 
     158                static $graphOnlyReportCount = 0; 
     159                $graphOnlyReport = $isAggregateReport && $this->displayGraph && !$this->displayTable; 
     160 
     161                // Table-only 2-column report 
     162                static $tableOnly2ColumnReportCount = 0; 
     163                $tableOnly2ColumnReport = $isAggregateReport 
     164                                                                  && !$this->displayGraph 
     165                                                                  && $this->displayTable 
     166                                                                  && count($this->reportColumns) == 2; 
     167 
    155168                $reportHasData = $this->reportHasData(); 
    156169                // Only a page break before if the current report has some data 
    157                 if (($reportHasData 
    158                          // or if it is the first report 
    159                          || $this->currentPage == 0) 
    160                         && !($this->lastTableIsSmallReport 
    161                                  && $currentTableIsSmallReport)) { 
     170                if ($reportHasData && 
     171                        // and 
     172                        ( 
     173                                // it is the first report 
     174                                $this->currentPage == 0 
     175                                // or, it is a graph-only report and it is the first of a series of 3 
     176                                || ($graphOnlyReport && $graphOnlyReportCount == 0) 
     177                                // or, it is a table-only 2-column report and it is the first of a series of 2 
     178                                || ($tableOnly2ColumnReport && $tableOnly2ColumnReportCount == 0) 
     179                                // or it is not a graph-only report and not a table-only 2-column report 
     180                                ||      !$graphOnlyReport && !$tableOnly2ColumnReport 
     181                        ) 
     182                ) 
     183                { 
    162184                        $this->currentPage++; 
    163185                        $columnCount = count($this->reportColumns); 
    164186                        $this->TCPDF->AddPage(); 
    165                         // Pages without data are always Portrait 
     187                        // Pages without data and graph-only pages are always Portrait 
    166188                        if ($reportHasData) { 
    167                                 $this->TCPDF->setPageOrientation($columnCount > $this->maxColumnCountPortraitOrientation ? 'L' : 'P', '', $this->bottomMargin); 
     189                                $pageOrientation = $graphOnlyReport ? 'P' : ($columnCount > $this->maxColumnCountPortraitOrientation ? 'L' : 'P'); 
     190                                $this->TCPDF->setPageOrientation($pageOrientation, '', $this->bottomMargin); 
    168191                        } 
    169192                } 
    170                 $this->lastTableIsSmallReport = $currentTableIsSmallReport; 
     193 
     194                $graphOnlyReportCount = ($graphOnlyReport && $reportHasData) ? ($graphOnlyReportCount + 1) % 3 : 0; 
     195                $tableOnly2ColumnReportCount = ($tableOnly2ColumnReport && $reportHasData) ? ($tableOnly2ColumnReportCount + 1) % 2 : 0; 
     196 
    171197                $title = $this->formatText($this->reportMetadata['name']); 
    172198                $this->TCPDF->SetFont($this->reportFont, $this->reportFontStyle, $this->reportHeaderFontSize); 
    173199                $this->TCPDF->SetTextColor($this->headerTextColor[0], $this->headerTextColor[1], $this->headerTextColor[2]); 
     
    192218        { 
    193219                $this->reportMetadata = $processedReport['metadata']; 
    194220                $this->reportRowsMetadata = $processedReport['reportMetadata']; 
     221                $this->displayGraph = $processedReport['displayGraph']; 
     222                $this->displayTable = $processedReport['displayTable']; 
    195223                list($this->report, $this->reportColumns) = self::processTableFormat($this->reportMetadata, $processedReport['reportData'], $processedReport['columns']); 
    196224 
    197225                $this->paintReportHeader(); 
     
    201229                        return; 
    202230                } 
    203231 
    204                 $this->paintReportTableHeader(); 
    205                 $this->paintReportTable(); 
    206         } 
     232                if($this->displayGraph) 
     233                { 
     234                        $this->paintGraph($processedReport['generatedImageGraph']); 
     235                } 
     236 
     237                if($this->displayGraph && $this->displayTable) 
     238                { 
     239                        $this->TCPDF->Ln(); 
     240                } 
     241 
     242                if($this->displayTable) 
     243                { 
     244                        $this->paintReportTableHeader(); 
     245                        $this->paintReportTable(); 
     246                } 
     247        } 
    207248 
    208249        private function formatText($text) 
    209250        { 
     
    294335                        $fill = !$fill; 
    295336                } 
    296337        } 
     338        private function paintGraph($imageGraph) 
     339        { 
     340                $this->TCPDF->Image( 
     341                        '@'.$imageGraph, 
     342                        $x = '', 
     343                        $y = '', 
     344                        $w = 0, 
     345                        $h = 0, 
     346                        $type = '', 
     347                        $link = '', 
     348                        $align = 'N', 
     349                        $resize = false, 
     350                        $dpi = 72, 
     351                        $palign = '', 
     352                        $ismask = false, 
     353                        $imgmask = false, 
     354                        $order = 0, 
     355                        $fitbox = false, 
     356                        $hidden = false, 
     357                        $fitonpage = true, 
     358                        $alt = false, 
     359                        $altimgs = array() 
     360                ); 
    297361 
     362                unset($imageGraph); 
     363        } 
     364 
    298365        /** 
    299366         * Draw the table header (first row) 
    300367         */ 
  • core/ReportRenderer/Html.php

     
    103103                $this->assignCommonParameters($smarty); 
    104104 
    105105                $reportMetadata = $processedReport['metadata']; 
    106                 $smarty->assign("reportName", $reportMetadata['name']); 
    107                 $smarty->assign("reportId", $reportMetadata['uniqueId']); 
    108  
    109106                $reportData = $processedReport['reportData']; 
    110107                $columns = $processedReport['columns']; 
    111108                list($reportData, $columns) = self::processTableFormat($reportMetadata, $reportData, $columns); 
    112109 
     110                $smarty->assign("reportName", $reportMetadata['name']); 
     111                $smarty->assign("reportId", $reportMetadata['uniqueId']); 
    113112                $smarty->assign("reportColumns", $columns); 
    114113                $smarty->assign("reportRows", $reportData->getRows()); 
    115114                $smarty->assign("reportRowsMetadata", $processedReport['reportMetadata']->getRows()); 
     115                $smarty->assign("displayTable", $processedReport['displayTable']); 
    116116 
     117                $displayGraph = $processedReport['displayGraph']; 
     118                $smarty->assign("displayGraph", $displayGraph); 
     119 
     120                if($displayGraph) 
     121                { 
     122                        $smarty->assign("graphWidth", Piwik_ReportRenderer::IMAGE_GRAPH_WIDTH); 
     123                        $smarty->assign("graphHeight", Piwik_ReportRenderer::IMAGE_GRAPH_HEIGHT); 
     124                        $smarty->assign("renderImageInline", $this->renderImageInline); 
     125 
     126                        if($this->renderImageInline) 
     127                        { 
     128                                $generatedImageGraph = $processedReport['generatedImageGraph']; 
     129                                $smarty->assign("generatedImageGraph", base64_encode($generatedImageGraph)); 
     130                                unset($generatedImageGraph); 
     131                        } 
     132                } 
     133 
    117134                $this->rendering .= $smarty->fetch(self::prefixTemplatePath("html_report_body.tpl")); 
    118135        } 
    119136 
  • plugins/API/API.php

     
    754754                { 
    755755                        $order = array( 
    756756                                Piwik_Translate('VisitsSummary_VisitsSummary'), 
     757                                Piwik_Translate('Goals_Ecommerce'), 
    757758                                Piwik_Translate('Actions_Actions'), 
    758759                                Piwik_Translate('Referers_Referers'), 
    759760                                Piwik_Translate('Goals_Goals'), 
  • plugins/ImageGraph/API.php

     
    3131         
    3232        const GRAPH_OUTPUT_INLINE               = 0; 
    3333        const GRAPH_OUTPUT_FILE                 = 1; 
    34          
     34        //@ Review is this the correct wording ? 
     35        const GRAPH_OUTPUT_PHP                  = 2; 
     36 
    3537        private $GRAPH_COLOR_PIE_0                      = "3C5A69"; 
    3638        private $GRAPH_COLOR_PIE_1                      = "679BB5"; 
    3739        private $GRAPH_COLOR_PIE_2                      = "695A3C"; 
     
    7678                                                        $width = false, $height = false, $fontSize = false, $aliasedGraph = true, $colors = false 
    7779        ) 
    7880        { 
     81                Piwik::checkUserHasViewAccess($idSite); 
     82 
    7983                // Health check - should we also test for GD2 only? 
    8084                $extensions = @get_loaded_extensions(); 
    8185                if (!in_array('gd', $extensions) 
     
    352356                                                $typeName = "BasicLine"; 
    353357                                                break; 
    354358                                } 
    355                                 $fileName = $typeName."_".$apiModule."_".$apiAction." $date $idSite.png"; 
     359                                $idGoal = Piwik_Common::getRequestVar('idGoal', '', 'string'); 
     360                                if($idGoal != '') 
     361                                { 
     362                                        $idGoal = '_' . $idGoal; 
     363                                } 
     364                                $fileName = $typeName."_".$apiModule."_".$apiAction.$idGoal." ".str_replace(',', '-', $date)." $idSite.png"; 
    356365                                $fileName = str_replace(array(" ","/"), "_", $fileName); 
    357366                                if(!Piwik_Common::isValidFilename($fileName)) 
    358367                                { 
     
    361370                                $path = PIWIK_INCLUDE_PATH."/tmp/".$fileName; 
    362371                                $graph->Render($path); 
    363372                                return $path; 
    364                                  
     373 
     374                        case self::GRAPH_OUTPUT_PHP: 
     375                                return $graph->Picture; 
     376 
    365377                        case self::GRAPH_OUTPUT_INLINE: 
    366378                        default: 
    367379                                $graph->Stroke(); 
     
    398410                $count++; 
    399411        } 
    400412         
    401 } 
    402  No newline at end of file 
     413} 
  • core/Updates/1.7.php

     
     1<?php 
     2/** 
     3 * Piwik - Open source web analytics 
     4 * 
     5 * @link http://piwik.org 
     6 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later 
     7 * @version $Id: 1.4-rc1.php 4609 2011-04-30 01:46:23Z matt $ 
     8 * 
     9 * @category Piwik 
     10 * @package Updates 
     11 */ 
     12 
     13/** 
     14 * @package Updates 
     15 */ 
     16class Piwik_Updates_1_7 extends Piwik_Updates 
     17{ 
     18        static function getSql($schema = 'Myisam') 
     19        { 
     20                return array( 
     21                    'ALTER TABLE `'. Piwik_Common::prefixTable('pdf') .'` 
     22                        ADD COLUMN `aggregate_reports_format` TINYINT(1) NOT NULL AFTER `reports`' => false, 
     23                ); 
     24        } 
     25 
     26        static function update() 
     27        { 
     28                try { 
     29                        Piwik_Updater::updateDatabase(__FILE__, self::getSql()); 
     30                } 
     31                catch(Exception $e){} 
     32        } 
     33} 
  • plugins/PDFReports/API.php

     
    5353         * @param string $reports Comma separated list of reports 
    5454         * @return int idReport generated 
    5555         */ 
    56         public function addReport( $idSite, $description, $period, $reportFormat, $reports, $emailMe = true, $additionalEmails = false) 
     56        public function addReport( $idSite, $description, $period, $reportFormat, $aggregateReportsFormat, $reports, $emailMe = true, $additionalEmails = false) 
    5757        { 
    5858                Piwik::checkUserIsNotAnonymous(); 
    5959                Piwik::checkUserHasViewAccess($idSite); 
    6060                $this->checkPeriod($period); 
    6161                $this->checkFormat($reportFormat); 
     62                $this->checkAggregateReportsFormat($aggregateReportsFormat); 
    6263                $description = $this->checkDescription($description); 
    6364                $currentUser = Piwik::getCurrentUserLogin(); 
    6465                $emailMe = (int)$emailMe; 
     
    8384                                                'description' => $description, 
    8485                                                'period' => $period, 
    8586                                                'format' => $reportFormat, 
     87                                                'aggregate_reports_format' => $aggregateReportsFormat, 
    8688                                                'email_me' => $emailMe, 
    8789                                                'additional_emails' => $additionalEmails, 
    8890                                                'reports' => $reports, 
     
    106108         *  
    107109         * @see addReport() 
    108110         */ 
    109         public function updateReport( $idReport, $idSite, $description, $period, $reportFormat, $reports, $emailMe = true, $additionalEmails = false) 
     111        public function updateReport( $idReport, $idSite, $description, $period, $reportFormat, $aggregateReportsFormat, $reports, $emailMe = true, $additionalEmails = false) 
    110112        { 
    111113                Piwik::checkUserHasViewAccess($idSite); 
    112114                $pdfReports = $this->getReports($idSite, $periodSearch = false, $idReport); 
     
    115117                 
    116118                $this->checkPeriod($period); 
    117119                $this->checkFormat($reportFormat); 
     120                $this->checkAggregateReportsFormat($aggregateReportsFormat); 
    118121                $description = $this->checkDescription($description); 
    119122                $currentUser = Piwik::getCurrentUserLogin(); 
    120123                $emailMe = (int)$emailMe; 
     
    130133                                                'description' => $description, 
    131134                                                'period' => $period, 
    132135                                                'format' => $reportFormat, 
     136                                                'aggregate_reports_format' => $aggregateReportsFormat, 
    133137                                                'email_me' => $emailMe, 
    134138                                                'additional_emails' => $additionalEmails, 
    135139                                                'reports' => $reports, 
     
    209213                 
    210214                // Joining with the site table to work around pre-1.3 where reports could still be linked to a deleted site 
    211215                $reports = Piwik_FetchAll("SELECT *  
    212                                                         FROM ".Piwik_Common::prefixTable('pdf')."  
    213                                                                 JOIN ".Piwik_Common::prefixTable('site')." 
    214                                                                 USING (idsite) 
    215                                                         WHERE deleted = 0 
    216                                                                 $sqlWhere", $bind); 
    217         // When a specific report was requested and not found, throw an error 
    218         if($idReport !== false 
    219                 && empty($reports)) 
     216                                                                FROM ".Piwik_Common::prefixTable('pdf')." 
     217                                                                        JOIN ".Piwik_Common::prefixTable('site')." 
     218                                                                        USING (idsite) 
     219                                                                WHERE deleted = 0 
     220                                                                        $sqlWhere", $bind); 
     221                // When a specific report was requested and not found, throw an error 
     222                if($idReport !== false 
     223                        && empty($reports)) 
    220224                { 
    221225                        throw new Exception("Requested report couldn't be found."); 
    222226                } 
     
    237241         * @param int|false $outputType 1 = download report, 2 = save report to disk, defaults to download 
    238242         * @param string|false $period Defaults to 'day'. If not specified, will default to the report's period set when creating the report 
    239243         * @param string $reportFormat pdf, html 
     244         * @param int|false $aggregateReportsFormat 0 = display only tables, 1 = display only graphs, 2 = display both 
    240245         */ 
    241         public function generateReport($idReport, $date, $idSite = false, $language = false, $outputType = false, $period = false, $reportFormat = false) 
     246        public function generateReport($idReport, $date, $idSite = false, $language = false, $outputType = false, $period = false, $reportFormat = false, $aggregateReportsFormat = false) 
    242247        { 
    243248                // Load specified language 
    244249                if(empty($language)) 
    245250                { 
    246251                        $language = Piwik_Translate::getInstance()->getLanguageDefault(); 
    247252                } 
    248         Piwik_Translate::getInstance()->reloadLanguage($language); 
    249                  
     253                Piwik_Translate::getInstance()->reloadLanguage($language); 
     254 
    250255                // Available reports 
    251                 static $reportMetadata = null; 
    252                 if(is_null($reportMetadata)) 
    253                 { 
    254                         //TODO here should pass $period and $date for graphs to display in metadata and then in Email reports.  
    255                         $reportMetadata = Piwik_API_API::getInstance()->getReportMetadata($idSite); 
    256                 } 
     256                $reportMetadata = Piwik_API_API::getInstance()->getReportMetadata($idSite); 
    257257 
    258258                // Test template: include all reports 
    259259                if($idReport == 0) 
     
    266266                        { 
    267267                                $reportFormat = Piwik_PDFReports::DEFAULT_FORMAT; 
    268268                        } 
     269                        if(empty($aggregateReportsFormat)) 
     270                        { 
     271                                $aggregateReportsFormat = Piwik_PDFReports::DEFAULT_AGGREGATE_REPORTS_FORMAT; 
     272                        } 
    269273                        $reports = $reportMetadata; 
    270274                        $description = Piwik_Translate('PDFReports_DefaultContainingAllReports'); 
    271275                } 
     
    275279                        $pdfReports = $this->getReports($idSite, $_period = false, $idReport); 
    276280                        $pdfReport = reset($pdfReports); 
    277281                        $reportUniqueIds = explode(',', $pdfReport['reports']); 
    278                          
    279                 $description = $pdfReport['description']; 
    280                          
    281                 // If period wasn't specified, we shall default to the report's period 
    282                 if(empty($period)) 
    283                 { 
    284                         $period = 'day'; 
    285                         if($pdfReport['period'] != 'never') 
     282 
     283                        $description = $pdfReport['description']; 
     284 
     285                        // If period wasn't specified, we shall default to the report's period 
     286                        if(empty($period)) 
     287                        { 
     288                                $period = 'day'; 
     289                                if($pdfReport['period'] != 'never') 
    286290                                { 
    287291                                        $period = $pdfReport['period']; 
    288292                                } 
    289                 } 
     293                        } 
    290294 
    291                 // If format wasn't specified, defaults to the report's format 
     295                        // If format wasn't specified, defaults to the report's format 
    292296                        if(empty($reportFormat)) 
    293297                        { 
    294298                                $reportFormat = $pdfReport['format']; 
     
    299303                                } 
    300304                        } 
    301305 
    302                 // We need to lookup which reports metadata are registered in this report 
    303                 $reports = array(); 
    304                 foreach($reportMetadata as $metadata) 
    305                 { 
    306                         if(in_array($metadata['uniqueId'], $reportUniqueIds)) 
    307                         { 
    308                                 $reports[] = $metadata; 
    309                         } 
    310                 } 
     306                // If $aggregateReportsFormat wasn't specified, defaults to the report configuration 
     307                        if(empty($aggregateReportsFormat)) 
     308                        { 
     309                                $aggregateReportsFormat = $pdfReport['aggregate_reports_format']; 
     310                        } 
     311 
     312                        // We need to lookup which reports metadata are registered in this report 
     313                        $reports = array(); 
     314                        foreach($reportMetadata as $metadata) 
     315                        { 
     316                                if(in_array($metadata['uniqueId'], $reportUniqueIds)) 
     317                                { 
     318                                        $reports[] = $metadata; 
     319                                } 
     320                        } 
    311321                } 
    312322 
    313323                $description = str_replace(array("\r", "\n"), ' ', $description); 
    314324 
    315325                // The report will be rendered with the first 30 rows and will aggregate other rows in a summary row 
    316         $filterTruncateGET = Piwik_Common::getRequestVar('filter_truncate', false); 
    317         $_GET['filter_truncate'] = 30; 
     326                $filterTruncateGET = Piwik_Common::getRequestVar('filter_truncate', false); 
     327                $_GET['filter_truncate'] = 30; 
    318328 
    319         $websiteName = $prettyDate = false; 
    320         $processedReports = array(); 
    321         foreach ($reports as $action) 
    322         { 
    323                 $apiModule = $action['module']; 
    324                 $apiAction = $action['action']; 
    325                 $apiParameters = array(); 
    326                 if(isset($action['parameters'])) 
    327                 { 
    328                         $apiParameters = $action['parameters']; 
    329                 } 
    330                 $report = Piwik_API_API::getInstance()->getProcessedReport($idSite, $period, $date, $apiModule, $apiAction, $segment = false, $apiParameters, $idGoal = false, $language); 
    331                 $websiteName = $report['website']; 
    332                 $prettyDate = $report['prettyDate']; 
    333                 $processedReports[] = $report; 
    334         } 
    335          
    336         // Restore values 
    337         if($filterTruncateGET !== false) 
    338         { 
    339                 $_GET['filter_truncate'] = $filterTruncateGET; 
    340         } 
     329                $websiteName = $prettyDate = false; 
     330                $processedReports = array(); 
     331                foreach ($reports as $action) 
     332                { 
     333                        $apiModule = $action['module']; 
     334                        $apiAction = $action['action']; 
     335                        $apiParameters = array(); 
     336                        if(isset($action['parameters'])) 
     337                        { 
     338                                $apiParameters = $action['parameters']; 
     339                        } 
     340                        $report = Piwik_API_API::getInstance()->getProcessedReport($idSite, $period, $date, $apiModule, $apiAction, $segment = false, $apiParameters, $idGoal = false, $language); 
     341                        $websiteName = $report['website']; 
     342                        $prettyDate = $report['prettyDate']; 
     343 
     344                        $reportMetadata = $report['metadata']; 
     345                        $isAggregateReport = self::isAggregateReport($reportMetadata); 
     346 
     347                        $report['displayTable'] =       !$isAggregateReport || 
     348                                                                                $aggregateReportsFormat == Piwik_PDFReports::AGGREGATE_REPORTS_FORMAT_TABLES || 
     349                                                                                $aggregateReportsFormat == Piwik_PDFReports::AGGREGATE_REPORTS_FORMAT_TABLES_GRAPHS; 
     350 
     351                        $report['displayGraph'] =       !$isAggregateReport || 
     352                                                                                $aggregateReportsFormat == Piwik_PDFReports::AGGREGATE_REPORTS_FORMAT_GRAPHS || 
     353                                                                                $aggregateReportsFormat == Piwik_PDFReports::AGGREGATE_REPORTS_FORMAT_TABLES_GRAPHS; 
     354 
     355                        if ($report['displayGraph']) 
     356                        { 
     357                                $request = new Piwik_API_Request( 
     358                                        $reportMetadata['imageGraphUrl'] . 
     359                                        '&outputType='.Piwik_ImageGraph_API::GRAPH_OUTPUT_PHP. 
     360                                        '&format=original&serialize=0'. 
     361                                        '&height='.Piwik_ReportRenderer::IMAGE_GRAPH_HEIGHT. 
     362                                        '&width='.Piwik_ReportRenderer::IMAGE_GRAPH_WIDTH 
     363                                ); 
     364 
     365                                try { 
     366                                        $imageGraph = $request->process(); 
     367 
     368                                        // Get image data as string 
     369                                        ob_start(); 
     370                                        imagepng($imageGraph); 
     371                                        $imageGraphData = ob_get_contents(); 
     372                                        ob_end_clean(); 
     373                                        imagedestroy($imageGraph); 
     374 
     375                                        $report['generatedImageGraph'] = $imageGraphData; 
     376 
     377                                } catch(Exception $e) { 
     378                                        throw new Exception("ImageGraph API returned an error: ".$e->getMessage()."\n"); 
     379                                } 
     380                        } 
     381 
     382                        $processedReports[] = $report; 
     383                } 
     384 
     385                // Restore values 
     386                if($filterTruncateGET !== false) 
     387                { 
     388                        $_GET['filter_truncate'] = $filterTruncateGET; 
     389                } 
    341390 
    342                 if(empty($reportFormat)) 
    343                 { 
    344                         $reportFormat = Piwik_PDFReports::DEFAULT_FORMAT; 
    345                 } 
    346  
    347391                // Generate the report 
    348392                $reportRenderer = Piwik_ReportRenderer::factory($reportFormat); 
    349393                $reportRenderer->setLocale($language); 
    350         $reportRenderer->renderFrontPage($websiteName, $prettyDate, $description, $reports ); 
     394                $reportRenderer->setRenderImageInline($outputType == self::OUTPUT_DOWNLOAD ? true : false); 
     395                $reportRenderer->renderFrontPage($websiteName, $prettyDate, $description, $reports ); 
    351396                array_walk($processedReports, array($reportRenderer, 'renderReport')); 
    352397 
    353         switch($outputType) 
    354         {  
    355                 case self::OUTPUT_SAVE_ON_DISK: 
     398                switch($outputType) 
     399                { 
     400                        case self::OUTPUT_SAVE_ON_DISK: 
    356401                                $outputFilename = 'Email Report - ' . $idReport . '.' . $date . '.' . $idSite . '.' . $language; 
    357402                                $outputFilename = $reportRenderer->sendToDisk($outputFilename); 
    358403 
     404                                $additionalFiles = array(); 
     405                                if($reportFormat == 'html') 
     406                                { 
     407                                        foreach ($processedReports as &$report) { 
     408                                                if($report['displayGraph']) 
     409                                                { 
     410                                                        $additionalFile = array(); 
     411                                                        $additionalFile['filename'] = $report['metadata']['name'].'.png'; 
     412                                                        $additionalFile['cid'] = $report['metadata']['uniqueId']; 
     413                                                        $additionalFile['content'] = $report['generatedImageGraph']; 
     414                                                        $additionalFile['mimeType'] = 'image/png'; 
     415                                                        $additionalFile['encoding'] = Zend_Mime::ENCODING_BASE64; 
     416 
     417                                                        $additionalFiles[] = $additionalFile; 
     418                                                } 
     419                                        } 
     420                                } 
     421 
    359422                                return array(   $outputFilename, 
    360423                                                                $prettyDate, 
    361424                                                                $websiteName, 
    362                                                                 $reportFormat 
     425                                                                $reportFormat, 
     426                                                                $additionalFiles, 
    363427                                ); 
    364                 break; 
     428                        break; 
    365429 
    366430                        default: 
    367431                        case self::OUTPUT_DOWNLOAD: 
    368432                                $reportRenderer->sendToBrowserDownload("$websiteName - $prettyDate - $description"); 
    369433                                break; 
    370         } 
     434                } 
    371435        } 
    372436 
    373437        public function sendEmailReport($idReport, $idSite, $period = false, $date = false) 
     
    410474                        } 
    411475                } 
    412476                $language = Piwik_LanguagesManager_API::getInstance()->getLanguageForUser($report['login']); 
    413                 list($outputFilename, $prettyDate, $websiteName, $reportFormat) = 
     477                list($outputFilename, $prettyDate, $websiteName, $reportFormat, $additionalFiles) = 
    414478                        $this->generateReport( 
    415479                                        $idReport,  
    416480                                        $date, 
     
    420484                                        $report['period'] 
    421485                                        ); 
    422486 
    423                 $this->sendReportEmail($emails, $outputFilename, $prettyDate, $websiteName, $report, $reportFormat); 
     487                $this->sendReportEmail($emails, $outputFilename, $prettyDate, $websiteName, $report, $reportFormat, $additionalFiles); 
    424488        } 
    425489         
    426         protected function sendReportEmail($emails, $outputFilename, $prettyDate, $websiteName, $report, $reportFormat) 
     490        protected function sendReportEmail($emails, $outputFilename, $prettyDate, $websiteName, $report, $reportFormat, $additionalFiles) 
    427491        { 
    428492                $periods = self::getPeriodToFrequency(); 
    429493                $message  = Piwik_Translate('PDFReports_EmailHello'); 
     
    431495 
    432496                if(!file_exists($outputFilename)) 
    433497                { 
    434                         throw new Exception("The PDF file wasn't found in $outputFilename"); 
     498                        throw new Exception("The report file wasn't found in $outputFilename"); 
    435499                } 
    436500                $filename = basename($outputFilename); 
    437501                $handle = fopen($outputFilename, "r"); 
     
    448512                switch ($reportFormat) 
    449513                { 
    450514                        case 'html': 
     515 
     516                                // Needed when using images as attachment with cid 
     517                                $mail->setType(Zend_Mime::MULTIPART_RELATED); 
    451518                                $message .= "<br/>" . Piwik_Translate('PDFReports_PleaseFindBelow', array($periods[$report['period']], $websiteName)); 
    452519                                $mail->setBodyHtml($message . "<br/><br/>". $contents); 
    453520                                break; 
     
    465532                                break; 
    466533                } 
    467534 
     535                foreach($additionalFiles as $additionalFile) 
     536                { 
     537                        $fileContent = $additionalFile['content']; 
     538                        $at = $mail->createAttachment( 
     539                                $fileContent, 
     540                                $additionalFile['mimeType'], 
     541                                Zend_Mime::DISPOSITION_INLINE, 
     542                                $additionalFile['encoding'], 
     543                                $additionalFile['filename'] 
     544                        ); 
     545                        $at->id = $additionalFile['cid']; 
     546 
     547                        unset($fileContent); 
     548                } 
     549 
    468550                foreach ($emails as $email) 
    469551                { 
    470552                        $mail->addTo($email); 
     
    478560                                { 
    479561                                        throw new Exception("An error occured while sending '$filename' ". 
    480562                                                                                " to ". implode(', ',$mail->getRecipients()). ". 
    481                                                                 Error was '". $e->getMessage()."'"); 
     563                                                                        Error was '". $e->getMessage()."'"); 
    482564                                } 
    483565                        } 
    484566                        $mail->clearRecipients(); 
     
    576658                } 
    577659        } 
    578660 
     661        private function checkAggregateReportsFormat($format) 
     662        { 
     663                $availableAggregateReportsFormats = array_keys(Piwik_PDFReports_API::getAggregateReportsFormats()); 
     664                if(!in_array($format, $availableAggregateReportsFormats)) 
     665                { 
     666                        throw new Exception( 
     667                                Piwik_TranslateException( 
     668                                        'General_ExceptionInvalidAggregateReportsFormat', 
     669                                        array($format, implode(', ', $availableAggregateReportsFormats)) 
     670                                ) 
     671                        ); 
     672                } 
     673        } 
     674 
    579675        /** 
    580676         * @ignore 
    581677         */ 
     
    588684                ); 
    589685                return $periods; 
    590686        } 
    591 } 
     687 
     688        /** 
     689         * @ignore 
     690         */ 
     691        static public function getAggregateReportsFormats() 
     692        { 
     693                $periods = array( 
     694                        Piwik_PDFReports::AGGREGATE_REPORTS_FORMAT_TABLES => Piwik_Translate('PDFReports_AggregateReportsFormat_TablesOnly'), 
     695                        Piwik_PDFReports::AGGREGATE_REPORTS_FORMAT_GRAPHS => Piwik_Translate('PDFReports_AggregateReportsFormat_GraphsOnly'), 
     696                        Piwik_PDFReports::AGGREGATE_REPORTS_FORMAT_TABLES_GRAPHS => Piwik_Translate('PDFReports_AggregateReportsFormat_TablesAndGraphs'), 
     697                ); 
     698                return $periods; 
     699        } 
     700 
     701        // @Review : Is this the right place ? 
     702        /** 
     703         * Find out if a report is an aggregate report. 
     704         * 
     705         * @ignore 
     706         * @static 
     707         * @param  $reportMetadata 
     708         * @return boolean true if $reportMetadata is aggregated (ie. with a dimension), false otherwise 
     709         */ 
     710        public static function isAggregateReport($reportMetadata) 
     711        { 
     712                return isset($reportMetadata['dimension']); 
     713        } 
     714} 
  • plugins/CoreHome/templates/html_report_body.tpl

     
    66{if empty($reportRows)} 
    77        {'CoreHome_ThereIsNoDataForThisReport'|translate} 
    88{else} 
     9        {if $displayGraph} 
     10                {* @Review 
     11                        Should we add an "alt" attribute ? 
     12                *} 
     13                <img 
     14                        {if $renderImageInline} 
     15                                src="data:image/png;base64,{$generatedImageGraph}" 
     16                        {else} 
     17                                src="cid:{$reportId}" 
     18                        {/if} 
     19                        height="{$graphHeight}" 
     20                        width="{$graphWidth}" /> 
     21        {/if} 
     22 
     23        {if $displayGraph && $displayTable} 
     24                <br/> 
     25                <br/> 
     26        {/if} 
     27 
     28        {if $displayTable} 
    929        <table style="border-collapse:collapse; margin-left: 5px"> 
    1030                <thead style="background-color: rgb({$tableHeaderBgColor}); color: rgb({$tableHeaderTextColor}); font-size: {$reportTableHeaderTextSize}pt;"> 
    1131                        {foreach from=$reportColumns item=columnName} 
     
    5474                        {/foreach} 
    5575                </tbody> 
    5676        </table> 
    57 {/if} 
     77        {/if} 
     78{/if} 
    5879<br/> 
    5980<a style="text-decoration:none; color: rgb({$reportTitleTextColor}); font-size: {$reportBackToTopTextSize}pt" href="#reportTop"> 
    6081        {'PDFReports_TopOfReport'|translate} 
    61 </a> 
    62  No newline at end of file 
     82</a> 
  • plugins/PDFReports/templates/add.tpl

     
    1212        </thead> 
    1313        <tbody> 
    1414                <tr> 
    15             <td class="first">{'General_Website'|translate} </th> 
     15            <td class="first">{'General_Website'|translate} </td> 
    1616                        <td  style="width:650px"> 
    1717                                {$siteName} 
    1818                        </td> 
    1919                </tr> 
    2020                <tr> 
    21             <td class="first">{'General_Description'|translate} </th> 
     21            <td class="first">{'General_Description'|translate} </td> 
    2222                        <td> 
    2323                        <textarea cols="30" rows="3" id="report_description" class="inp"></textarea> 
    2424                        <div class="entityInlineHelp"> 
     
    5454                        </td> 
    5555                </tr> 
    5656                <tr> 
    57                         <td class="first">{'PDFReports_ReportFormat'|translate} 
     57                        <td class="first"> 
     58                                {'PDFReports_ReportFormat'|translate} 
    5859                        </td> 
    5960                        <td> 
    6061                                <select id="report_format"> 
     
    6566                        </td> 
    6667                </tr> 
    6768                <tr> 
     69                        <td class="first"> 
     70                                {'PDFReports_AggregateReportsFormat'|translate}&nbsp;* 
     71                        </td> 
     72                        <td> 
     73                                <select id="aggregate_reports_format"> 
     74                                {foreach from=$aggregateReportsFormats key=formatValue item=formatLabel} 
     75                                        <option value="{$formatValue}">{$formatLabel}</option> 
     76                                {/foreach} 
     77                                </select> 
     78                        </td> 
     79                </tr> 
     80                <tr> 
    6881                        <td class="first">{'PDFReports_ReportsIncluded'|translate}</td> 
    6982                        <td> 
    7083                        <div id='reportsList'> 
     
    7790                                        {/if} 
    7891                                        <div class='reportCategory'>{$category}</div><ul class='listReports'> 
    7992                                        {foreach from=$reports item=report} 
    80                                                 <li><input type="checkbox" id="{$report.uniqueId}" /><label for="{$report.uniqueId}">{$report.name|escape:"html"}</label></li> 
     93                                                <li> 
     94                                                        <input type="checkbox" id="{$report.uniqueId}" /> 
     95                                                        <label for="{$report.uniqueId}"> 
     96                                                                {$report.name|escape:"html"}{if $report.isAggregate}&nbsp;*{/if} 
     97                                                        </label> 
     98                                                </li> 
    8199                                        {/foreach} 
    82100                                        {assign var=countReports value=$countReports+1} 
    83101                                        </ul> 
  • plugins/PDFReports/templates/pdf.js

     
    2121        $('#report_description').html(report.description); 
    2222        $('#report_period option[value='+report.period+']').prop('selected', 'selected'); 
    2323        $('#report_format option[value='+report.format+']').prop('selected', 'selected'); 
     24        $('#aggregate_reports_format option[value='+report.aggregate_reports_format+']').prop('selected', 'selected'); 
    2425        if(report.email_me == 1) 
    2526        { 
    2627                $('#report_email_me').prop('checked','checked'); 
     
    6465                parameters.description = $('#report_description').val(); 
    6566                parameters.period = $('#report_period option:selected').val(); 
    6667                parameters.reportFormat = $('#report_format option:selected').val(); 
     68                parameters.aggregateReportsFormat = $('#aggregate_reports_format option:selected').val(); 
    6769                parameters.emailMe = $('#report_email_me').prop('checked') == true ? 1: 0; 
    6870                additionalEmails = $('#report_additional_emails').val(); 
    6971                parameters.additionalEmails = piwikHelper.getApiFormatTextarea(additionalEmails); 
  • plugins/PDFReports/Controller.php

     
    2626                $reportsByCategory = array(); 
    2727                foreach($availableReports as $report) 
    2828                { 
     29                        // @Review 'isAggregateReport' report should ideally be in the metadata ? or somewhere in core ? 
     30                        $report['isAggregate'] = Piwik_PDFReports_API::isAggregateReport($report); 
    2931                        $reportsByCategory[$report['category']][] = $report; 
    3032                } 
    3133 
     
    4749                                                        Piwik_PDFReports_API::getPeriodToFrequency()); 
    4850                $view->defaultFormat = Piwik_PDFReports::DEFAULT_FORMAT; 
    4951                $view->formats = Piwik_ReportRenderer::$availableReportRenderers; 
     52                $view->aggregateReportsFormats = Piwik_PDFReports_API::getAggregateReportsFormats(); 
    5053                $view->reports = $reports; 
    5154                $view->language = Piwik_LanguagesManager::getLanguageCodeForCurrentUser(); 
    5255                echo $view->render(); 
  • plugins/PDFReports/PDFReports.php

     
    1818{ 
    1919        const DEFAULT_FORMAT = 'pdf'; 
    2020 
     21        const AGGREGATE_REPORTS_FORMAT_TABLES = 0; // Display Tables Only 
     22        const AGGREGATE_REPORTS_FORMAT_GRAPHS = 1; // Display Graphs Only 
     23        const AGGREGATE_REPORTS_FORMAT_TABLES_GRAPHS = 2; // Display Tables and Graphs 
     24        const DEFAULT_AGGREGATE_REPORTS_FORMAT = Piwik_PDFReports::AGGREGATE_REPORTS_FORMAT_TABLES; 
     25 
    2126        public function getInformation() 
    2227        { 
    2328                return array( 
  • core/ReportRenderer.php

     
    1919 */ 
    2020abstract class Piwik_ReportRenderer 
    2121{ 
     22        const IMAGE_GRAPH_HEIGHT = 200; 
     23        const IMAGE_GRAPH_WIDTH = 700; 
    2224        const DEFAULT_REPORT_FONT = 'dejavusans'; 
    2325        const REPORT_TEXT_COLOR = "68,68,68"; 
    2426        const REPORT_TITLE_TEXT_COLOR = "126,115,99"; 
     
    3234                'html' => 'themes/default/images/html_icon.png', 
    3335        ); 
    3436 
     37        protected $renderImageInline = false; 
     38 
    3539        /** 
    36          * Returns the ReportRenderer associated to the renderer type $rendererType 
     40         * Return the ReportRenderer associated to the renderer type $rendererType 
    3741         * 
    3842         * @throws exception If the renderer is unknown 
    3943         * @param string $rendererType 
     
    6165        } 
    6266 
    6367        /** 
     68         * Currently only used for HTML reports. 
     69         * When sent by mail, images are attached to the mail: renderImageInline = false 
     70         * When downloaded, images are included base64 encoded in the report body: renderImageInline = true 
     71         * 
     72         * @param boolean $renderImageInline 
     73         */ 
     74        public function setRenderImageInline($renderImageInline) 
     75        { 
     76                $this->renderImageInline = $renderImageInline; 
     77        } 
     78 
     79        /** 
    6480         * Initialize locale settings. 
    6581         * If not called, locale settings defaults to 'en' 
    6682         * 
     
    115131        } 
    116132 
    117133        /** 
    118          * Returns $filename with temp directory and delete file 
     134         * Return $filename with temp directory and delete file 
    119135         * 
    120136         * @static 
    121137         * @param  $filename 
     
    141157        protected static function processTableFormat($reportMetadata, $report, $reportColumns) 
    142158        { 
    143159                $finalReport = $report; 
    144                 if(!isset($reportMetadata['dimension'])) 
     160                if(!Piwik_PDFReports_API::isAggregateReport($reportMetadata)) 
    145161                { 
    146162//                      var_dump($report); 
    147163                        $simpleReportMetrics = $report->getFirstRow(); 
     
    157173                                } 
    158174                        } 
    159175 
    160                         $reportColumns = array('label' => Piwik_Translate('General_Name'), 
    161                                                                                  'value' => Piwik_Translate('General_Value'),); 
     176                        $reportColumns = array( 
     177                                'label' => Piwik_Translate('General_Name'), 
     178                                'value' => Piwik_Translate('General_Value'), 
     179                        ); 
    162180                } 
    163181 
    164182                return array( 
    165                                 $finalReport, 
    166                                 $reportColumns 
    167                         ); 
     183                        $finalReport, 
     184                        $reportColumns, 
     185                ); 
    168186        } 
    169187} 
  • lang/en.php

     
    250250        'General_ExceptionMethodNotFound' => 'The method \'%s\' does not exist or is not available in the module \'%s\'.', 
    251251        'General_ExceptionInvalidRendererFormat' => 'Renderer format \'%s\' not valid. Try any of the following instead: %s.', 
    252252        'General_ExceptionInvalidReportRendererFormat' => 'Report format \'%s\' not valid. Try any of the following instead: %s.', 
     253        'General_ExceptionInvalidAggregateReportsFormat' => 'Aggregate reports format \'%s\' not valid. Try any of the following instead: %s.', 
    253254        'General_ExceptionInvalidPeriod' => 'The period \'%s\' is not supported. Try any of the following instead: %s', 
    254255        'General_ExceptionInvalidDateRange' => 'The date \'%s\' is not a correct date range. It should have the following format: %s.', 
    255256        'General_ExceptionGoalNotFound' => 'The goal id = %s couldn\'t be found.', 
     
    14591460        'PDFReports_EmailSchedule' => 'Email Schedule', 
    14601461        'PDFReports_SendReportTo' => 'Send report to', 
    14611462        'PDFReports_ReportFormat' => 'Report Format', 
     1463        'PDFReports_AggregateReportsFormat' => 'Aggregate Reports Format', 
     1464        'PDFReports_AggregateReportsFormat_TablesOnly' => 'Display Report Tables Only', 
     1465        'PDFReports_AggregateReportsFormat_GraphsOnly' => 'Display Graphs Only', 
     1466        'PDFReports_AggregateReportsFormat_TablesAndGraphs' => 'Display Report Tables and Graphs', 
    14621467        'PDFReports_SentToMe' => 'Send to me', 
    14631468        'PDFReports_CreateAndScheduleReport' => 'Create and Schedule a report', 
    14641469        'PDFReports_CancelAndReturnToReports' => 'Cancel and %sreturn to the list of reports%s',