contacts_events-8.x-1.x-dev/modules/teams/src/Controller/TeamSummaryController.php

modules/teams/src/Controller/TeamSummaryController.php
<?php

namespace Drupal\contacts_events_teams\Controller;

use Drupal\contacts_events\Entity\Event;
use Drupal\contacts_events_teams\Entity\TeamApplication;
use Drupal\contacts_events_teams\TeamQueries;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\DependencyInjection\ClassResolverInterface;
use Drupal\Core\Link;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Url;
use Drupal\state_machine\Plugin\Workflow\Workflow;
use Drupal\state_machine\Plugin\Workflow\WorkflowState;
use Drupal\user\Entity\User;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Controller for managing team application process.
 *
 * @package Drupal\contacts_events_teams\Controller
 */
class TeamSummaryController extends ControllerBase {

  /**
   * Current route.
   *
   * @var \Drupal\Core\Routing\RouteMatchInterface
   */
  protected $routeMatch;

  /**
   * Class resolver.
   *
   * @var \Drupal\Core\DependencyInjection\ClassResolverInterface
   */
  protected $classResolver;

  /**
   * Team Queries.
   *
   * @var \Drupal\contacts_events_teams\TeamQueries
   */
  protected $queries;

  /**
   * The teams workflow.
   *
   * @var \Drupal\state_machine\Plugin\Workflow\Workflow
   */
  protected $workflow;

