Пример #1
0
 /**
  * Get a stats for email by list
  *
  * @param Email|int $email
  * @param bool      $includeVariants
  *
  * @return array
  */
 public function getEmailDeviceStats($email, $includeVariants = false, $dateFrom = null, $dateTo = null)
 {
     if (!$email instanceof Email) {
         $email = $this->getEntity($email);
     }
     $emailIds = $includeVariants ? $email->getRelatedEntityIds() : [$email->getId()];
     $templateEmail = 'template' === $email->getEmailType();
     $results = $this->getStatDeviceRepository()->getDeviceStats($emailIds, $dateFrom, $dateTo);
     // Organize by list_id (if a segment email) and/or device
     $stats = [];
     $devices = [];
     foreach ($results as $result) {
         if (empty($result['device'])) {
             $result['device'] = $this->translator->trans('mautic.core.unknown');
         } else {
             $result['device'] = mb_substr($result['device'], 0, 12);
         }
         $devices[$result['device']] = $result['device'];
         if ($templateEmail) {
             // List doesn't matter
             $stats[$result['device']] = $result['count'];
         } elseif (null !== $result['list_id']) {
             if (!isset($stats[$result['list_id']])) {
                 $stats[$result['list_id']] = [];
             }
             if (!isset($stats[$result['list_id']][$result['device']])) {
                 $stats[$result['list_id']][$result['device']] = (int) $result['count'];
             } else {
                 $stats[$result['list_id']][$result['device']] += (int) $result['count'];
             }
         }
     }
     $listCount = 0;
     if (!$templateEmail) {
         $lists = $email->getLists();
         $listNames = [];
         foreach ($lists as $l) {
             $listNames[$l->getId()] = $l->getName();
         }
         $listCount = count($listNames);
     }
     natcasesort($devices);
     $chart = new BarChart(array_values($devices));
     if ($templateEmail) {
         // Populate the data
         $chart->setDataset(null, array_values($stats), 0);
     } else {
         $combined = [];
         $key = $listCount > 1 ? 1 : 0;
         foreach ($listNames as $id => $name) {
             // Fill in missing devices
             $listStats = [];
             foreach ($devices as $device) {
                 $listStat = !isset($stats[$id][$device]) ? 0 : $stats[$id][$device];
                 $listStats[] = $listStat;
                 if (!isset($combined[$device])) {
                     $combined[$device] = 0;
                 }
                 $combined[$device] += $listStat;
             }
             // Populate the data
             $chart->setDataset($name, $listStats, $key);
             $key++;
         }
         if ($listCount > 1) {
             $chart->setDataset($this->translator->trans('mautic.email.lists.combined'), array_values($combined), 0);
         }
     }
     return $chart->render();
 }
Пример #2
0
 /**
  * Get bar chart data of hits
  *
  * @param char     $unit   {@link php.net/manual/en/function.date.php#refsect1-function.date-parameters}
  * @param DateTime $dateFrom
  * @param DateTime $dateTo
  * @param string   $dateFormat
  * @param array    $filter
  *
  * @return array
  */
 public function getHitsBarChartData($unit, \DateTime $dateFrom, \DateTime $dateTo, $dateFormat = null, $filter = array())
 {
     $chart = new BarChart($unit, $dateFrom, $dateTo, $dateFormat);
     $query = $chart->getChartQuery($this->factory->getEntityManager()->getConnection());
     $chartData = $query->fetchTimeData('page_hits', 'date_hit', $filter);
     $chart->setDataset($this->factory->getTranslator()->trans('mautic.page.field.hits'), $chartData);
     return $chart->render();
 }