You are here

function Quiz::_quiz_build_categorized_question_list in Quiz 8.5

Same name and namespace in other branches
  1. 8.6 src/Entity/Quiz.php \Drupal\quiz\Entity\Quiz::_quiz_build_categorized_question_list()

Builds the questionlist for quizzes with categorized random questions.

1 call to Quiz::_quiz_build_categorized_question_list()
Quiz::buildLayout in src/Entity/Quiz.php
Retrieves a list of questions (to be taken) for a given quiz.

File

src/Entity/Quiz.php, line 620

Class

Quiz
Defines the Quiz entity class.

Namespace

Drupal\quiz\Entity

Code

function _quiz_build_categorized_question_list() {

  /* @var $terms Drupal\paragraphs\Entity\Paragraph[] */
  $terms = $this
    ->get('quiz_terms')
    ->referencedEntities();
  $total_questions = [];
  foreach ($terms as $term) {

    // Get the term ID referenced on the quiz question pool.
    $tid = $term
      ->get('quiz_question_tid')
      ->referencedEntities()[0]
      ->id();
    $query = \Drupal::entityQuery('quiz_question');

    // Find all taxonomy fields on questions.
    $fields = \Drupal::service('entity_field.manager')
      ->getFieldStorageDefinitions('quiz_question');
    $or = $query
      ->orConditionGroup();
    foreach ($fields as $field_name => $field) {
      if ($field
        ->getType() == 'entity_reference' && $field
        ->getSetting('target_type') == 'taxonomy_term') {
        $or
          ->condition("{$field_name}.target_id", $tid);
      }
    }
    $query
      ->condition($or);
    $query
      ->condition('status', 1);
    $query
      ->addTag('quiz_build_categorized_questions');
    $query
      ->addTag('random');
    $query
      ->range(0, $term
      ->get('quiz_question_number')
      ->getString());
    $question_ids = $query
      ->execute();
    if (count($question_ids) != $term
      ->get('quiz_question_number')
      ->getString()) {

      // Didn't find enough questions in this category.
      return [];
    }
    $found_questions = QuizQuestion::loadMultiple($question_ids);
    foreach ($found_questions as $qqid => $question) {
      $total_questions[] = [
        'qqid' => $qqid,
        'tid' => $tid,
        'type' => $question
          ->bundle(),
        'vid' => $question
          ->getRevisionId(),
      ];
    }
  }

  // Optionally shuffle all categories together?

  //shuffle($total_questions);
  return $total_questions;
}