dashboards-8.x-1.0-beta10/modules/dashboards_matomo/src/Plugin/Dashboard/MatomoBase.php

modules/dashboards_matomo/src/Plugin/Dashboard/MatomoBase.php
<?php

namespace Drupal\dashboards_matomo\Plugin\Dashboard;

use Drupal\Component\Serialization\Json;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Datetime\DateFormatterInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\dashboards\Plugin\Dashboard\ChartTrait;
use Drupal\dashboards\Plugin\DashboardLazyBuildBase;
use Drupal\matomo_reporting_api\MatomoQueryFactory;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Base class for matomo plugins.
 */
abstract class MatomoBase extends DashboardLazyBuildBase {
  use ChartTrait;

  /**
   * Entity query.
   *
   * @var \Drupal\matomo_reporting_api\MatomoQueryFactory
   */
  protected $matomoQuery;

  /**
   * Date formatter.
   *
   * @var \Drupal\Core\Datetime\DateFormatterInterface
   */
  protected $dateFormatter;

  /**
   * {@inheritdoc}
   */
  public function __construct(
    array $configuration,
    $plugin_id,
    $plugin_definition,
    CacheBackendInterface $cache,
    MatomoQueryFactory $matomo,
    DateFormatterInterface $date_formatter,
  ) {
    parent::__construct($configuration, $plugin_id, $plugin_definition, $cache);
    $this->matomoQuery = $matomo;
    $this->dateFormatter = $date_formatter;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('dashboards.cache'),
      $container->get('matomo.query_factory'),
      $container->get('date.formatter')
    );
  }

  /**
   * Get matomo query.
   *
   * @return \Drupal\matomo_reporting_api\MatomoQueryFactory
   *   Matomo query factory.
   */
  public function getQuery() {
    return $this->matomoQuery;
  }

  /**
   * Translate date matomo string.
   *
   * @param string $period
   *   Period to translated.
   *
   * @return string
   *   Translated date.
   */
  protected function getDateTranslated(string $period): string {
    $format = 'Y-m-d';
    $start = time();
    $time = time();
    switch ($period) {
      case 'last_seven_days':
        $start = strtotime('-7 days');
        break;

      case 'this_week':
        $start = strtotime('monday this week');
        $time = strtotime('sunday this week');
        break;

      case 'this_month':
        $start = strtotime('first day of this month');
        $time = strtotime('last day of this month');
        break;

      case 'last_three_months':
        $start = strtotime('first day of this month -2 months');
        $time = strtotime('last day of this month');
        break;

      case 'last_six_months':
        $start = strtotime('first day of this month -5 months');
        $time = strtotime('last day of this month');
        break;

      case 'year':
        $start = strtotime('first day of this year');
        $time = strtotime('last day of this year');
        break;

      default:
        return $period;
    }
    $date = new \DateTime();
    $date->setTimestamp($time);

    $startDateTime = new \DateTime();
    $startDateTime->setTimestamp($start);

    return implode(',', [
      $startDateTime->format($format),
      $date->format($format),
    ]);
  }

  /**
   * Helper function for build rows from matomo.
   *
   * @param mixed $response
   *   Data from matomo.
   * @param string $label
   *   Label for display.
   * @param array $column
   *   Columns to show.
   */
  protected function buildDateRows($response, $label, array $column) {
    $labels = [$label];
    foreach ($response as $date => &$row) {
      foreach ($row as $key => $r) {
        $labels[$r['label']] = $r['label'];
        unset($row[$key]);
        $row[$r['label']] = $r;
        uksort($row, function ($a, $b) {
          return strcmp($a, $b);
        });
      }
    }
    $items = [];
    foreach ($response as $date => &$row) {
      $item = [$date];
      if (empty($row)) {
        if (is_array($column)) {
          foreach ($column as $c) {
            $item[] = 0;
          }
          continue;
        }
        $item[] = 0;
      }
      foreach ($row as $r) {
        if (is_array($column)) {
          foreach ($column as $c) {
            $item[] = $r[$c];
          }
          continue;
        }
        $item[] = $r[$column];
      }
      $items[] = $item;
    }
    $this->setRows($items);
    $this->setLabels($labels);
  }

  /**
   * Helper function for query matomo.
   *
   * @param string $action
   *   Matomo action to call.
   * @param array $params
   *   Parameters.
   *
   * @return array
   *   Response array
   */
  protected function query($action, array $params): array {
    $cid = md5(serialize([$action, $params]));
    if ($data = $this->getCache($cid)) {
      return $data->data;
    }
    $query = $this->matomoQuery->getQuery($action);
    $query->setParameters($params);

    $response = $query->execute()->getRawResponse();
    $response = Json::decode($response->getBody()->getContents());
    if (isset($response['result']) && $response['result'] == 'error') {
      throw new \Exception($response['message']);
    }
    $items = [];
    foreach ($response as $date => $values) {
      $nDates = explode(',', $date);
      array_walk($nDates, function (&$i, $key, $formatter) {
        $date = strtotime($i);
        if ($date !== FALSE) {
          $i = $formatter->format($date, 'custom', 'd.m.Y');
        }
      }, $this->dateFormatter);
      $date = implode(',', $nDates);
      if (count($nDates) > 1) {
        $date = static::formatDateRange($nDates[0], $nDates[1]);
      }
      $items[$date] = $values;
    }
    $this->setCache($cid, $items, time() + 600);
    return $items;
  }

  /**
   * Helper function for short date ranges.
   *
   * @param int $d1
   *   Date start.
   * @param int $d2
   *   Date end.
   *
   * @return string
   *   Formatted date.
   */
  public static function formatDateRange($d1, $d2) {
    $d1 = new \DateTime($d1);
    $d2 = new \DateTime($d2);
    if ($d1->format('Y-m-d') === $d2->format('Y-m-d')) {
      return $d1->format('d.m');
    }
    elseif ($d1->format('Y-m') === $d2->format('Y-m')) {
      return $d1->format('d') . $d2->format(' – d.m');
    }
    elseif ($d1->format('Y') === $d2->format('Y')) {
      return $d1->format('d.m') . $d2->format(' – d.m');
    }
    else {
      return $d1->format('d.m.Y') . $d2->format(' – d.m.Y');
    }
  }

  /**
   * {@inheritdoc}
   */
  public function buildSettingsForm(array $form, FormStateInterface $form_state, array $configuration): array {
    $form['period'] = [
      '#type' => 'select',
      '#options' => [
        'day' => $this->t('Day'),
        'week' => $this->t('Week'),
        'month' => $this->t('Month'),
        'year' => $this->t('Year'),
      ],
      '#default_value' => (isset($configuration['period'])) ? $configuration['period'] : 'day',
    ];
    $form['date'] = [
      '#type' => 'select',
      '#options' => [
        'last_seven_days' => $this->t('Last seven days'),
        'this_week' => $this->t('This week'),
        'this_month' => $this->t('This month'),
        'last_three_months' => $this->t('Last 3 months'),
        'last_six_months' => $this->t('Last 6 months'),
        'year' => $this->t('This year'),
      ],
      '#default_value' => (isset($configuration['date'])) ? $configuration['date'] : 'today',
    ];
    $form['chart_type'] = [
      '#type' => 'select',
      '#options' => $this->getAllowedStyles(),
      '#default_value' => (isset($configuration['chart_type'])) ? $configuration['chart_type'] : 'bar',
    ];
    $form['legend'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Show legend'),
      '#default_value' => (isset($configuration['legend'])) ? $configuration['legend'] : 0,
    ];
    return $form;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc