PageRenderTime 42ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/plugins/PDFReports/API.php

https://github.com/quarkness/piwik
PHP | 709 lines | 583 code | 53 blank | 73 comment | 50 complexity | 236d71ee7b61716ddf4a53d6ab5edebb MD5 | raw file
  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$
  8. *
  9. * @category Piwik_Plugins
  10. * @package Piwik_PDFReports
  11. */
  12. /**
  13. * The PDFReports API lets you manage Scheduled Email reports, as well as generate, download or email any existing report.
  14. *
  15. * "generateReport" will generate the requested report (for a specific date range, website and in the requested language).
  16. * "sendEmailReport" will send the report by email to the recipients specified for this report.
  17. *
  18. * You can also get the list of all existing reports via "getReports", create new reports via "addReport",
  19. * or manage existing reports with "updateReport" and "deleteReport".
  20. * See also the documentation about <a href='http://piwik.org/docs/email-reports/' target='_blank'>Scheduled Email reports</a> in Piwik.
  21. *
  22. * @package Piwik_PDFReports
  23. */
  24. class Piwik_PDFReports_API
  25. {
  26. const OUTPUT_DOWNLOAD = 1;
  27. const OUTPUT_SAVE_ON_DISK = 2;
  28. protected $reportsMetadata = array();
  29. static private $instance = null;
  30. /**
  31. * @return Piwik_PDFReports_API
  32. */
  33. static public function getInstance()
  34. {
  35. if (self::$instance == null)
  36. {
  37. self::$instance = new self;
  38. }
  39. return self::$instance;
  40. }
  41. /**
  42. * Creates a new report and schedules it.
  43. *
  44. * @param int $idSite
  45. * @param string $description Report description
  46. * @param string $period Schedule frequency: day, week or month
  47. * @param bool $sendToMe
  48. * @param string $additionalEmails Comma separated list of emails
  49. * @param string $reports Comma separated list of reports
  50. * @return int idReport generated
  51. */
  52. public function addReport( $idSite, $description, $period, $reportFormat, $aggregateReportsFormat, $reports, $emailMe = true, $additionalEmails = false)
  53. {
  54. Piwik::checkUserIsNotAnonymous();
  55. Piwik::checkUserHasViewAccess($idSite);
  56. $this->checkPeriod($period);
  57. $this->checkFormat($reportFormat);
  58. $this->checkAggregateReportsFormat($aggregateReportsFormat);
  59. $description = $this->checkDescription($description);
  60. $currentUser = Piwik::getCurrentUserLogin();
  61. $emailMe = (int)$emailMe;
  62. $this->ensureLanguageSetForUser($currentUser);
  63. $additionalEmails = $this->checkAdditionalEmails($additionalEmails);
  64. $reports = $this->checkAvailableReports($idSite, $reports);
  65. $db = Zend_Registry::get('db');
  66. $idReport = $db->fetchOne("SELECT max(idreport) + 1
  67. FROM ".Piwik_Common::prefixTable('pdf'));
  68. if($idReport == false)
  69. {
  70. $idReport = 1;
  71. }
  72. $db->insert(Piwik_Common::prefixTable('pdf'),
  73. array(
  74. 'idreport' => $idReport,
  75. 'idsite' => $idSite,
  76. 'login' => $currentUser,
  77. 'description' => $description,
  78. 'period' => $period,
  79. 'format' => $reportFormat,
  80. 'aggregate_reports_format' => $aggregateReportsFormat,
  81. 'email_me' => $emailMe,
  82. 'additional_emails' => $additionalEmails,
  83. 'reports' => $reports,
  84. 'ts_created' => Piwik_Date::now()->getDatetime(),
  85. 'deleted' => 0,
  86. ));
  87. return $idReport;
  88. }
  89. private function ensureLanguageSetForUser($currentUser)
  90. {
  91. $lang = Piwik_LanguagesManager_API::getInstance()->getLanguageForUser( $currentUser );
  92. if(empty($lang))
  93. {
  94. Piwik_LanguagesManager_API::getInstance()->setLanguageForUser( $currentUser, Piwik_LanguagesManager::getLanguageCodeForCurrentUser() );
  95. }
  96. }
  97. /**
  98. * Updates an existing report.
  99. *
  100. * @see addReport()
  101. */
  102. public function updateReport( $idReport, $idSite, $description, $period, $reportFormat, $aggregateReportsFormat, $reports, $emailMe = true, $additionalEmails = false)
  103. {
  104. Piwik::checkUserHasViewAccess($idSite);
  105. $pdfReports = $this->getReports($idSite, $periodSearch = false, $idReport);
  106. $report = reset($pdfReports);
  107. $idReport = $report['idreport'];
  108. $this->checkPeriod($period);
  109. $this->checkFormat($reportFormat);
  110. $this->checkAggregateReportsFormat($aggregateReportsFormat);
  111. $description = $this->checkDescription($description);
  112. $currentUser = Piwik::getCurrentUserLogin();
  113. $emailMe = (int)$emailMe;
  114. $this->ensureLanguageSetForUser($currentUser);
  115. $additionalEmails = $this->checkAdditionalEmails($additionalEmails);
  116. $reports = $this->checkAvailableReports($idSite, $reports);
  117. Zend_Registry::get('db')->update( Piwik_Common::prefixTable('pdf'),
  118. array(
  119. 'description' => $description,
  120. 'period' => $period,
  121. 'format' => $reportFormat,
  122. 'aggregate_reports_format' => $aggregateReportsFormat,
  123. 'email_me' => $emailMe,
  124. 'additional_emails' => $additionalEmails,
  125. 'reports' => $reports,
  126. ),
  127. "idreport = '$idReport'"
  128. );
  129. self::$cache = array();
  130. }
  131. /**
  132. * Deletes a specific report
  133. *
  134. * @param int $idReport
  135. */
  136. public function deleteReport($idReport)
  137. {
  138. $pdfReports = $this->getReports($idSite = false, $periodSearch = false, $idReport);
  139. $report = reset($pdfReports);
  140. Piwik::checkUserIsSuperUserOrTheUser($report['login']);
  141. Zend_Registry::get('db')->update( Piwik_Common::prefixTable('pdf'),
  142. array(
  143. 'deleted' => 1,
  144. ),
  145. "idreport = '$idReport'"
  146. );
  147. self::$cache = array();
  148. }
  149. // static cache storing reports
  150. public static $cache = array();
  151. /**
  152. * Returns the list of reports matching the passed parameters
  153. *
  154. * @param int $idSite If specified, will filter reports that belong to a specific idsite
  155. * @param string $period If specified, will filter reports that are scheduled for this period (day,week,month)
  156. * @param int $idReport If specified, will filter the report that has the given idReport
  157. * @return array
  158. * @throws Exception if $idReport was specified but the report wasn't found
  159. */
  160. public function getReports($idSite = false, $period = false, $idReport = false, $ifSuperUserReturnOnlySuperUserReports = false)
  161. {
  162. $cacheKey = (int)$idSite .'.'. (string)$period .'.'. (int)$idReport .'.'. (int)$ifSuperUserReturnOnlySuperUserReports;
  163. if(isset(self::$cache[$cacheKey]))
  164. {
  165. return self::$cache[$cacheKey];
  166. }
  167. $sqlWhere = '';
  168. $bind = array();
  169. // Super user gets all reports back, other users only their own
  170. if(!Piwik::isUserIsSuperUser()
  171. || $ifSuperUserReturnOnlySuperUserReports)
  172. {
  173. $sqlWhere .= "AND login = ?";
  174. $bind[] = Piwik::getCurrentUserLogin();
  175. }
  176. if(!empty($period))
  177. {
  178. $this->checkPeriod($period);
  179. $sqlWhere .= " AND period = ? ";
  180. $bind[] = $period;
  181. }
  182. if(!empty($idSite))
  183. {
  184. Piwik::checkUserHasViewAccess($idSite);
  185. $sqlWhere .= " AND ".Piwik_Common::prefixTable('site').".idsite = ?";
  186. $bind[] = $idSite;
  187. }
  188. if(!empty($idReport))
  189. {
  190. $sqlWhere .= " AND idreport = ?";
  191. $bind[] = $idReport;
  192. }
  193. // Joining with the site table to work around pre-1.3 where reports could still be linked to a deleted site
  194. $reports = Piwik_FetchAll("SELECT *
  195. FROM ".Piwik_Common::prefixTable('pdf')."
  196. JOIN ".Piwik_Common::prefixTable('site')."
  197. USING (idsite)
  198. WHERE deleted = 0
  199. $sqlWhere", $bind);
  200. // When a specific report was requested and not found, throw an error
  201. if($idReport !== false
  202. && empty($reports))
  203. {
  204. throw new Exception("Requested report couldn't be found.");
  205. }
  206. // static cache
  207. self::$cache[$cacheKey] = $reports;
  208. return $reports;
  209. }
  210. /**
  211. * Generates a report file.
  212. *
  213. * @param int $idReport ID of the report to generate. If idReport=0 it will generate a report containing all reports
  214. * for the specified period & date
  215. * @param string $date YYYY-MM-DD
  216. * @param int|false $idSite
  217. * @param string|false $language If not passed, will use default language.
  218. * @param int|false $outputType 1 = download report, 2 = save report to disk, defaults to download
  219. * @param string|false $period Defaults to 'day'. If not specified, will default to the report's period set when creating the report
  220. * @param string $reportFormat pdf, html
  221. * @param int|false $aggregateReportsFormat 1 = display only tables, 2 = display only graphs, 3 = display both
  222. */
  223. public function generateReport($idReport, $date, $idSite = false, $language = false, $outputType = false, $period = false, $reportFormat = false, $aggregateReportsFormat = false)
  224. {
  225. // Load specified language
  226. if(empty($language))
  227. {
  228. $language = Piwik_Translate::getInstance()->getLanguageDefault();
  229. }
  230. Piwik_Translate::getInstance()->reloadLanguage($language);
  231. // Available reports
  232. $reportMetadata = Piwik_API_API::getInstance()->getReportMetadata($idSite);
  233. // Test template: include all reports
  234. if($idReport == 0)
  235. {
  236. if(empty($period))
  237. {
  238. $period = 'day';
  239. }
  240. if(empty($reportFormat))
  241. {
  242. $reportFormat = Piwik_PDFReports::DEFAULT_FORMAT;
  243. }
  244. if(empty($aggregateReportsFormat))
  245. {
  246. $aggregateReportsFormat = Piwik_PDFReports::DEFAULT_AGGREGATE_REPORTS_FORMAT;
  247. }
  248. $reports = array();
  249. foreach($reportMetadata as $report)
  250. {
  251. if($report['category'] != 'API')
  252. {
  253. $reports[] = $report;
  254. }
  255. }
  256. $description = Piwik_Translate('PDFReports_DefaultContainingAllReports');
  257. }
  258. // Template is a custom template
  259. else
  260. {
  261. $pdfReports = $this->getReports($idSite, $_period = false, $idReport);
  262. $pdfReport = reset($pdfReports);
  263. $reportUniqueIds = explode(',', $pdfReport['reports']);
  264. $description = $pdfReport['description'];
  265. // If period wasn't specified, we shall default to the report's period
  266. if(empty($period))
  267. {
  268. $period = 'day';
  269. if($pdfReport['period'] != 'never')
  270. {
  271. $period = $pdfReport['period'];
  272. }
  273. }
  274. // If format wasn't specified, defaults to the report's format
  275. if(empty($reportFormat))
  276. {
  277. $reportFormat = $pdfReport['format'];
  278. // Handle cases for reports created before the 'format' field
  279. if(empty($reportFormat))
  280. {
  281. $reportFormat = Piwik_PDFReports::DEFAULT_FORMAT;
  282. }
  283. }
  284. // If $aggregateReportsFormat wasn't specified, defaults to the report configuration
  285. if(empty($aggregateReportsFormat))
  286. {
  287. $aggregateReportsFormat = $pdfReport['aggregate_reports_format'];
  288. }
  289. // We need to lookup which reports metadata are registered in this report
  290. $reports = array();
  291. foreach($reportMetadata as $metadata)
  292. {
  293. if(in_array($metadata['uniqueId'], $reportUniqueIds))
  294. {
  295. $reports[] = $metadata;
  296. }
  297. }
  298. }
  299. $description = str_replace(array("\r", "\n"), ' ', $description);
  300. // The report will be rendered with the first 30 rows and will aggregate other rows in a summary row
  301. $filterTruncateGET = Piwik_Common::getRequestVar('filter_truncate', false);
  302. $_GET['filter_truncate'] = 30;
  303. $websiteName = $prettyDate = false;
  304. $processedReports = array();
  305. foreach ($reports as $action)
  306. {
  307. $apiModule = $action['module'];
  308. $apiAction = $action['action'];
  309. $apiParameters = array();
  310. if(isset($action['parameters']))
  311. {
  312. $apiParameters = $action['parameters'];
  313. }
  314. $report = Piwik_API_API::getInstance()->getProcessedReport($idSite, $period, $date, $apiModule, $apiAction, $segment = false, $apiParameters, $idGoal = false, $language);
  315. $websiteName = $report['website'];
  316. $prettyDate = $report['prettyDate'];
  317. $reportMetadata = $report['metadata'];
  318. $isAggregateReport = !empty($reportMetadata['dimension']);
  319. $report['displayTable'] = !$isAggregateReport ||
  320. $aggregateReportsFormat == Piwik_PDFReports::AGGREGATE_REPORTS_FORMAT_TABLES ||
  321. $aggregateReportsFormat == Piwik_PDFReports::AGGREGATE_REPORTS_FORMAT_TABLES_GRAPHS;
  322. $report['displayGraph'] = !$isAggregateReport ||
  323. $aggregateReportsFormat == Piwik_PDFReports::AGGREGATE_REPORTS_FORMAT_GRAPHS ||
  324. $aggregateReportsFormat == Piwik_PDFReports::AGGREGATE_REPORTS_FORMAT_TABLES_GRAPHS;
  325. if ($report['displayGraph']
  326. && !empty($reportMetadata['imageGraphUrl']))
  327. {
  328. $request = new Piwik_API_Request(
  329. $reportMetadata['imageGraphUrl'] .
  330. '&outputType='.Piwik_ImageGraph_API::GRAPH_OUTPUT_PHP.
  331. '&format=original&serialize=0'.
  332. '&height='.Piwik_ReportRenderer::IMAGE_GRAPH_HEIGHT.
  333. '&width='.Piwik_ReportRenderer::IMAGE_GRAPH_WIDTH
  334. );
  335. try {
  336. $imageGraph = $request->process();
  337. // Get image data as string
  338. ob_start();
  339. imagepng($imageGraph);
  340. $imageGraphData = ob_get_contents();
  341. ob_end_clean();
  342. imagedestroy($imageGraph);
  343. $report['generatedImageGraph'] = $imageGraphData;
  344. } catch(Exception $e) {
  345. throw new Exception("ImageGraph API returned an error: ".$e->getMessage()."\n");
  346. }
  347. }
  348. $processedReports[] = $report;
  349. }
  350. // Restore values
  351. if($filterTruncateGET !== false)
  352. {
  353. $_GET['filter_truncate'] = $filterTruncateGET;
  354. }
  355. // Generate the report
  356. $reportRenderer = Piwik_ReportRenderer::factory($reportFormat);
  357. $reportRenderer->setLocale($language);
  358. $reportRenderer->setRenderImageInline($outputType == self::OUTPUT_DOWNLOAD ? true : false);
  359. $reportRenderer->renderFrontPage($websiteName, $prettyDate, $description, $reports );
  360. array_walk($processedReports, array($reportRenderer, 'renderReport'));
  361. switch($outputType)
  362. {
  363. case self::OUTPUT_SAVE_ON_DISK:
  364. $outputFilename = 'Email Report - ' . $idReport . '.' . $date . '.' . $idSite . '.' . $language;
  365. $outputFilename = $reportRenderer->sendToDisk($outputFilename);
  366. $additionalFiles = array();
  367. if($reportFormat == 'html')
  368. {
  369. foreach ($processedReports as &$report) {
  370. if($report['displayGraph'])
  371. {
  372. $additionalFile = array();
  373. $additionalFile['filename'] = $report['metadata']['name'].'.png';
  374. $additionalFile['cid'] = $report['metadata']['uniqueId'];
  375. $additionalFile['content'] = $report['generatedImageGraph'];
  376. $additionalFile['mimeType'] = 'image/png';
  377. $additionalFile['encoding'] = Zend_Mime::ENCODING_BASE64;
  378. $additionalFiles[] = $additionalFile;
  379. }
  380. }
  381. }
  382. return array( $outputFilename,
  383. $prettyDate,
  384. $websiteName,
  385. $reportFormat,
  386. $additionalFiles,
  387. );
  388. break;
  389. default:
  390. case self::OUTPUT_DOWNLOAD:
  391. $reportRenderer->sendToBrowserDownload("$websiteName - $prettyDate - $description");
  392. break;
  393. }
  394. }
  395. public function sendEmailReport($idReport, $idSite, $period = false, $date = false)
  396. {
  397. $reports = $this->getReports($idSite, false, $idReport);
  398. $report = reset($reports);
  399. if($report['period'] == 'never')
  400. {
  401. $report['period'] = 'day';
  402. }
  403. if(!empty($period))
  404. {
  405. $report['period'] = $period;
  406. }
  407. if(empty($date))
  408. {
  409. $date = Piwik_Date::now()->subPeriod(1, $report['period'])->toString();
  410. }
  411. // Get user emails and languages
  412. $emails = self::getEmailsFromString($report['additional_emails']);
  413. if($report['email_me'] == 1)
  414. {
  415. if(Piwik::getCurrentUserLogin() == $report['login'])
  416. {
  417. $emails[] = Piwik::getCurrentUserEmail();
  418. }
  419. elseif($report['login'] == Zend_Registry::get('config')->superuser->login)
  420. {
  421. $emails[] = Piwik::getSuperUserEmail();
  422. }
  423. else
  424. {
  425. try {
  426. $user = Piwik_UsersManager_API::getInstance()->getUser($report['login']);
  427. } catch(Exception $e) {
  428. return;
  429. }
  430. $emails[] = $user['email'];
  431. }
  432. }
  433. $language = Piwik_LanguagesManager_API::getInstance()->getLanguageForUser($report['login']);
  434. list($outputFilename, $prettyDate, $websiteName, $reportFormat, $additionalFiles) =
  435. $this->generateReport(
  436. $idReport,
  437. $date,
  438. $idSite,
  439. $language,
  440. self::OUTPUT_SAVE_ON_DISK,
  441. $report['period']
  442. );
  443. $this->sendReportEmail($emails, $outputFilename, $prettyDate, $websiteName, $report, $reportFormat, $additionalFiles);
  444. }
  445. protected function sendReportEmail($emails, $outputFilename, $prettyDate, $websiteName, $report, $reportFormat, $additionalFiles)
  446. {
  447. $periods = self::getPeriodToFrequency();
  448. $message = Piwik_Translate('PDFReports_EmailHello');
  449. $subject = Piwik_Translate('General_Report') . ' '. $websiteName . " - ".$prettyDate;
  450. if(!file_exists($outputFilename))
  451. {
  452. throw new Exception("The report file wasn't found in $outputFilename");
  453. }
  454. $filename = basename($outputFilename);
  455. $handle = fopen($outputFilename, "r");
  456. $contents = fread($handle, filesize($outputFilename));
  457. fclose($handle);
  458. $mail = new Piwik_Mail();
  459. $mail->setSubject($subject);
  460. $fromEmailName = Piwik_Translate('PDFReports_PiwikReports');
  461. $fromEmailAddress = Zend_Registry::get('config')->General->noreply_email_address;
  462. $attachmentName = $subject;
  463. $mail->setFrom($fromEmailAddress, $fromEmailName);
  464. switch ($reportFormat)
  465. {
  466. case 'html':
  467. // Needed when using images as attachment with cid
  468. $mail->setType(Zend_Mime::MULTIPART_RELATED);
  469. $message .= "<br/>" . Piwik_Translate('PDFReports_PleaseFindBelow', array($periods[$report['period']], $websiteName));
  470. $mail->setBodyHtml($message . "<br/><br/>". $contents);
  471. break;
  472. default:
  473. case 'pdf':
  474. $message .= "\n" . Piwik_Translate('PDFReports_PleaseFindAttachedFile', array($periods[$report['period']], $websiteName));
  475. $mail->setBodyText($message);
  476. $mail->createAttachment( $contents,
  477. 'application/pdf',
  478. Zend_Mime::DISPOSITION_INLINE,
  479. Zend_Mime::ENCODING_BASE64,
  480. $attachmentName.'.pdf'
  481. );
  482. break;
  483. }
  484. foreach($additionalFiles as $additionalFile)
  485. {
  486. $fileContent = $additionalFile['content'];
  487. $at = $mail->createAttachment(
  488. $fileContent,
  489. $additionalFile['mimeType'],
  490. Zend_Mime::DISPOSITION_INLINE,
  491. $additionalFile['encoding'],
  492. $additionalFile['filename']
  493. );
  494. $at->id = $additionalFile['cid'];
  495. unset($fileContent);
  496. }
  497. foreach ($emails as $email)
  498. {
  499. $mail->addTo($email);
  500. try {
  501. $mail->send();
  502. } catch(Exception $e) {
  503. // If running from piwik.php with debug, we ignore the 'email not sent' error
  504. if(!isset($GLOBALS['PIWIK_TRACKER_DEBUG']) || !$GLOBALS['PIWIK_TRACKER_DEBUG'])
  505. {
  506. throw new Exception("An error occured while sending '$filename' ".
  507. " to ". implode(', ',$mail->getRecipients()). ".
  508. Error was '". $e->getMessage()."'");
  509. }
  510. }
  511. $mail->clearRecipients();
  512. }
  513. // Update flag in DB
  514. Zend_Registry::get('db')->update( Piwik_Common::prefixTable('pdf'),
  515. array( 'ts_last_sent' => Piwik_Date::now()->getDatetime() ),
  516. "idreport = " . $report['idreport']
  517. );
  518. // If running from piwik.php with debug, do not delete the PDF after sending the email
  519. if(!isset($GLOBALS['PIWIK_TRACKER_DEBUG']) || !$GLOBALS['PIWIK_TRACKER_DEBUG'])
  520. {
  521. @chmod($outputFilename, 0600);
  522. @unlink($outputFilename);
  523. }
  524. }
  525. private function checkAdditionalEmails($additionalEmails)
  526. {
  527. if(empty($additionalEmails))
  528. {
  529. return '';
  530. }
  531. $additionalEmails = self::getEmailsFromString($additionalEmails);
  532. foreach($additionalEmails as &$email)
  533. {
  534. $email = trim($email);
  535. if(!Piwik::isValidEmailString($email))
  536. {
  537. throw new Exception(Piwik_TranslateException('UsersManager_ExceptionInvalidEmail') . ' ('.$email.')');
  538. }
  539. }
  540. $additionalEmails = implode(',',$additionalEmails);
  541. return $additionalEmails;
  542. }
  543. static protected function getEmailsFromString($additionalEmails)
  544. {
  545. if(empty($additionalEmails))
  546. {
  547. return array();
  548. }
  549. $additionalEmails = explode(',', trim($additionalEmails));
  550. $additionalEmails = array_filter($additionalEmails, 'strlen');
  551. return $additionalEmails;
  552. }
  553. private function checkDescription($description)
  554. {
  555. return substr($description, 0, 250);
  556. }
  557. private function checkAvailableReports($idSite, $reports)
  558. {
  559. $availableReports = Piwik_API_API::getInstance()->getReportMetadata($idSite);
  560. $availableReportIds = array();
  561. foreach($availableReports as $report)
  562. {
  563. $availableReportIds[] = $report['uniqueId'];
  564. }
  565. $reports = explode(',', $reports);
  566. $reports = array_filter($reports, 'strlen');
  567. foreach($reports as $report)
  568. {
  569. if(!in_array($report, $availableReportIds))
  570. {
  571. throw new Exception("Report $report is unknown.");
  572. }
  573. }
  574. $reports = implode(',', $reports);
  575. return $reports;
  576. }
  577. private function checkPeriod($period)
  578. {
  579. $availablePeriods = array('day', 'week', 'month', 'never');
  580. if(!in_array($period, $availablePeriods))
  581. {
  582. throw new Exception(Piwik_Translate("Period schedule must be one of the following: " . implode(', ', $availablePeriods)));
  583. }
  584. }
  585. private function checkFormat($format)
  586. {
  587. $availableReportRenderers = array_keys(Piwik_ReportRenderer::$availableReportRenderers);
  588. if(!in_array($format, $availableReportRenderers))
  589. {
  590. throw new Exception(
  591. Piwik_TranslateException(
  592. 'General_ExceptionInvalidReportRendererFormat',
  593. array($format, implode(', ', $availableReportRenderers))
  594. )
  595. );
  596. }
  597. }
  598. private function checkAggregateReportsFormat($format)
  599. {
  600. $availableAggregateReportsFormats = array_keys(Piwik_PDFReports_API::getAggregateReportsFormats());
  601. if(!in_array($format, $availableAggregateReportsFormats))
  602. {
  603. throw new Exception(
  604. Piwik_TranslateException(
  605. 'General_ExceptionInvalidAggregateReportsFormat',
  606. array($format, implode(', ', $availableAggregateReportsFormats))
  607. )
  608. );
  609. }
  610. }
  611. /**
  612. * @ignore
  613. */
  614. static public function getPeriodToFrequency()
  615. {
  616. $periods = array(
  617. 'day' => Piwik_Translate('General_Daily'),
  618. 'week' => Piwik_Translate('General_Weekly'),
  619. 'month' => Piwik_Translate('General_Monthly'),
  620. );
  621. return $periods;
  622. }
  623. /**
  624. * @ignore
  625. */
  626. static public function getAggregateReportsFormats()
  627. {
  628. $periods = array(
  629. Piwik_PDFReports::AGGREGATE_REPORTS_FORMAT_TABLES => Piwik_Translate('PDFReports_AggregateReportsFormat_TablesOnly'),
  630. Piwik_PDFReports::AGGREGATE_REPORTS_FORMAT_GRAPHS => Piwik_Translate('PDFReports_AggregateReportsFormat_GraphsOnly'),
  631. Piwik_PDFReports::AGGREGATE_REPORTS_FORMAT_TABLES_GRAPHS => Piwik_Translate('PDFReports_AggregateReportsFormat_TablesAndGraphs'),
  632. );
  633. return $periods;
  634. }
  635. }