function Quiz::buildCategorizedQuestionList in Quiz 6.x
Build a question list for quizzes with categorized random questions.
Return value
array Array of question information.
1 call to Quiz::buildCategorizedQuestionList()
- 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 627
Class
- Quiz
- Defines the Quiz entity class.
Namespace
Drupal\quiz\EntityCode
function buildCategorizedQuestionList() {
/* @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('quiz_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;
}