. /** * This file contains the form add/update context instance data. * * @package tool_dataprivacy * @copyright 2018 David Monllao * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ namespace tool_dataprivacy\form; defined('MOODLE_INTERNAL') || die(); use tool_dataprivacy\api; use tool_dataprivacy\data_registry; use tool_dataprivacy\purpose; /** * Context instance data form. * * @package tool_dataprivacy * @copyright 2018 David Monllao * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class context_instance extends \core\form\persistent { /** * @var The persistent class. */ protected static $persistentclass = 'tool_dataprivacy\\context_instance'; /** * Define the form - called by parent constructor */ public function definition() { $this->_form->setDisableShortforms(); $this->_form->addElement('header', 'contextname', $this->_customdata['contextname']); $subjectscope = implode(', ', $this->_customdata['subjectscope']); if (empty($subjectscope)) { $subjectscope = get_string('noassignedroles', 'tool_dataprivacy'); } $this->_form->addElement('static', 'subjectscope', get_string('subjectscope', 'tool_dataprivacy'), $subjectscope); $this->_form->addHelpButton('subjectscope', 'subjectscope', 'tool_dataprivacy'); $this->add_purpose_category($this->_customdata['context']->contextlevel); $this->_form->addElement('hidden', 'contextid'); $this->_form->setType('contextid', PARAM_INT); parent::add_action_buttons(false, get_string('savechanges')); } /** * Adds purpose and category selectors. * * @param int $contextlevel Apply this context level defaults. False for no defaults. * @return null */ protected function add_purpose_category($contextlevel = false) { $mform = $this->_form; $addcategorytext = $this->get_add_element_content(get_string('addcategory', 'tool_dataprivacy')); $categoryselect = $mform->createElement('select', 'categoryid', null, $this->_customdata['categories']); $addcategory = $mform->createElement('button', 'addcategory', $addcategorytext, ['data-add-element' => 'category']); $mform->addElement('group', 'categorygroup', get_string('category', 'tool_dataprivacy'), [$categoryselect, $addcategory], null, false); $mform->addHelpButton('categorygroup', 'category', 'tool_dataprivacy'); $mform->setType('categoryid', PARAM_INT); $mform->setDefault('categoryid', 0); $addpurposetext = $this->get_add_element_content(get_string('addpurpose', 'tool_dataprivacy')); $purposeselect = $mform->createElement('select', 'purposeid', null, $this->_customdata['purposes']); $addpurpose = $mform->createElement('button', 'addpurpose', $addpurposetext, ['data-add-element' => 'purpose']); $mform->addElement('group', 'purposegroup', get_string('purpose', 'tool_dataprivacy'), [$purposeselect, $addpurpose], null, false); $mform->addHelpButton('purposegroup', 'purpose', 'tool_dataprivacy'); $mform->setType('purposeid', PARAM_INT); $mform->setDefault('purposeid', 0); if (!empty($this->_customdata['currentretentionperiod'])) { $mform->addElement('static', 'retention_current', get_string('retentionperiod', 'tool_dataprivacy'), $this->_customdata['currentretentionperiod']); $mform->addHelpButton('retention_current', 'retentionperiod', 'tool_dataprivacy'); } } /** * Returns the 'add' label. * * It depends on the theme in use. * * @param string $label * @return \renderable|string */ private function get_add_element_content($label) { global $PAGE, $OUTPUT; $bs4 = false; $theme = $PAGE->theme; if ($theme->name === 'boost') { $bs4 = true; } else { foreach ($theme->parents as $basetheme) { if ($basetheme === 'boost') { $bs4 = true; } } } if (!$bs4) { return $label; } return $OUTPUT->pix_icon('e/insert', $label); } /** * Returns the customdata array for the provided context instance. * * @param \context $context * @return array */ public static function get_context_instance_customdata(\context $context) { $persistent = \tool_dataprivacy\context_instance::get_record_by_contextid($context->id, false); if (!$persistent) { $persistent = new \tool_dataprivacy\context_instance(); $persistent->set('contextid', $context->id); } $purposes = []; foreach (api::get_purposes() as $purpose) { $purposes[$purpose->get('id')] = $purpose; } $purposeoptions = \tool_dataprivacy\output\data_registry_page::purpose_options($purposes); $categoryoptions = \tool_dataprivacy\output\data_registry_page::category_options(api::get_categories()); $customdata = [ 'context' => $context, 'subjectscope' => data_registry::get_subject_scope($context), 'contextname' => $context->get_context_name(), 'persistent' => $persistent, 'purposes' => $purposeoptions, 'categories' => $categoryoptions, ]; $effectivepurpose = api::get_effective_context_purpose($context); if ($effectivepurpose) { $customdata['currentretentionperiod'] = self::get_retention_display_text($effectivepurpose, $context->contextlevel, $context); $customdata['purposeretentionperiods'] = []; foreach (array_keys($purposeoptions) as $optionvalue) { if (isset($purposes[$optionvalue])) { $purpose = $purposes[$optionvalue]; } else { // Get the effective purpose if $optionvalue would be the selected value. $purpose = api::get_effective_context_purpose($context, $optionvalue); } $retentionperiod = self::get_retention_display_text( $purpose, $context->contextlevel, $context ); $customdata['purposeretentionperiods'][$optionvalue] = $retentionperiod; } } return $customdata; } /** * Returns the purpose display text. * * @param purpose $effectivepurpose * @param int $retentioncontextlevel * @param \context $context The context, just for displaying (filters) purposes. * @return string */ protected static function get_retention_display_text(purpose $effectivepurpose, $retentioncontextlevel, \context $context) { global $PAGE; $renderer = $PAGE->get_renderer('tool_dataprivacy'); $exporter = new \tool_dataprivacy\external\purpose_exporter($effectivepurpose, ['context' => $context]); $exportedpurpose = $exporter->export($renderer); switch ($retentioncontextlevel) { case CONTEXT_COURSE: case CONTEXT_MODULE: case CONTEXT_BLOCK: $str = get_string('effectiveretentionperiodcourse', 'tool_dataprivacy', $exportedpurpose->formattedretentionperiod); break; case CONTEXT_USER: $str = get_string('effectiveretentionperioduser', 'tool_dataprivacy', $exportedpurpose->formattedretentionperiod); break; default: $str = $exportedpurpose->formattedretentionperiod; } return $str; } }