arch-8.x-1.x-dev/modules/order/src/Plugin/StoreDashboardPanel/OrderCount.php

modules/order/src/Plugin/StoreDashboardPanel/OrderCount.php
<?php

namespace Drupal\arch_order\Plugin\StoreDashboardPanel;

use Drupal\arch\StoreDashboardPanel\StoreDashboardPanel;
use Drupal\arch\StoreDashboardPanel\StoreDashboardPanelPluginInterface;

use Drupal\Core\Database\Connection;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Template\Attribute;
use Drupal\Core\Url;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Defines a dashboard panel plugins.
 *
 * @StoreDashboardPanel(
 *   id = "order_count",
 *   admin_label = @Translation("Order count", context = "arch_order"),
 * )
 */
class OrderCount extends StoreDashboardPanel implements StoreDashboardPanelPluginInterface, ContainerFactoryPluginInterface {

  /**
   * Database connection.
   *
   * @var \Drupal\Core\Database\Connection
   */
  protected $db;

  /**
   * Product type storage.
   *
   * @var \Drupal\Core\Entity\EntityStorageInterface
   */
  protected $orderStatusStorage;

  /**
   * {@inheritdoc}
   */
  public function __construct(
    array $configuration,
    $plugin_id,
    array $plugin_definition,
    Connection $db,
    EntityStorageInterface $order_status_storage,
  ) {
    parent::__construct(
      $configuration,
      $plugin_id,
      $plugin_definition
    );

    $this->db = $db;
    $this->orderStatusStorage = $order_status_storage;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(
    ContainerInterface $container,
    array $configuration,
    $plugin_id,
    $plugin_definition,
  ) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('database'),
      $container->get('entity_type.manager')->getStorage('order_status')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function build() {
    $build = [];
    $build['total'] = $this->buildTotal();
    $build['types'] = $this->buildByStatus();

    // @todo Add cache.
    return $build;
  }

  /**
   * Total number row for panel.
   *
   * @return array
   *   Render array.
   */
  protected function buildTotal() {
    $total_select = $this->db->select('arch_order', 'o');
    $total_select->addExpression('COUNT(o.oid)');
    $total = (int) $total_select->execute()->fetchField();

    $url = Url::fromRoute('entity.order.collection');

    return [
      '#type' => 'inline_template',
      '#template' => '<p{{attributes}}><a href="{{ url }}">{{ "Number of orders"|t }}</a>: <strong>{{ count }}</strong></p>',
      '#context' => [
        'attributes' => new Attribute([
          'class' => [
            'order-total-count',
          ],
        ]),
        'count' => $total,
        'url' => $url,
      ],
    ];
  }

  /**
   * Get numbers of products by type.
   *
   * @return array|null
   *   Render array.
   */
  protected function buildByStatus() {
    $type_select = $this->db->select('arch_order', 'o');
    $type_select->addField('o', 'status');
    $type_select->addExpression('COUNT(oid)', 'c');
    $type_select->groupBy('status');
    $type_select->orderBy('c');
    $types = $type_select->execute()->fetchAllKeyed();

    if (empty($types)) {
      return NULL;
    }

    $build = [
      '#title' => $this->t('Order count by status', [], ['context' => 'arch_order']),
      '#theme' => 'item_list',
    ];
    foreach ($types as $status_id => $count) {
      $status = $this->orderStatusStorage->load($status_id);
      if (empty($status)) {
        continue;
      }

      $url = Url::fromRoute('entity.order.collection', [], [
        'query' => [
          'status' => $status->id(),
        ],
      ]);
      $build['#items'][] = [
        '#type' => 'inline_template',
        '#template' => '<a href="{{ url }}"><strong>{{ label }}</strong></a>: {{ count }}',
        '#context' => [
          'label' => $status->label(),
          'count' => $count,
          'url' => $url,
        ],
      ];
    }

    return $build;
  }

}

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

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