AutorÃa | Ultima modificación | Ver Log |
<?php// This file is part of Moodle - http://moodle.org///// Moodle is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.//// Moodle is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with Moodle. If not, see <http://www.gnu.org/licenses/>.namespace customfield_number\task;use coding_exception;use core\task\adhoc_task;use core_customfield\field_controller;use customfield_number\provider_base;/*** Recalculates data for the given number field with a provider** @since Moodle 4.5.1* @package customfield_number* @copyright Marina Glancy* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/class recalculate extends adhoc_task {#[\Override]public function execute() {global $DB;$customdata = $this->get_custom_data();$fieldid = clean_param($customdata->fieldid ?? null, PARAM_INT);$fieldtype = $customdata->fieldtype ?? null;// Find all fields that we need to recalculate (either by 'fieldid' or 'fieldtype').$fields = [];if ($fieldid) {try {$fields[] = field_controller::create($fieldid);} catch (\Exception $e) {// Could be a race condition when the field was already deleted by the time ad-hoc task runs.return;}} else if ($fieldtype) {$records = $DB->get_records('customfield_field', ['type' => 'number']);foreach ($records as $record) {$configdata = @json_decode($record->configdata, true);if (($configdata['fieldtype'] ?? '') === $fieldtype) {$fields[] = field_controller::create(0, $record);}}}// Schedule recalculate for each field, checking component, area and the presense of provider.$instanceid = clean_param($customdata->instanceid ?? null, PARAM_INT);foreach ($fields as $field) {if ($this->field_is_scheduled($field) && ($provider = provider_base::instance($field))) {$provider->recalculate($instanceid ?: null);}}}/*** Helper method validating that the field should be recalculated** @param \core_customfield\field_controller $field* @return bool*/protected function field_is_scheduled(field_controller $field): bool {$customdata = $this->get_custom_data();if (!empty($customdata->component) && $field->get_handler()->get_component() !== $customdata->component) {return false;}if (!empty($customdata->area) && $field->get_handler()->get_area() !== $customdata->area) {return false;}return true;}/*** Schedule recalculation for the given number custom field (and optionally, instanceid)** @param int $fieldid in of the custom field* @param int|null $instanceid if specified, only recalculates for the given instance id* @return void*/public static function schedule_for_field(int $fieldid, ?int $instanceid = null) {$task = new static();$task->set_custom_data(['fieldid' => $fieldid, 'instanceid' => $instanceid]);\core\task\manager::queue_adhoc_task($task, true);}/*** Schedule recalculation for all number custom fields that use the provider (optionally with instanceid)** @param string $fieldtype name of the class extending provider_base* @param string|null $component* @param string|null $area* @param int|null $instanceid* @return void*/public static function schedule_for_fieldtype(string $fieldtype, ?string $component = null, ?string $area = null,?int $instanceid = null) {$task = new static();$task->set_custom_data(['fieldtype' => $fieldtype,'component' => $component,'area' => $area,'instanceid' => $instanceid,]);\core\task\manager::queue_adhoc_task($task, true);}}