quiz_maker-1.0.6/quiz_maker.install
quiz_maker.install
<?php
/**
* @file
* Install, update and uninstall functions for the Quiz Maker module.
*/
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\taxonomy\Entity\Vocabulary;
/**
* Implements hook_install().
*/
function quiz_maker_install($is_syncing): void {
// Rebuild routes after view config importing, because menus are based on
// view routes.
\Drupal::service('router.builder')->rebuild();
// Add roles permissions.
user_role_grant_permissions('anonymous', [
'view all question revisions',
'view all quiz revisions',
'view question',
'view question revision',
'view quiz',
'view quiz revision',
'view quiz_result',
'take quiz',
]);
user_role_grant_permissions('authenticated', [
'take quiz',
]);
}
/**
* Implements hook_uninstall().
*/
function quiz_maker_uninstall($is_syncing) {
// Delete all terms and vocabulary related to this module.
$vid = 'questions_tags';
$terms = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadByProperties(['vid' => $vid]);
foreach ($terms as $term) {
$term->delete();
}
$vocabulary = Vocabulary::load($vid);
$vocabulary->delete();
}
/**
* Add field 'feedback' to question response entity.
*/
function quiz_maker_update_9001(): void {
$field_storage_definition = BaseFieldDefinition::create('text_long')
->setLabel(t("Feedback"))
->setDescription(t('A response feedback.'))
->setDefaultValue(FALSE);
\Drupal::entityDefinitionUpdateManager()
->installFieldStorageDefinition('feedback', 'question_response', 'quiz_maker', $field_storage_definition);
}
/**
* Add AddToAny field to Quiz Result View display.
*/
function quiz_maker_update_9002(): void {
$config_factory = \Drupal::configFactory();
$config = $config_factory->getEditable('core.entity_view_display.quiz_result.standard.default');
if ($content = $config->get('content')) {
$content['addtoany'] = [
'settings' => [],
'third_party_settings' => [],
'weight' => '8',
'region' => 'content',
];
$config->set('content', $content);
$config->save(TRUE);
}
}
/**
* Add field 'Result Feedbacks' to quiz entity.
*/
function quiz_maker_update_9003(): void {
// Install "Paragraphs" module.
\Drupal::service('module_installer')->install(['paragraphs']);
// Quiz Result Feedback Paragraph configs.
$configs = [
'field.field.paragraph.quiz_feedback_by_score.field_min_score',
'core.entity_view_display.paragraph.quiz_feedback_by_score.preview',
'field.field.paragraph.quiz_feedback_by_score.field_feedback_text',
'field.field.paragraph.quiz_feedback_by_score.field_max_score',
'field.storage.paragraph.field_feedback_text',
'field.storage.paragraph.field_max_score',
'field.storage.paragraph.field_min_score',
'core.entity_view_mode.paragraph.preview',
'paragraphs.settings',
'paragraphs.paragraphs_type.quiz_feedback_by_score',
'core.entity_view_display.paragraph.quiz_feedback_by_score.default',
'core.entity_form_display.paragraph.quiz_feedback_by_score.default',
];
// Import new configs of "Quiz Results" feedbacks.
foreach ($configs as $config) {
_quiz_maker_import_config($config, '/config/optional');
}
$field_storage_definition = BaseFieldDefinition::create('entity_reference')
->setLabel(t('Result feedbacks'))
->setDescription(t('Quiz result feedbacks depends on score'))
->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED)
->setDefaultValue(FALSE);
\Drupal::entityDefinitionUpdateManager()
->installFieldStorageDefinition('result_feedbacks', 'quiz', 'quiz_maker', $field_storage_definition);
// Update "Quiz" default view mode - add "Feedbacks" tab.
$config_factory = \Drupal::configFactory();
$config = $config_factory->getEditable('core.entity_form_display.quiz.standard.default');
$groups = $config->get('third_party_settings.field_group');
$groups['group_feedback'] = [
'children' => [
0 => 'result_feedbacks',
],
'label' => 'Feedbacks by score',
'region' => 'content',
'parent_name' => 'group_settings',
'weight' => 24,
'format_type' => 'tab',
'format_settings' => [
'classes' => '',
'show_empty_fields' => FALSE,
'id' => '',
'label_as_html' => FALSE,
'formatter' => 'closed',
'description' => '',
'required_fields' => TRUE,
],
];
$groups['group_settings']['children'][] = 'group_feedback';
$config->set('third_party_settings.field_group', $groups);
$content = $config->get('content');
$content['result_feedbacks'] = [
'type' => 'inline_entity_form_complex',
'weight' => 6,
'region' => 'content',
'settings' => [
'form_mode' => 'default',
'override_labels' => TRUE,
'label_singular' => 'Feedback',
'label_plural' => 'Feedbacks',
'allow_new' => TRUE,
'allow_existing' => FALSE,
'match_operator' => 'CONTAINS',
'allow_duplicate' => TRUE,
'collapsible' => FALSE,
'collapsed' => FALSE,
'revision' => FALSE,
'removed_reference' => 'optional',
],
'third_party_settings' => [],
];
$config->set('content', $content);
$config->save(TRUE);
// Fix user permissions.
user_role_grant_permissions('authenticated', [
'view all question revisions',
'view all quiz revisions',
'view question',
'view question revision',
'view quiz',
'view quiz revision',
'view quiz_result',
]);
}
/**
* Allow take Quiz for Anonymous user.
*/
function quiz_maker_update_9004(): void {
// Add roles permissions.
user_role_grant_permissions('anonymous', [
'take quiz',
'view question',
'view quiz',
'view quiz_result',
]);
user_role_grant_permissions('authenticated', [
'take quiz',
'view question',
'view quiz',
'view quiz_result',
'take quiz',
]);
}
/**
* Add field 'Session ID' to Quiz Result entity.
*/
function quiz_maker_update_9005(): void {
$field_storage_definition = BaseFieldDefinition::create('string')
->setLabel(t('Session ID'))
->setDescription(t('A user session ID.'))
->setDefaultValue(FALSE);
\Drupal::entityDefinitionUpdateManager()
->installFieldStorageDefinition('session_id', 'quiz_result', 'quiz_maker', $field_storage_definition);
}
/**
* Update Quiz Results view - add contextual filter by user session.
*/
function quiz_maker_update_9006(): void {
$config = \Drupal::configFactory()->getEditable('views.view.quiz_results');
$session_id_context = [
'id' => 'session_id',
'table' => 'quiz_result_field_data',
'field' => 'session_id',
'relationship' => 'none',
'group_type' => 'group',
'admin_label' => '',
'entity_type' => 'quiz_result',
'entity_field' => 'session_id',
'plugin_id' => 'string',
'default_action' => 'ignore',
'exception' => [
'value' => 'all',
'title_enable' => FALSE,
'title' => 'All',
],
'title_enable' => FALSE,
'title' => '',
'default_argument_type' => 'fixed',
'default_argument_options' => [
'argument' => '',
],
'summary_options' => [
'base_path' => '',
'count' => TRUE,
'override' => FALSE,
'items_per_page' => 25,
],
'summary' => [
'sort_order' => 'asc',
'number_of_records' => 0,
'format' => 'default_summary',
],
'specify_validation' => FALSE,
'validate' => [
'type' => 'none',
'fail' => 'not found',
],
'validate_options' => [],
'glossary' => FALSE,
'limit' => 0,
'case' => 'none',
'path_case' => 'none',
'transform_dash' => FALSE,
'break_phrase' => FALSE,
];
$access = [
'type' => 'perm',
'options' => [
'perm' => 'view quiz_result',
],
];
// Delete contextual filter by quiz id, because second filter should be by
// user session_id.
$quiz_target_id = $config->get('display.user_quiz_results.display_options.arguments.quiz__target_id');
$config->clear('display.user_quiz_results.display_options.arguments.quiz__target_id');
$config->set('display.user_quiz_results.display_options.arguments.session_id', $session_id_context);
$config->set('display.user_quiz_results.display_options.arguments.quiz__target_id', $quiz_target_id);
$config->set('display.user_quiz_results.display_options.access', $access);
$config->set('display.user_quiz_results.display_options.defaults.access', FALSE);
$config->save();
}
