You are here

class QuizViewBuilder in Quiz 6.x

Same name and namespace in other branches
  1. 8.6 src/View/QuizViewBuilder.php \Drupal\quiz\View\QuizViewBuilder
  2. 8.5 src/View/QuizViewBuilder.php \Drupal\quiz\View\QuizViewBuilder

Hierarchy

Expanded class hierarchy of QuizViewBuilder

File

src/View/QuizViewBuilder.php, line 12

Namespace

Drupal\quiz\View
View source
class QuizViewBuilder extends EntityViewBuilder {
  public function buildComponents(array &$build, array $entities, array $displays, $view_mode) {
    parent::buildComponents($build, $entities, $displays, $view_mode);

    /** @var \Drupal\quiz\Entity\Quiz $entity */
    foreach ($entities as $id => $entity) {
      $bundle = $entity
        ->bundle();
      $display = $displays[$bundle];
      if ($display
        ->getComponent('stats')) {
        $build[$id]['stats'] = $this
          ->buildStatsComponent($entity);
      }
      if ($display
        ->getComponent('take')) {
        $build[$id]['take'] = $this
          ->buildTakeComponent($entity);
      }
    }
  }
  protected function buildStatsComponent(Quiz $quiz) : array {
    $stats = [
      [
        [
          'header' => TRUE,
          'width' => '25%',
          'data' => $this
            ->t('Questions'),
        ],
        $quiz
          ->getNumberOfQuestions(),
      ],
    ];
    if ($quiz
      ->get('show_attempt_stats')->value) {
      $takes = $quiz
        ->get('takes')->value == 0 ? $this
        ->t('Unlimited') : $quiz
        ->get('takes')->value;
      $stats[] = [
        [
          'header' => TRUE,
          'data' => $this
            ->t('Attempts allowed'),
        ],
        $takes,
      ];
    }
    if ($quiz
      ->get('quiz_date')
      ->isEmpty()) {
      $stats[] = [
        [
          'header' => TRUE,
          'data' => $this
            ->t('Available'),
        ],
        $this
          ->t('Always'),
      ];
    }
    else {
      $stats[] = [
        [
          'header' => TRUE,
          'data' => $this
            ->t('Opens'),
        ],
        $quiz
          ->get('quiz_date')->value,
      ];
      $stats[] = [
        [
          'header' => TRUE,
          'data' => $this
            ->t('Closes'),
        ],
        $quiz
          ->get('quiz_date')->end_value,
      ];
    }
    if (!$quiz
      ->get('pass_rate')
      ->isEmpty()) {
      $stats[] = [
        [
          'header' => TRUE,
          'data' => $this
            ->t('Pass rate'),
        ],
        $quiz
          ->get('pass_rate')->value . ' %',
      ];
    }
    if (!$quiz
      ->get('time_limit')
      ->isEmpty()) {
      $stats[] = [
        [
          'header' => TRUE,
          'data' => $this
            ->t('Time limit'),
        ],
        _quiz_format_duration($quiz
          ->get('time_limit')->value),
      ];
    }
    $stats[] = [
      [
        'header' => TRUE,
        'data' => $this
          ->t('Backwards navigation'),
      ],
      $quiz
        ->get('backwards_navigation') ? $this
        ->t('Allowed') : $this
        ->t('Forbidden'),
    ];
    return [
      '#id' => 'quiz-view-table',
      '#theme' => 'table__quiz_stats',
      '#rows' => $stats,
    ];
  }
  protected function buildTakeComponent(Quiz $quiz) : array {
    $build = [];
    $access = $quiz
      ->access('take', NULL, TRUE);

    // Check the permission before displaying start button.
    if (!$access
      ->isForbidden()) {
      if (is_a($access, AccessResultReasonInterface::class)) {

        // There's a friendly success message available. Only display if we are
        // viewing the quiz.
        // @todo does not work because we cannot pass allowed reason, only
        // forbidden reason. The message is displayed in quiz_quiz_access().
        if (\Drupal::routeMatch() == 'entity.quiz.canonical') {
          Drupal::messenger()
            ->addMessage($access
            ->getReason());
        }
      }
      $build['link'] = $quiz
        ->toLink($this
        ->t('Start @quiz', [
        '@quiz' => QuizUtil::getQuizName(),
      ]), 'take', [
        'attributes' => [
          'class' => [
            'quiz-start-link',
            'button',
          ],
        ],
      ])
        ->toRenderable();
    }
    elseif ($access instanceof AccessResultReasonInterface && $access
      ->getReason()) {
      $build['message'] = [
        '#type' => 'container',
        '#attributes' => [
          'class' => [
            'quiz-not-available',
          ],
        ],
        '#markup' => $access
          ->getReason(),
      ];
    }
    CacheableMetadata::createFromObject($access)
      ->setCacheMaxAge(0)
      ->applyTo($build);
    return $build;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DependencySerializationTrait::$_entityStorages protected property
DependencySerializationTrait::$_serviceIds protected property
DependencySerializationTrait::__sleep public function 2
DependencySerializationTrait::__wakeup public function 2
EntityHandlerBase::$moduleHandler protected property The module handler to invoke hooks on. 5
EntityHandlerBase::moduleHandler protected function Gets the module handler. 5
EntityHandlerBase::setModuleHandler public function Sets the module handler for this handler.
EntityViewBuilder::$cacheBin protected property The cache bin used to store the render cache.
EntityViewBuilder::$entityDisplayRepository protected property The entity display repository.
EntityViewBuilder::$entityRepository protected property The entity repository service.
EntityViewBuilder::$entityType protected property Information about the entity type.
EntityViewBuilder::$entityTypeId protected property The type of entities for which this view builder is instantiated.
EntityViewBuilder::$languageManager protected property The language manager.
EntityViewBuilder::$singleFieldDisplays protected property The EntityViewDisplay objects created for individual field rendering.
EntityViewBuilder::$themeRegistry protected property The theme registry.
EntityViewBuilder::addContextualLinks protected function Add contextual links.
EntityViewBuilder::alterBuild protected function Specific per-entity building. 1
EntityViewBuilder::build public function Builds an entity's view; augments entity defaults.
EntityViewBuilder::buildMultiple public function Builds multiple entities' views; augments entity defaults.
EntityViewBuilder::createInstance public static function Instantiates a new instance of this entity handler. Overrides EntityHandlerInterface::createInstance 3
EntityViewBuilder::getBuildDefaults protected function Provides entity-specific defaults to the build process. 4
EntityViewBuilder::getCacheTags public function The cache tag associated with this entity view builder. Overrides EntityViewBuilderInterface::getCacheTags
EntityViewBuilder::getSingleFieldDisplay protected function Gets an EntityViewDisplay for rendering an individual field.
EntityViewBuilder::isViewModeCacheable protected function Determines whether the view mode is cacheable.
EntityViewBuilder::resetCache public function Resets the entity render cache. Overrides EntityViewBuilderInterface::resetCache
EntityViewBuilder::trustedCallbacks public static function Lists the trusted callbacks provided by the implementing class. Overrides TrustedCallbackInterface::trustedCallbacks 2
EntityViewBuilder::view public function Builds the render array for the provided entity. Overrides EntityViewBuilderInterface::view 4
EntityViewBuilder::viewField public function Builds a renderable array for the value of a single field in an entity. Overrides EntityViewBuilderInterface::viewField
EntityViewBuilder::viewFieldItem public function Builds a renderable array for a single field item. Overrides EntityViewBuilderInterface::viewFieldItem
EntityViewBuilder::viewMultiple public function Builds the render array for the provided entities. Overrides EntityViewBuilderInterface::viewMultiple 4
EntityViewBuilder::__construct public function Constructs a new EntityViewBuilder. 2
QuizViewBuilder::buildComponents public function Builds the component fields and properties of a set of entities. Overrides EntityViewBuilder::buildComponents
QuizViewBuilder::buildStatsComponent protected function
QuizViewBuilder::buildTakeComponent protected function
StringTranslationTrait::$stringTranslation protected property The string translation service. 4
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.
TrustedCallbackInterface::THROW_EXCEPTION constant Untrusted callbacks throw exceptions.
TrustedCallbackInterface::TRIGGER_SILENCED_DEPRECATION constant Untrusted callbacks trigger silenced E_USER_DEPRECATION errors.
TrustedCallbackInterface::TRIGGER_WARNING constant Untrusted callbacks trigger E_USER_WARNING errors.