You are here

class StepsBlock in Opigno Learning path 8

Same name and namespace in other branches
  1. 3.x src/Plugin/Block/StepsBlock.php \Drupal\opigno_learning_path\Plugin\Block\StepsBlock

Provides a 'article' block.

Plugin annotation


@Block(
  id = "lp_steps_block",
  admin_label = @Translation("LP Steps block")
)

Hierarchy

Expanded class hierarchy of StepsBlock

File

src/Plugin/Block/StepsBlock.php, line 33

Namespace

Drupal\opigno_learning_path\Plugin\Block
View source
class StepsBlock extends BlockBase implements ContainerFactoryPluginInterface {

  /**
   * @var AccountProxyInterface
   */
  protected $account;

  /**
   * @var ResettableStackedRouteMatchInterface
   */
  protected $routeMatch;

  /**
   * @var EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * @var Progress
   */
  protected $progress;

  /**
   * @var OpignoGroupContentTypesManager
   */
  protected $opignoGroupContentTypesManager;

  /**
   * StepsBlock constructor.
   *
   * @param array $configuration
   * @param string $plugin_id
   * @param mixed $plugin_definition
   * @param AccountProxyInterface $account
   * @param ResettableStackedRouteMatchInterface $route_match
   * @param EntityTypeManagerInterface $entity_type_manager
   * @param Progress $progress
   * @param OpignoGroupContentTypesManager $opigno_group_content_types_manager
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, AccountProxyInterface $account, ResettableStackedRouteMatchInterface $route_match, EntityTypeManagerInterface $entity_type_manager, Progress $progress, OpignoGroupContentTypesManager $opigno_group_content_types_manager) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->account = $account;
    $this->routeMatch = $route_match;
    $this->entityTypeManager = $entity_type_manager;
    $this->progress = $progress;
    $this->opignoGroupContentTypesManager = $opigno_group_content_types_manager;
  }

  /**
   * @param ContainerInterface $container
   * @param array $configuration
   * @param string $plugin_id
   * @param mixed $plugin_definition
   *
   * @return StepsBlock
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static($configuration, $plugin_id, $plugin_definition, $container
      ->get('current_user'), $container
      ->get('current_route_match'), $container
      ->get('entity.manager'), $container
      ->get('opigno_learning_path.progress'), $container
      ->get('opigno_group_manager.content_types.manager'));
  }

  /**
   * {@inheritdoc}
   */
  public function getCacheContexts() {

    // Every new route this block will rebuild.
    return Cache::mergeContexts(parent::getCacheContexts(), [
      'route',
    ]);
  }