  /**
   * TeamSummaryController constructor.
   *
   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
   *   Current route.
   * @param \Drupal\Core\DependencyInjection\ClassResolverInterface $class_resolver
   *   Class resolver.
   * @param \Drupal\contacts_events_teams\TeamQueries $queries
   *   Team Queries.
   * @param \Drupal\state_machine\Plugin\Workflow\Workflow $workflow
   *   The teams workflow.
   */
  public function __construct(RouteMatchInterface $route_match, ClassResolverInterface $class_resolver, TeamQueries $queries, Workflow $workflow) {
    $this->routeMatch = $route_match;
    $this->classResolver = $class_resolver;
    $this->queries = $queries;
    $this->workflow = $workflow;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('current_route_match'),
      $container->get('class_resolver'),
      $container->get('contacts_events_teams.queries'),
      $container->get('plugin.manager.workflow')->createInstance('contacts_events_teams_application_process')
    );
  }

  /**
   * Displays the manage team application page.
   *
   * @param \Drupal\contacts_events_teams\Entity\TeamApplication $contacts_team_application
   *   The team application.
   *
   * @return array
   *   Render array.
   */
  public function manage(TeamApplication $contacts_team_application) {
    $build = [];
    $build['#attached']['library'][] = 'contacts_events_teams/manage_application';

    $build['application'] = $this->entityTypeManager()
      ->getViewBuilder('c_events_team_app')
      ->view($contacts_team_application, 'full');

    return $build;
  }

  /**
   * Team stats summary for event.
   *
   * @param \Drupal\contacts_events\Entity\Event $contacts_event
   *   Event.
   *
   * @return array
   *   Render array.
   */
  public function buildPage(Event $contacts_event) {
    $build = [];
    $build['#title'] = $this->t('Teams for <strong>@event</strong>', [
      '@event' => $contacts_event->label(),
    ]);

    $build['summary'] = $this->buildSummary($contacts_event);

    $build['heading'] = [
      '#type' => 'html_tag',
      '#tag' => 'h2',
      '#value' => $this->t('Applicant summary'),
      '#attributes' => [
        'style' => 'margin:4em 0 2em',
      ],
    ];

    $build['categories'] = $this->buildCategories($contacts_event);
    return $build;
  }

  /**
   * Build the team summary.
   *
   * @param \Drupal\contacts_events\Entity\Event $event
   *   The event.
   *
   * @return array
   *   The render array for the summary.
   */
  public function buildSummary(Event $event) {
    $stats = $this->queries->getTeamCounts($event);

    return [
      '#type' => 'table',
      '#header' => [
        'public' => $this->t('Public'),
        'private' => $this->t('Private'),
        'total' => $this->t('Total'),
      ],
      '#rows' => [
        [
          'public' => $stats['public'],
          'private' => $stats['private'],
          'total' => [
            'header' => TRUE,
            'data' => ['#markup' => $stats['total']],
          ],
        ],
      ],
    ];
  }

  /**
   * Build the category overview table.
   *
   * @param \Drupal\contacts_events\Entity\Event $event
   *   The event.
   *
   * @return array
   *   The render array for the tables.
   */
  public function buildCategories(Event $event) {
    $build = [];

    // Get the states and our default empty row.
    $states = array_map(function (WorkflowState $state) {
      return $state->getLabel();
    }, $this->workflow->getStates());
    unset($states['archived']);
    $states = ['not_started' => $this->t('Not started')] + $states;

    $header = ['category' => $this->t('Category')] +
      $states +
      ['total' => $this->t('Total')];
    $default_row = [
      'category' => [
        'header' => TRUE,
        'data' => ['#markup' => ''],
      ],
    ];
    $default_row += array_fill_keys(array_keys($states), 0);
    $default_row['total'] = [
      'header' => TRUE,
      'data' => ['#markup' => 0],
    ];

    // Load our categories.
    /** @var \Drupal\taxonomy\TermInterface[] $categories */
    $categories = $this->entityTypeManager()
      ->getStorage('taxonomy_term')
      ->loadTree('contacts_events_teams', 0, 2, TRUE);

    $stats = $this->queries->getTeamAppStatsBySubCategory($event);

    // Build our tables.
    foreach ($categories as $category) {
      $tid = $category->id();
      $stat_rows = [];

      // Top level categories.
      if ($category->parents[0] == 0) {
        $build["{$tid}_header"] = [
          '#type' => 'html_tag',
          '#tag' => 'h3',
          '#value' => $category->label(),
          '#weight' => $category->getWeight(),
          '#attributes' => ['style' => 'margin-top:3em'],
        ];
        $build[$tid] = [
          '#type' => 'table',
          '#header' => $header,
          '#rows' => [],
          '#footer' => [$default_row],
          '#weight' => $category->getWeight() + 0.1,
        ];
        $build[$tid]['#footer'][0]['category']['data']['#markup'] = $this->t('Total');
        $stat_rows[] = &$build[$tid]['#footer'][0];
      }
      // Otherwise put as a row in the correct category.
      else {
        $build[$category->parents[0]]['#rows'][$tid] = $default_row;
        $build[$category->parents[0]]['#rows'][$tid]['category']['data']['#markup'] = $category->label();
        $stat_rows[] = &$build[$category->parents[0]]['#footer'][0];
        $stat_rows[] = &$build[$category->parents[0]]['#rows'][$tid];
      }

      if (isset($stats[$tid])) {
        foreach ($stat_rows as &$stat_row) {
          foreach ($stats[$tid] as $state => $count) {
            $stat_row[$state] += $count;
            $stat_row['total']['data']['#markup'] += $count;
          }
        }
      }
    }

    return $build;
  }

  /**
   * List teams a user leads.
   *
   * @param \Drupal\user\Entity\User $user
   *   The user.
   *
   * @return array
   *   Render array of teams the user leads.
   *
   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
   */
  public function myTeams(User $user) {
    $storage = $this->entityTypeManager()
      ->getStorage('c_events_team');
    $query = $storage->getQuery();
    $query->accessCheck(TRUE);
    $query->condition('leaders', $user->id());
    $query->sort('event.entity.date__value', 'DESC');
    $query->sort('event.entity.title', 'DESC');
    $query->sort('name', 'ASC');
    $query->pager(25);
    $teams = $storage->loadMultiple($query->execute());

    $build['table'] = [
      '#type' => 'table',
      '#header' => [
        'event' => $this->t('Event'),
        'team' => $this->t('Team'),
      ],
      '#rows' => [],
      '#empty' => $this->t("You aren't the leader of any teams."),
    ];

    foreach ($teams as $team) {
      $url = Url::fromRoute('entity.c_events_team.canonical', [
        'contacts_event' => $team->getEvent()->id(),
        'c_events_team' => $team->id(),
      ]);
      $link = Link::fromTextAndUrl($team->getName(), $url);

      $row = [
        'event' => $team->getEvent()->label(),
        'team' => $link,
      ];

      $build['table']['#rows'][$team->id()] = $row;
    }

    $build['pager'] = ['#type' => 'pager'];

    $build['#cache'] = ['max-age' => 0];

    return $build;
  }

}

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

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