diff options
author | Julien Moumné <julien@piwik.org> | 2013-05-19 12:18:32 +0400 |
---|---|---|
committer | Julien Moumné <julien@piwik.org> | 2013-05-19 12:18:32 +0400 |
commit | 8a8ce3eccb13c11037b79112513bcbe6ef7e2ccf (patch) | |
tree | 83792550c0d26696acd9a48a2780fc435b822842 | |
parent | 1ec86574db8537a1290043820455205e9863ad64 (diff) |
ref #71, #3934 - segment selection for scheduled html, pdf & sms reports
-rw-r--r-- | core/ReportRenderer.php | 18 | ||||
-rw-r--r-- | core/ReportRenderer/Html.php | 17 | ||||
-rw-r--r-- | core/ReportRenderer/Pdf.php | 29 | ||||
-rw-r--r-- | core/Updates/1.12-b16.php | 30 | ||||
-rw-r--r-- | lang/en.php | 4 | ||||
-rw-r--r-- | plugins/CoreHome/templates/html_report_header.tpl | 6 | ||||
-rw-r--r-- | plugins/ImageGraph/API.php | 7 | ||||
-rw-r--r-- | plugins/MobileMessaging/ReportRenderer/Exception.php | 2 | ||||
-rw-r--r-- | plugins/MobileMessaging/ReportRenderer/Sms.php | 10 | ||||
-rw-r--r-- | plugins/MobileMessaging/templates/SMSReport.tpl | 14 | ||||
-rw-r--r-- | plugins/PDFReports/API.php | 73 | ||||
-rw-r--r-- | plugins/PDFReports/Controller.php | 11 | ||||
-rw-r--r-- | plugins/PDFReports/PDFReports.php | 74 | ||||
-rw-r--r-- | plugins/PDFReports/templates/add.tpl | 19 | ||||
-rw-r--r-- | plugins/PDFReports/templates/list.tpl | 12 | ||||
-rw-r--r-- | plugins/PDFReports/templates/pdf.js | 2 | ||||
-rw-r--r-- | plugins/SegmentEditor/API.php | 6 |
17 files changed, 282 insertions, 52 deletions
diff --git a/core/ReportRenderer.php b/core/ReportRenderer.php index 0c0bc73243..131830a996 100644 --- a/core/ReportRenderer.php +++ b/core/ReportRenderer.php @@ -103,9 +103,10 @@ abstract class Piwik_ReportRenderer * @param string $reportTitle * @param string $prettyDate formatted date * @param string $description - * @param array $reportMetadata metadata for all reports + * @param array $reportMetadata metadata for all reports + * @param array $segment segment applied to all reports */ - abstract public function renderFrontPage($reportTitle, $prettyDate, $description, $reportMetadata); + abstract public function renderFrontPage($reportTitle, $prettyDate, $description, $reportMetadata, $segment); /** * Render the provided report. @@ -215,7 +216,7 @@ abstract class Piwik_ReportRenderer ); } - public static function getStaticGraph($reportMetadata, $width, $height, $evolution) + public static function getStaticGraph($reportMetadata, $width, $height, $evolution, $segment) { $imageGraphUrl = $reportMetadata['imageGraphUrl']; @@ -226,11 +227,12 @@ abstract class Piwik_ReportRenderer $request = new Piwik_API_Request( $imageGraphUrl . - '&outputType=' . Piwik_ImageGraph_API::GRAPH_OUTPUT_PHP . - '&format=original&serialize=0' . - '&filter_truncate=' . - '&width=' . $width . - '&height=' . $height + '&outputType=' . Piwik_ImageGraph_API::GRAPH_OUTPUT_PHP . + '&format=original&serialize=0' . + '&filter_truncate=' . + '&width=' . $width . + '&height=' . $height . + ($segment != null ? '&segment=' . $segment['definition'] : '') ); try { diff --git a/core/ReportRenderer/Html.php b/core/ReportRenderer/Html.php index 24339d2d57..1dab763f13 100644 --- a/core/ReportRenderer/Html.php +++ b/core/ReportRenderer/Html.php @@ -82,7 +82,7 @@ class Piwik_ReportRenderer_Html extends Piwik_ReportRenderer $this->rendering .= $smarty->fetch(self::prefixTemplatePath("html_report_footer.tpl")); } - public function renderFrontPage($reportTitle, $prettyDate, $description, $reportMetadata) + public function renderFrontPage($reportTitle, $prettyDate, $description, $reportMetadata, $segment) { $smarty = new Piwik_Smarty(); $this->assignCommonParameters($smarty); @@ -93,6 +93,13 @@ class Piwik_ReportRenderer_Html extends Piwik_ReportRenderer $smarty->assign("description", $description); $smarty->assign("reportMetadata", $reportMetadata); + // segment + $displaySegment = ($segment != null); + $smarty->assign("displaySegment", $displaySegment); + if ($displaySegment) { + $smarty->assign("segmentName", $segment['name']); + } + $this->rendering .= $smarty->fetch(self::prefixTemplatePath("html_report_header.tpl")); } @@ -139,7 +146,13 @@ class Piwik_ReportRenderer_Html extends Piwik_ReportRenderer $smarty->assign("renderImageInline", $this->renderImageInline); if ($this->renderImageInline) { - $staticGraph = parent::getStaticGraph($reportMetadata, self::IMAGE_GRAPH_WIDTH, self::IMAGE_GRAPH_HEIGHT, $evolutionGraph); + $staticGraph = parent::getStaticGraph( + $reportMetadata, + self::IMAGE_GRAPH_WIDTH, + self::IMAGE_GRAPH_HEIGHT, + $evolutionGraph, + $processedReport['segment'] + ); $smarty->assign("generatedImageGraph", base64_encode($staticGraph)); unset($generatedImageGraph); } diff --git a/core/ReportRenderer/Pdf.php b/core/ReportRenderer/Pdf.php index d14b736507..a7e65d45c0 100644 --- a/core/ReportRenderer/Pdf.php +++ b/core/ReportRenderer/Pdf.php @@ -66,6 +66,7 @@ class Piwik_ReportRenderer_Pdf extends Piwik_ReportRenderer private $displayGraph; private $evolutionGraph; private $displayTable; + private $segment; private $reportColumns; private $reportRowsMetadata; private $currentPage = 0; @@ -142,35 +143,51 @@ class Piwik_ReportRenderer_Pdf extends Piwik_ReportRenderer return $this->TCPDF->Output(null, 'S'); } - public function renderFrontPage($reportTitle, $prettyDate, $description, $reportMetadata) + public function renderFrontPage($reportTitle, $prettyDate, $description, $reportMetadata, $segment) { $reportTitle = $this->formatText($reportTitle); $dateRange = $this->formatText(Piwik_Translate('General_DateRange') . " " . $prettyDate); - //Setup Footer font and data + // footer $this->TCPDF->SetFooterFont(array($this->reportFont, $this->reportFontStyle, $this->reportSimpleFontSize)); $this->TCPDF->SetFooterContent($reportTitle . " | " . $dateRange . " | "); + // add first page $this->TCPDF->setPrintHeader(false); - // $this->SetMargins($left = , $top, $right=-1, $keepmargins=true) $this->TCPDF->AddPage(self::PORTRAIT); $this->TCPDF->AddFont($this->reportFont, '', '', false); $this->TCPDF->SetFont($this->reportFont, $this->reportFontStyle, $this->reportSimpleFontSize); - //Image($file, $x='', $y='', $w=0, $h=0, $type='', $link='', $align='', $resize=false, $dpi=300, $palign='', $ismask=false, $imgmask=false, $border=0, $fitbox=false, $hidden=false, $fitonpage=false) { $this->TCPDF->Bookmark(Piwik_Translate('PDFReports_FrontPage')); + + // logo $this->TCPDF->Image(Piwik_API_API::getInstance()->getLogoUrl(true), $this->logoImagePosition[0], $this->logoImagePosition[1], 180 / $factor = 2, 0, $type = '', $link = '', $align = '', $resize = false, $dpi = 300); $this->TCPDF->Ln(8); + // report title $this->TCPDF->SetFont($this->reportFont, '', $this->reportHeaderFontSize + 5); $this->TCPDF->SetTextColor($this->headerTextColor[0], $this->headerTextColor[1], $this->headerTextColor[2]); $this->TCPDF->Cell(40, 210, $reportTitle); $this->TCPDF->Ln(8 * 4); + // date and period $this->TCPDF->SetFont($this->reportFont, '', $this->reportHeaderFontSize); $this->TCPDF->SetTextColor($this->reportTextColor[0], $this->reportTextColor[1], $this->reportTextColor[2]); $this->TCPDF->Cell(40, 210, $dateRange); $this->TCPDF->Ln(8 * 20); + + // description $this->TCPDF->Write(1, $this->formatText($description)); + + // segment + if ($segment != null) { + + $this->TCPDF->Ln(); + $this->TCPDF->Ln(); + $this->TCPDF->SetFont($this->reportFont, '', $this->reportHeaderFontSize - 2); + $this->TCPDF->SetTextColor($this->headerTextColor[0], $this->headerTextColor[1], $this->headerTextColor[2]); + $this->TCPDF->Write(1, $this->formatText(Piwik_Translate('PDFReports_CustomVisitorSegment') . ' ' . $segment['name'])); + } + $this->TCPDF->Ln(8); $this->TCPDF->SetFont($this->reportFont, '', $this->reportHeaderFontSize); $this->TCPDF->Ln(); @@ -270,6 +287,7 @@ class Piwik_ReportRenderer_Pdf extends Piwik_ReportRenderer $this->displayGraph = $processedReport['displayGraph']; $this->evolutionGraph = $processedReport['evolutionGraph']; $this->displayTable = $processedReport['displayTable']; + $this->segment = $processedReport['segment']; list($this->report, $this->reportColumns) = self::processTableFormat($this->reportMetadata, $processedReport['reportData'], $processedReport['columns']); $this->paintReportHeader(); @@ -388,7 +406,8 @@ class Piwik_ReportRenderer_Pdf extends Piwik_ReportRenderer $this->reportMetadata, $this->orientation == self::PORTRAIT ? self::IMAGE_GRAPH_WIDTH_PORTRAIT : self::IMAGE_GRAPH_WIDTH_LANDSCAPE, self::IMAGE_GRAPH_HEIGHT, - $this->evolutionGraph + $this->evolutionGraph, + $this->segment ); $this->TCPDF->Image( diff --git a/core/Updates/1.12-b16.php b/core/Updates/1.12-b16.php new file mode 100644 index 0000000000..8ac3df70da --- /dev/null +++ b/core/Updates/1.12-b16.php @@ -0,0 +1,30 @@ +<?php +/** + * Piwik - Open source web analytics + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + * + * @category Piwik + * @package Updates + */ + +/** + * @package Updates + */ +class Piwik_Updates_1_12_b16 extends Piwik_Updates +{ + static function getSql($schema = 'Myisam') + { + return array( + // ignore existing column name error (1060) + 'ALTER TABLE ' . Piwik_Common::prefixTable('report') + . " ADD COLUMN idsegment INT(11) AFTER description" => 1060, + ); + } + + static function update() + { + Piwik_Updater::updateDatabase(__FILE__, self::getSql()); + } +} diff --git a/lang/en.php b/lang/en.php index 8f0d7d3b55..3fd3e38b80 100644 --- a/lang/en.php +++ b/lang/en.php @@ -2009,6 +2009,8 @@ And thank you for using Piwik!', 'PDFReports_CreateAndScheduleReport' => 'Create and Schedule a report', 'PDFReports_CancelAndReturnToReports' => 'Cancel and %sreturn to the list of reports%s', 'PDFReports_DescriptionOnFirstPage' => 'The report description will be displayed on the first page of the report.', + 'PDFReports_Segment_Help' => 'You can select an existing custom segment to apply to data in this email report. You may create and edit custom segments in your dashboard %s(click here to open)%s, then clicking on the "%s" box, then "%s".', + 'PDFReports_Segment_Deletion_Error' => 'This segment cannot be deleted, because it is used to generate the email report(s) %s. To delete this segment, you can first edit these reports so they don\'t use this segment.', 'PDFReports_WeeklyScheduleHelp' => 'Weekly schedule: report will be sent on Monday of each week.', 'PDFReports_MonthlyScheduleHelp' => 'Monthly schedule: report will be sent the first day of each month.', 'PDFReports_ReportHour' => 'Send report at', @@ -2022,6 +2024,8 @@ And thank you for using Piwik!', 'PDFReports_EmailHello' => 'Hello,', 'PDFReports_PleaseFindAttachedFile' => 'Please find in attached file your %1$s report for %2$s.', 'PDFReports_PleaseFindBelow' => 'Please find below your %1$s report for %2$s.', + 'PDFReports_SegmentAppliedToReports' => 'The segment \'%s\' is applied to the reports.', + 'PDFReports_CustomVisitorSegment' => 'Custom Visitor Segment:', 'PDFReports_AreYouSureDeleteReport' => 'Are you sure you want to delete this report and its schedule?', 'PDFReports_ThereIsNoReportToManage' => 'There is no report to manage for website %s', 'PDFReports_MustBeLoggedIn' => 'You must be logged in to create and schedule custom reports.', diff --git a/plugins/CoreHome/templates/html_report_header.tpl b/plugins/CoreHome/templates/html_report_header.tpl index a8c289a060..ecca962ee1 100644 --- a/plugins/CoreHome/templates/html_report_header.tpl +++ b/plugins/CoreHome/templates/html_report_header.tpl @@ -15,6 +15,12 @@ {$description} - {'General_DateRange'|translate} {$prettyDate} </p> +{if $displaySegment} + <p style="color: rgb({$reportTitleTextColor});"> + {'PDFReports_CustomVisitorSegment'|translate:"Piwik"} {$segmentName} + </p> +{/if} + {if sizeof($reportMetadata) > 1} <h2 style="color: rgb({$reportTitleTextColor}); font-size: {$reportTitleTextSize}pt;"> {'PDFReports_TableOfContent'|translate} diff --git a/plugins/ImageGraph/API.php b/plugins/ImageGraph/API.php index 916589e683..d80572bec0 100644 --- a/plugins/ImageGraph/API.php +++ b/plugins/ImageGraph/API.php @@ -129,7 +129,8 @@ class Piwik_ImageGraph_API $backgroundColor = Piwik_ImageGraph_API::DEFAULT_BACKGROUND_COLOR, $gridColor = Piwik_ImageGraph_API::DEFAULT_GRID_COLOR, $idSubtable = false, - $legendAppendMetric = true + $legendAppendMetric = true, + $segment = false ) { Piwik::checkUserHasViewAccess($idSite); @@ -296,7 +297,7 @@ class Piwik_ImageGraph_API $apiModule, $apiAction, $labels, - $segment = false, + $segment, $plottedMetric, $languageLoaded, $idGoal, @@ -352,7 +353,7 @@ class Piwik_ImageGraph_API $date, $apiModule, $apiAction, - $segment = false, + $segment, $apiParameters = false, $idGoal, $languageLoaded, diff --git a/plugins/MobileMessaging/ReportRenderer/Exception.php b/plugins/MobileMessaging/ReportRenderer/Exception.php index 5fa5796895..c6cdacf36b 100644 --- a/plugins/MobileMessaging/ReportRenderer/Exception.php +++ b/plugins/MobileMessaging/ReportRenderer/Exception.php @@ -59,7 +59,7 @@ class Piwik_MobileMessaging_ReportRenderer_Exception extends Piwik_ReportRendere return $this->rendering; } - public function renderFrontPage($reportTitle, $prettyDate, $description, $reportMetadata) + public function renderFrontPage($reportTitle, $prettyDate, $description, $reportMetadata, $segment) { // nothing to do } diff --git a/plugins/MobileMessaging/ReportRenderer/Sms.php b/plugins/MobileMessaging/ReportRenderer/Sms.php index d492dc1281..734484f3bf 100644 --- a/plugins/MobileMessaging/ReportRenderer/Sms.php +++ b/plugins/MobileMessaging/ReportRenderer/Sms.php @@ -47,7 +47,7 @@ class Piwik_MobileMessaging_ReportRenderer_Sms extends Piwik_ReportRenderer return $this->rendering; } - public function renderFrontPage($reportTitle, $prettyDate, $description, $reportMetadata) + public function renderFrontPage($reportTitle, $prettyDate, $description, $reportMetadata, $segment) { // nothing to do } @@ -121,6 +121,14 @@ class Piwik_MobileMessaging_ReportRenderer_Sms extends Piwik_ReportRenderer $smarty->assign("siteHasECommerce", $siteHasECommerce); $smarty->assign("displaySiteName", $processedReport['metadata']['action'] == 'getAll'); + // segment + $segment = $processedReport['segment']; + $displaySegment = ($segment != null); + $smarty->assign("displaySegment", $displaySegment); + if ($displaySegment) { + $smarty->assign("segmentName", $segment['name']); + } + $this->rendering .= $smarty->fetch(PIWIK_USER_PATH . '/plugins/MobileMessaging/templates/SMSReport.tpl'); } } diff --git a/plugins/MobileMessaging/templates/SMSReport.tpl b/plugins/MobileMessaging/templates/SMSReport.tpl index c74ea165c4..99ea815508 100644 --- a/plugins/MobileMessaging/templates/SMSReport.tpl +++ b/plugins/MobileMessaging/templates/SMSReport.tpl @@ -1,5 +1,9 @@ {strip} - {$prettyDate}.{literal} {/literal} + {$prettyDate} + {if $displaySegment} + ,{literal} {/literal}{$segmentName} + {/if} + .{literal} {/literal} {if empty($reportRows)} {'CoreHome_ThereIsNoDataForThisReport'|translate} @@ -14,7 +18,7 @@ {$rowMetrics.label}:{literal} {/literal} {/if} - {*visits*} + {*visits*} {$rowMetrics.nb_visits} {'General_ColumnNbVisits'|translate} {if $rowMetrics.visits_evolution != 0} {literal} {/literal}({$rowMetrics.visits_evolution}%) @@ -22,7 +26,7 @@ {if $rowMetrics.nb_visits != 0} - {*actions*} + {*actions*} ,{literal} {/literal} {$rowMetrics.nb_actions} {'General_ColumnNbActions'|translate} {if $rowMetrics.actions_evolution != 0} @@ -31,7 +35,7 @@ {if $isGoalPluginEnabled} - {*goal metrics*} + {*goal metrics*} {if $rowMetrics.nb_conversions != 0} ,{literal} {/literal} @@ -47,7 +51,7 @@ {/if} {/if} - {*eCommerce metrics*} + {*eCommerce metrics*} {if $siteHasECommerce[$rowMetadata.idsite]} ,{literal} {/literal} diff --git a/plugins/PDFReports/API.php b/plugins/PDFReports/API.php index aacba73e00..e65d6bbe36 100644 --- a/plugins/PDFReports/API.php +++ b/plugins/PDFReports/API.php @@ -76,10 +76,11 @@ class Piwik_PDFReports_API * @param string $reportFormat 'pdf', 'html' or any other format provided via the PDFReports.getReportFormats hook * @param array $reports array of reports * @param array $parameters array of parameters + * @param int $idSegment Segment Identifier * * @return int idReport generated */ - public function addReport($idSite, $description, $period, $hour, $reportType, $reportFormat, $reports, $parameters) + public function addReport($idSite, $description, $period, $hour, $reportType, $reportFormat, $reports, $parameters, $idSegment = false) { Piwik::checkUserIsNotAnonymous(); Piwik::checkUserHasViewAccess($idSite); @@ -87,7 +88,7 @@ class Piwik_PDFReports_API $currentUser = Piwik::getCurrentUserLogin(); self::ensureLanguageSetForUser($currentUser); - self::validateCommonReportAttributes($period, $hour, $description, $reportType, $reportFormat); + self::validateCommonReportAttributes($period, $hour, $description, $idSegment, $reportType, $reportFormat); // report parameters validations $parameters = self::validateReportParameters($reportType, $parameters); @@ -108,6 +109,7 @@ class Piwik_PDFReports_API 'idsite' => $idSite, 'login' => $currentUser, 'description' => $description, + 'idsegment' => $idSegment, 'period' => $period, 'hour' => $hour, 'type' => $reportType, @@ -134,7 +136,7 @@ class Piwik_PDFReports_API * * @see addReport() */ - public function updateReport($idReport, $idSite, $description, $period, $hour, $reportType, $reportFormat, $reports, $parameters) + public function updateReport($idReport, $idSite, $description, $period, $hour, $reportType, $reportFormat, $reports, $parameters, $idSegment = false) { Piwik::checkUserIsNotAnonymous(); Piwik::checkUserHasViewAccess($idSite); @@ -146,7 +148,7 @@ class Piwik_PDFReports_API $currentUser = Piwik::getCurrentUserLogin(); self::ensureLanguageSetForUser($currentUser); - self::validateCommonReportAttributes($period, $hour, $description, $reportType, $reportFormat); + self::validateCommonReportAttributes($period, $hour, $description, $idSegment, $reportType, $reportFormat); // report parameters validations $parameters = self::validateReportParameters($reportType, $parameters); @@ -157,6 +159,7 @@ class Piwik_PDFReports_API Zend_Registry::get('db')->update(Piwik_Common::prefixTable('report'), array( 'description' => $description, + 'idsegment' => $idSegment, 'period' => $period, 'hour' => $hour, 'type' => $reportType, @@ -199,10 +202,11 @@ class Piwik_PDFReports_API * @param int $idSite If specified, will filter reports that belong to a specific idsite * @param string $period If specified, will filter reports that are scheduled for this period (day,week,month) * @param int $idReport If specified, will filter the report that has the given idReport + * @param int $idSegment If specified, will filter the report that has the given idSegment * @return array * @throws Exception if $idReport was specified but the report wasn't found */ - public function getReports($idSite = false, $period = false, $idReport = false, $ifSuperUserReturnOnlySuperUserReports = false) + public function getReports($idSite = false, $period = false, $idReport = false, $ifSuperUserReturnOnlySuperUserReports = false, $idSegment = false) { Piwik::checkUserHasSomeViewAccess(); $cacheKey = (int)$idSite . '.' . (string)$period . '.' . (int)$idReport . '.' . (int)$ifSuperUserReturnOnlySuperUserReports; @@ -235,6 +239,10 @@ class Piwik_PDFReports_API $sqlWhere .= " AND idreport = ?"; $bind[] = $idReport; } + if (!empty($idSegment)) { + $sqlWhere .= " AND idsegment = ?"; + $bind[] = $idSegment; + } // Joining with the site table to work around pre-1.3 where reports could still be linked to a deleted site $reports = Piwik_FetchAll("SELECT * @@ -330,6 +338,7 @@ class Piwik_PDFReports_API $prettyDate = null; $processedReports = array(); + $segment = self::getSegment($report['idsegment']); foreach ($reportMetadata as $action) { $apiModule = $action['module']; $apiAction = $action['action']; @@ -361,9 +370,12 @@ class Piwik_PDFReports_API $processedReport = Piwik_API_API::getInstance()->getProcessedReport( $idSite, $period, $date, $apiModule, $apiAction, - $segment = false, $apiParameters, $idGoal = false, $language + $segment != null ? $segment['definition'] : false, + $apiParameters, $idGoal = false, $language ); + $processedReport['segment'] = $segment; + // TODO add static method getPrettyDate($period, $date) in Piwik_Period $prettyDate = $processedReport['prettyDate']; @@ -409,7 +421,7 @@ class Piwik_PDFReports_API list($reportSubject, $reportTitle) = self::getReportSubjectAndReportTitle(Piwik_Site::getNameFor($idSite), $report['reports']); $filename = "$reportTitle - $prettyDate - $description"; - $reportRenderer->renderFrontPage($reportTitle, $prettyDate, $description, $reportMetadata); + $reportRenderer->renderFrontPage($reportTitle, $prettyDate, $description, $reportMetadata, $segment); array_walk($processedReports, array($reportRenderer, 'renderReport')); switch ($outputType) { @@ -429,7 +441,8 @@ class Piwik_PDFReports_API $report['metadata'], Piwik_ReportRenderer_Html::IMAGE_GRAPH_WIDTH, Piwik_ReportRenderer_Html::IMAGE_GRAPH_HEIGHT, - $report['evolutionGraph'] + $report['evolutionGraph'], + $segment ); $additionalFile['mimeType'] = 'image/png'; $additionalFile['encoding'] = Zend_Mime::ENCODING_BASE64; @@ -609,11 +622,12 @@ class Piwik_PDFReports_API return Piwik_Common::json_encode($requestedReports); } - private static function validateCommonReportAttributes($period, $hour, &$description, $reportType, $reportFormat) + private static function validateCommonReportAttributes($period, $hour, &$description, &$idSegment, $reportType, $reportFormat) { self::validateReportPeriod($period); self::validateReportHour($hour); self::validateAndTruncateDescription($description); + self::validateIdSegment($idSegment); self::validateReportType($reportType); self::validateReportFormat($reportType, $reportFormat); } @@ -633,6 +647,22 @@ class Piwik_PDFReports_API } } + private static function validateIdSegment(&$idSegment) + { + if (empty($idSegment) || (is_numeric($idSegment) && $idSegment == 0)) { + + $idSegment = null; + + } elseif (!is_numeric($idSegment)) { + + throw new Exception('Invalid segment identifier. Should be an integer.'); + + } elseif (self::getSegment($idSegment) == null) { + + throw new Exception('Segment with id ' . $idSegment . ' does not exist or SegmentEditor is not activated.'); + } + } + private static function validateReportType($reportType) { $reportTypes = array_keys(self::getReportTypes()); @@ -740,4 +770,29 @@ class Piwik_PDFReports_API return $recipients; } + + /** + * @ignore + */ + static public function getSegment($idSegment) + { + if (self::isSegmentEditorActivated() && !empty($idSegment)) { + + $segment = Piwik_SegmentEditor_API::getInstance()->get($idSegment); + + if ($segment) { + return $segment; + } + } + + return null; + } + + /** + * @ignore + */ + public static function isSegmentEditorActivated() + { + return Piwik_PluginsManager::getInstance()->isPluginActivated('SegmentEditor'); + } } diff --git a/plugins/PDFReports/Controller.php b/plugins/PDFReports/Controller.php index 32e879c66d..c91a527789 100644 --- a/plugins/PDFReports/Controller.php +++ b/plugins/PDFReports/Controller.php @@ -70,6 +70,17 @@ class Piwik_PDFReports_Controller extends Piwik_Controller $view->language = Piwik_LanguagesManager::getLanguageCodeForCurrentUser(); + $view->segmentEditorActivated = false; + if (Piwik_PDFReports_API::isSegmentEditorActivated()) { + + $savedSegmentsById = array(); + foreach (Piwik_SegmentEditor_API::getInstance()->getAll($this->idSite) as $savedSegment) { + $savedSegmentsById[$savedSegment['idsegment']] = $savedSegment['name']; + } + $view->savedSegmentsById = $savedSegmentsById; + $view->segmentEditorActivated = true; + } + echo $view->render(); } } diff --git a/plugins/PDFReports/PDFReports.php b/plugins/PDFReports/PDFReports.php index 7c8075c172..fc718235f4 100644 --- a/plugins/PDFReports/PDFReports.php +++ b/plugins/PDFReports/PDFReports.php @@ -67,22 +67,23 @@ class Piwik_PDFReports extends Piwik_Plugin public function getListHooksRegistered() { return array( - 'TopMenu.add' => 'addTopMenu', - 'TaskScheduler.getScheduledTasks' => 'getScheduledTasks', - 'AssetManager.getJsFiles' => 'getJsFiles', - 'PDFReports.getReportParameters' => 'getReportParameters', - 'PDFReports.validateReportParameters' => 'validateReportParameters', - 'PDFReports.getReportMetadata' => 'getReportMetadata', - 'PDFReports.getReportTypes' => 'getReportTypes', - 'PDFReports.getReportFormats' => 'getReportFormats', - 'PDFReports.getRendererInstance' => 'getRendererInstance', - 'PDFReports.getReportRecipients' => 'getReportRecipients', - 'PDFReports.processReports' => 'processReports', - 'PDFReports.allowMultipleReports' => 'allowMultipleReports', - 'PDFReports.sendReport' => 'sendReport', - 'template_reportParametersPDFReports' => 'template_reportParametersPDFReports', - 'UsersManager.deleteUser' => 'deleteUserReport', - 'SitesManager.deleteSite' => 'deleteSiteReport', + 'TopMenu.add' => 'addTopMenu', + 'TaskScheduler.getScheduledTasks' => 'getScheduledTasks', + 'AssetManager.getJsFiles' => 'getJsFiles', + 'PDFReports.getReportParameters' => 'getReportParameters', + 'PDFReports.validateReportParameters' => 'validateReportParameters', + 'PDFReports.getReportMetadata' => 'getReportMetadata', + 'PDFReports.getReportTypes' => 'getReportTypes', + 'PDFReports.getReportFormats' => 'getReportFormats', + 'PDFReports.getRendererInstance' => 'getRendererInstance', + 'PDFReports.getReportRecipients' => 'getReportRecipients', + 'PDFReports.processReports' => 'processReports', + 'PDFReports.allowMultipleReports' => 'allowMultipleReports', + 'PDFReports.sendReport' => 'sendReport', + 'template_reportParametersPDFReports' => 'template_reportParametersPDFReports', + 'UsersManager.deleteUser' => 'deleteUserReport', + 'SitesManager.deleteSite' => 'deleteSiteReport', + Piwik_SegmentEditor_API::DELETE_SEGMENT_EVENT => 'segmentDeletion', ); } @@ -323,18 +324,36 @@ class Piwik_PDFReports extends Piwik_Plugin $attachmentName = $subject; $mail->setFrom($fromEmailAddress, $fromEmailName); + $displaySegmentInfo = false; + $segmentInfo = null; + $segment = Piwik_PDFReports_API::getSegment($report['idsegment']); + if($segment != null) { + $displaySegmentInfo = true; + $segmentInfo = Piwik_Translate('PDFReports_SegmentAppliedToReports', $segment['name']); + } + switch ($report['format']) { case 'html': // Needed when using images as attachment with cid $mail->setType(Zend_Mime::MULTIPART_RELATED); $message .= "<br/>" . Piwik_Translate('PDFReports_PleaseFindBelow', array($periods[$report['period']], $reportTitle)); + + if($displaySegmentInfo) { + $message .= " " . $segmentInfo; + } + $mail->setBodyHtml($message . "<br/><br/>" . $contents); break; default: case 'pdf': $message .= "\n" . Piwik_Translate('PDFReports_PleaseFindAttachedFile', array($periods[$report['period']], $reportTitle)); + + if($displaySegmentInfo) { + $message .= " " . $segmentInfo; + } + $mail->setBodyText($message); $mail->createAttachment( $contents, @@ -487,6 +506,28 @@ class Piwik_PDFReports extends Piwik_Plugin } } + /** + * @param Piwik_Event_Notification $notification notification object + */ + function segmentDeletion($notification) + { + $idSegment = & $notification->getNotificationObject(); + $reportsUsingSegment = Piwik_PDFReports_API::getInstance()->getReports(false, false, false, true, $idSegment); + + if (count($reportsUsingSegment) > 0) { + + $reportList = ''; + $reportNameJoinText = ' ' . Piwik_Translate('General_And') . ' '; + foreach ($reportsUsingSegment as $report) { + $reportList .= '\'' . $report['description'] . '\'' . $reportNameJoinText; + } + $reportList = rtrim($reportList, $reportNameJoinText); + + $errorMessage = Piwik_Translate('PDFReports_Segment_Deletion_Error', $reportList); + throw new Exception($errorMessage); + } + } + function addTopMenu() { Piwik_AddTopMenu( @@ -555,6 +596,7 @@ class Piwik_PDFReports extends Piwik_Plugin `idsite` INTEGER(11) NOT NULL, `login` VARCHAR(100) NOT NULL, `description` VARCHAR(255) NOT NULL, + `idsegment` INT(11), `period` VARCHAR(10) NOT NULL, `hour` tinyint NOT NULL default 0, `type` VARCHAR(10) NOT NULL, diff --git a/plugins/PDFReports/templates/add.tpl b/plugins/PDFReports/templates/add.tpl index 2149863a57..d9c07cfb87 100644 --- a/plugins/PDFReports/templates/add.tpl +++ b/plugins/PDFReports/templates/add.tpl @@ -27,6 +27,25 @@ </div> </td> </tr> + {if $segmentEditorActivated} + <tr> + <td class="first">{'SegmentEditor_ChooseASegment'|translate} </td> + <td> + <select id='report_segment'> + <option value="">{'SegmentEditor_DefaultAllVisits'|translate}</option> + {foreach from=$savedSegmentsById key=savedSegmentId item=savedSegmentName} + <option value="{$savedSegmentId}">{$savedSegmentName}</option> + {/foreach} + </select> + + <div class="entityInlineHelp"> + {capture assign='SegmentEditor_DefaultAllVisits'}{'SegmentEditor_DefaultAllVisits'|translate}{/capture} + {capture assign='SegmentEditor_AddNewSegment'}{'SegmentEditor_AddNewSegment'|translate}{/capture} + {'PDFReports_Segment_Help'|translate:'<a href="./" target="_blank">':'</a>':$SegmentEditor_DefaultAllVisits:$SegmentEditor_AddNewSegment} + </div> + </td> + </tr> + {/if} <tr> <td class="first">{'PDFReports_EmailSchedule'|translate}</td> <td> diff --git a/plugins/PDFReports/templates/list.tpl b/plugins/PDFReports/templates/list.tpl index a8368d9ba6..fc7a2ad173 100644 --- a/plugins/PDFReports/templates/list.tpl +++ b/plugins/PDFReports/templates/list.tpl @@ -36,7 +36,15 @@ {else} {foreach from=$reports item=report} <tr> - <td class="first">{$report.description}</td> + <td class="first"> + {$report.description} + + {if $segmentEditorActivated and isset($report.idsegment)} + <div class="entityInlineHelp" style="font-size: 9pt;"> + {$savedSegmentsById[$report.idsegment]} + </div> + {/if} + </td> <td>{$periods[$report.period]} <!-- Last sent on {$report.ts_last_sent} --> </td> @@ -63,7 +71,7 @@ </td> <td> {*download link*} - <a href="{url module=API period=$report.period token_auth=$token_auth method='PDFReports.generateReport' date=$rawDate idReport=$report.idreport outputType=$downloadOutputType language=$language}" + <a href="{url module=API period=$report.period segment=null token_auth=$token_auth method='PDFReports.generateReport' idReport=$report.idreport outputType=$downloadOutputType language=$language}" target="_blank" name="linkDownloadReport" id="{$report.idreport}" class="link_but"> <img src='{$reportFormatsByReportType[$report.type][$report.format]}' border="0"/> {'General_Download'|translate} diff --git a/plugins/PDFReports/templates/pdf.js b/plugins/PDFReports/templates/pdf.js index 266c403adf..f6f3398a1e 100644 --- a/plugins/PDFReports/templates/pdf.js +++ b/plugins/PDFReports/templates/pdf.js @@ -30,6 +30,7 @@ function formSetEditReport(idReport) { toggleReportType(report.type); $('#report_description').html(report.description); + $('#report_segment').find('option[value=' + report.idsegment + ']').prop('selected', 'selected'); $('#report_type').find('option[value=' + report.type + ']').prop('selected', 'selected'); $('#report_period').find('option[value=' + report.period + ']').prop('selected', 'selected'); $('#report_hour').val(report.hour); @@ -74,6 +75,7 @@ function initManagePdf() { var apiParameters = getReportAjaxRequest(idReport, 'PDFReports.updateReport'); apiParameters.idReport = idReport; apiParameters.description = $('#report_description').val(); + apiParameters.idSegment = $('#report_segment').find('option:selected').val(); apiParameters.reportType = $('#report_type').find('option:selected').val(); apiParameters.reportFormat = $('[name=report_format].' + apiParameters.reportType + ' option:selected').val(); diff --git a/plugins/SegmentEditor/API.php b/plugins/SegmentEditor/API.php index cacd742ae6..15915e1e72 100644 --- a/plugins/SegmentEditor/API.php +++ b/plugins/SegmentEditor/API.php @@ -16,6 +16,8 @@ */ class Piwik_SegmentEditor_API { + const DELETE_SEGMENT_EVENT = 'SegmentEditor.delete'; + static private $instance = null; /** @@ -127,6 +129,10 @@ class Piwik_SegmentEditor_API public function delete($idSegment) { $this->checkUserIsNotAnonymous(); + + // allow plugins using the segment to throw an exception or propagate the deletion + Piwik_PostEvent(self::DELETE_SEGMENT_EVENT, $idSegment); + $segment = $this->getSegmentOrFail($idSegment); $db = Zend_Registry::get('db'); $db->delete(Piwik_Common::prefixTable('segment'), 'idsegment = ' . $idSegment); |