contacts_events-8.x-1.x-dev/modules/teams/src/Plugin/TeamApplicationStep/TeamApplicationStepManager.php
modules/teams/src/Plugin/TeamApplicationStep/TeamApplicationStepManager.php
<?php
namespace Drupal\contacts_events_teams\Plugin\TeamApplicationStep;
use Drupal\Component\Utility\SortArray;
use Drupal\contacts_events\Entity\TicketInterface;
use Drupal\contacts_events_teams\Annotation\TeamApplicationStep;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\DependencyInjection\ClassResolverInterface;
use Drupal\Core\Entity\ContentEntityForm;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Form\FormBuilderInterface;
use Drupal\Core\Plugin\DefaultPluginManager;
use Drupal\Core\StringTranslation\TranslationInterface;
/**
* Plugin manager for team application steps.
*/
class TeamApplicationStepManager extends DefaultPluginManager {
/**
* The form builder.
*
* @var \Drupal\Core\Form\FormBuilderInterface
*/
protected $formBuilder;
/**
* Class resolver.
*
* @var \Drupal\Core\DependencyInjection\ClassResolverInterface
*/
protected $classResolver;
/**
* Entity type manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* The string translation service.
*
* @var \Drupal\Core\StringTranslation\TranslationInterface
*/
protected $stringTranslation;
/**
* {@inheritdoc}
*/
public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler, FormBuilderInterface $form_builder, ClassResolverInterface $class_resolver, EntityTypeManagerInterface $entity_type_manager, TranslationInterface $string_translation) {
parent::__construct('Plugin/TeamApplicationStep', $namespaces, $module_handler, TeamApplicationStepInterface::class, TeamApplicationStep::class);
$this->alterInfo('contacts_events_teams_application_steps');
$this->setCacheBackend($cache_backend, 'drs_submission_fraud_check_plugins');
$this->formBuilder = $form_builder;
$this->classResolver = $class_resolver;
$this->entityTypeManager = $entity_type_manager;
$this->stringTranslation = $string_translation;
}
/**
* {@inheritdoc}
*/
protected function findDefinitions() {
$definitions = parent::findDefinitions();
// Ensure that the cached list of definitions is always sorted by weight.
uasort($definitions, [SortArray::class, 'sortByWeightElement']);
return $definitions;
}
/**
* Get a progress indicator for the current step.
*
* @param \Drupal\contacts_events\Entity\TicketInterface $ticket
* The ticket being applied for.
* @param string|null $step_id
* The current step ID.
*
* @return array|null
* A renderable array for an item_list of steps. The current step will have
* the 'active' class as a wrapper attribute.
*/
public function getProgressIndicator(TicketInterface $ticket, ?string $step_id) {
$steps = $this->getDefinitions();
$step_id = $step_id ?: array_keys($steps)[0];
$items = [];
foreach ($steps as $step) {
$options = $step_id == $step['id'] ? ['class' => 'active'] : [];
$items[] = [
'#markup' => $step['label'],
'#wrapper_attributes' => $options,
];
}
if ($items) {
return [
'#theme' => 'item_list',
'#items' => $items,
'#attributes' => ['class' => 'team-application-progress'],
'#attached' => [
'library' => ['contacts_events_teams/progress_indicator'],
],
];
}
return NULL;
}
/**
* Gets the step form.
*
* @param \Drupal\contacts_events\Entity\TicketInterface $ticket
* The ticket we are applying for.
* @param string|null $step_id
* Step ID to load. If the step ID is NULL, the first step is returned.
*
* @return array|null
* Form array, or null if step not found.
*/
public function getStepForm(TicketInterface $ticket, ?string $step_id) {
// Get hold of our step configuration.
$definitions = $this->getDefinitions();
if ($step_id === NULL) {
$step = reset($definitions);
}
elseif (isset($definitions[$step_id])) {
$step = $definitions[$step_id];
}
else {
return NULL;
}
// Retrieve our form object.
$form_object = $this->classResolver->getInstanceFromDefinition($step['class']);
// Content entity forms need a few extra services.
if ($form_object instanceof ContentEntityForm) {
$form_object
->setStringTranslation($this->stringTranslation)
->setModuleHandler($this->moduleHandler)
->setEntityTypeManager($this->entityTypeManager);
}
// Set the ticket and configuration if required.
if ($form_object instanceof TeamApplicationStepInterface) {
$form_object
->setTicket($ticket)
->setConfiguration($step);
}
// Return our form.
return $this->formBuilder->getForm($form_object);
}
}