  /**
   * {@inheritdoc}
   */
  public function build() {
    $uid = $this->account
      ->id();
    $route_name = $this->routeMatch
      ->getRouteName();
    if ($route_name == 'opigno_module.group.answer_form') {
      $group = $this->routeMatch
        ->getParameter('group');
      $gid = $group
        ->id();
    }
    else {
      $gid = OpignoGroupContext::getCurrentGroupId();
      $group = Group::load($gid);
    }
    if (empty($group)) {
      return [];
    }
    $title = $group
      ->label();

    // Get training guided navigation option.
    $freeNavigation = !OpignoGroupManagerController::getGuidedNavigation($group);
    if ($freeNavigation) {

      // Get all steps for LP.
      $steps = LearningPathContent::getAllStepsOnlyModules($gid, $uid, TRUE);
    }
    else {

      // Get guided steps.
      $steps = LearningPathContent::getAllStepsOnlyModules($gid, $uid);
    }
    $user = $this->account;
    $steps = array_filter($steps, function ($step) use ($user) {
      if ($step['typology'] === 'Meeting') {

        // If the user have not the collaborative features role.
        if (!$user
          ->hasPermission('view meeting entities')) {
          return FALSE;
        }

        // If the user is not a member of the meeting.

        /** @var MeetingInterface $meeting */
        $meeting = $this->entityTypeManager
          ->getStorage('opigno_moxtra_meeting')
          ->load($step['id']);
        if (!$meeting
          ->isMember($user
          ->id())) {
          return FALSE;
        }
      }
      elseif ($step['typology'] === 'ILT') {

        // If the user is not a member of the ILT.

        /** @var ILTInterface $ilt */
        $ilt = $this->entityTypeManager
          ->getStorage('opigno_ilt')
          ->load($step['id']);
        if (!$ilt
          ->isMember($user
          ->id())) {
          return FALSE;
        }
      }
      return TRUE;
    });

    // Get user training expiration flag.
    $expired = LPStatus::isCertificateExpired($group, $uid);
    $score = opigno_learning_path_get_score($gid, $uid);
    $progress = $this->progress
      ->getProgressRound($gid, $uid);
    $is_passed = opigno_learning_path_is_passed($group, $uid, $expired);
    if ($is_passed) {
      $state_class = 'lp_steps_block_summary_state_passed';
      $state_title = $this
        ->t('Passed');
    }
    else {
      $state_class = 'lp_steps_block_summary_state_pending';
      $state_title = $this
        ->t('In progress');
    }

    // Get group context.
    $cid = OpignoGroupContext::getCurrentGroupContentId();
    if (!$cid) {
      return [];
    }
    $gid = OpignoGroupContext::getCurrentGroupId();
    $step_info = [];

    // Reindex steps array.
    $steps = array_values($steps);
    for ($i = 0; $i < count($steps); $i++) {

      // Build link for first step.
      if ($i == 0) {

        // Load first step entity.
        $first_step = OpignoGroupManagedContent::load($steps[$i]['cid']);
        if ($first_step) {

          /** @var ContentTypeBase $content_type */
          $content_type = $this->opignoGroupContentTypesManager
            ->createInstance($first_step
            ->getGroupContentTypeId());
          $step_url = $content_type
            ->getStartContentUrl($first_step
            ->getEntityId(), $gid);
          $link = Link::createFromRoute($steps[$i]['name'], $step_url
            ->getRouteName(), $step_url
            ->getRouteParameters())
            ->toString();
        }
        else {
          $link = '-';
        }
      }
      else {

        // Get link to module.
        $parent_content_id = $steps[$i - 1]['cid'];
        $link = Link::createFromRoute($steps[$i]['name'], 'opigno_learning_path.steps.next', [
          'group' => $gid,
          'parent_content' => $parent_content_id,
        ])
          ->toString();
      }
      array_push($step_info, [
        'name' => $link,
        'score' => $this
          ->buildScore($steps[$i]),
        'state' => $this
          ->buildState($steps[$i]),
      ]);
    }
    $state_summary = [
      'class' => $state_class,
      'title' => $state_title,
      'score' => $this
        ->t('Average score : @score%', [
        '@score' => $score,
      ]),
      'progress' => $this
        ->t('Progress : @progress%', [
        '@progress' => $progress,
      ]),
    ];
    $table_summary = [
      '#type' => 'table',
      '#header' => [
        $this
          ->t('Name'),
        $this
          ->t('Score'),
        $this
          ->t('State'),
      ],
      '#rows' => $step_info,
      '#attributes' => [
        'class' => [
          'lp_steps_block_table',
        ],
      ],
    ];
    $build = [
      '#theme' => 'opigno_learning_path_step_block',
      '#attributes' => [
        'class' => [
          'lp_steps_block',
        ],
      ],
      '#attached' => [
        'library' => [
          'opigno_learning_path/steps_block',
        ],
      ],
      '#title' => $title,
      '#state_summary' => $state_summary,
      '#table_summary' => $table_summary,
    ];
    return $build;
  }

  /**
   * Builds the score.
   *
   * @param array $step
   *
   * @return mixed|null
   */
  protected function buildScore(array $step) {
    $is_attempted = $step['attempts'] > 0;
    if ($is_attempted) {
      $score = [
        '#type' => 'html_tag',
        '#tag' => 'span',
        '#value' => $step['best score'],
        '#attributes' => [
          'class' => [
            'lp_steps_block_score',
          ],
        ],
      ];
    }
    else {
      $score = [
        '#markup' => '&dash;',
      ];
    }
    return [
      'data' => $score,
    ];
  }

  /**
   * Builds the state.
   *
   * @param array $step
   *
   * @return string|null
   */
  protected function buildState(array $step) {
    $uid = \Drupal::currentUser()
      ->id();
    $status = opigno_learning_path_get_step_status($step, $uid, TRUE);
    $class = [
      'pending' => 'lp_steps_block_step_pending',
      'failed' => 'lp_steps_block_step_failed',
      'passed' => 'lp_steps_block_step_passed',
    ];
    if (isset($class[$status])) {
      return [
        'data' => [
          '#type' => 'html_tag',
          '#tag' => 'span',
          '#attributes' => [
            'class' => [
              $class[$status],
            ],
          ],
        ],
      ];
    }
    else {
      return [
        'data' => [
          '#markup' => '&dash;',
        ],
      ];
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
BlockPluginInterface::BLOCK_LABEL_VISIBLE constant Indicates the block label (title) should be displayed to end users.
BlockPluginTrait::$transliteration protected property The transliteration service.
BlockPluginTrait::access public function
BlockPluginTrait::baseConfigurationDefaults protected function Returns generic default configuration for block plugins.
BlockPluginTrait::blockAccess protected function Indicates whether the block should be shown. 16
BlockPluginTrait::blockForm public function 16
BlockPluginTrait::blockSubmit public function 13
BlockPluginTrait::blockValidate public function 3
BlockPluginTrait::buildConfigurationForm public function Creates a generic configuration form for all block types. Individual block plugins can add elements to this form by overriding BlockBase::blockForm(). Most block plugins should not override this method unless they need to alter the generic form elements. 2
BlockPluginTrait::calculateDependencies public function
BlockPluginTrait::defaultConfiguration public function 19
BlockPluginTrait::getConfiguration public function 1
BlockPluginTrait::getMachineNameSuggestion public function 1
BlockPluginTrait::getPreviewFallbackString public function 3
BlockPluginTrait::label public function
BlockPluginTrait::setConfiguration public function
BlockPluginTrait::setConfigurationValue public function
BlockPluginTrait::setTransliteration public function Sets the transliteration service.
BlockPluginTrait::submitConfigurationForm public function Most block plugins should not override this method. To add submission handling for a specific block type, override BlockBase::blockSubmit().
BlockPluginTrait::transliteration protected function Wraps the transliteration service.
BlockPluginTrait::validateConfigurationForm public function Most block plugins should not override this method. To add validation for a specific block type, override BlockBase::blockValidate(). 1
ContextAwarePluginAssignmentTrait::addContextAssignmentElement protected function Builds a form element for assigning a context to a given slot.
ContextAwarePluginAssignmentTrait::contextHandler protected function Wraps the context handler.
ContextAwarePluginBase::$context protected property The data objects representing the context of this plugin.
ContextAwarePluginBase::$contexts Deprecated private property Data objects representing the contexts passed in the plugin configuration.
ContextAwarePluginBase::createContextFromConfiguration protected function Overrides ContextAwarePluginBase::createContextFromConfiguration
ContextAwarePluginBase::getCacheMaxAge public function The maximum age for which this object may be cached. Overrides CacheableDependencyInterface::getCacheMaxAge 7
ContextAwarePluginBase::getCacheTags public function The cache tags associated with this object. Overrides CacheableDependencyInterface::getCacheTags 4
ContextAwarePluginBase::getContext public function This code is identical to the Component in order to pick up a different Context class. Overrides ContextAwarePluginBase::getContext
ContextAwarePluginBase::getContextDefinition public function Overrides ContextAwarePluginBase::getContextDefinition
ContextAwarePluginBase::getContextDefinitions public function Overrides ContextAwarePluginBase::getContextDefinitions
ContextAwarePluginBase::getContextMapping public function Gets a mapping of the expected assignment names to their context names. Overrides ContextAwarePluginInterface::getContextMapping
ContextAwarePluginBase::getContexts public function Gets the defined contexts. Overrides ContextAwarePluginInterface::getContexts
ContextAwarePluginBase::getContextValue public function Gets the value for a defined context. Overrides ContextAwarePluginInterface::getContextValue
ContextAwarePluginBase::getContextValues public function Gets the values for all defined contexts. Overrides ContextAwarePluginInterface::getContextValues
ContextAwarePluginBase::setContext public function Set a context on this plugin. Overrides ContextAwarePluginBase::setContext
ContextAwarePluginBase::setContextMapping public function Sets a mapping of the expected assignment names to their context names. Overrides ContextAwarePluginInterface::setContextMapping
ContextAwarePluginBase::setContextValue public function Sets the value for a defined context. Overrides ContextAwarePluginBase::setContextValue
ContextAwarePluginBase::validateContexts public function Validates the set values for the defined contexts. Overrides ContextAwarePluginInterface::validateContexts
ContextAwarePluginBase::__get public function Implements magic __get() method.
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
PluginWithFormsTrait::getFormClass public function
PluginWithFormsTrait::hasFormClass public function
StepsBlock::$account protected property
StepsBlock::$entityTypeManager protected property
StepsBlock::$opignoGroupContentTypesManager protected property
StepsBlock::$progress protected property
StepsBlock::$routeMatch protected property
StepsBlock::build public function Builds and returns the renderable array for this block plugin. Overrides BlockPluginInterface::build
StepsBlock::buildScore protected function Builds the score.
StepsBlock::buildState protected function Builds the state.
StepsBlock::create public static function Overrides ContainerFactoryPluginInterface::create
StepsBlock::getCacheContexts public function The cache contexts associated with this object. Overrides ContextAwarePluginBase::getCacheContexts
StepsBlock::__construct public function StepsBlock constructor. Overrides BlockPluginTrait::__construct
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.
TypedDataTrait::$typedDataManager protected property The typed data manager used for creating the data types.
TypedDataTrait::getTypedDataManager public function Gets the typed data manager. 2
TypedDataTrait::setTypedDataManager public function Sets the typed data manager. 2