You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

165 lines
5.3 KiB

<?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/>.
/**
* Customfield data generator.
*
* @package core_customfield
* @category test
* @copyright 2018 Ruslan Kabalin
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
use \core_customfield\category_controller;
use \core_customfield\field_controller;
use \core_customfield\api;
/**
* Customfield data generator class.
*
* @package core_customfield
* @category test
* @copyright 2018 Ruslan Kabalin
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class core_customfield_generator extends component_generator_base {
/** @var int Number of created categories. */
protected $categorycount = 0;
/** @var int Number of created fields. */
protected $fieldcount = 0;
/**
* Create a new category.
*
* @param array|stdClass $record
* @return category_controller
*/
public function create_category($record = null) {
$this->categorycount++;
$i = $this->categorycount;
$record = (object) $record;
if (!isset($record->name)) {
$record->name = "Category $i";
}
if (!isset($record->component)) {
$record->component = 'core_course';
}
if (!isset($record->area)) {
$record->area = 'course';
}
if (!isset($record->itemid)) {
$record->itemid = 0;
}
$handler = \core_customfield\handler::get_handler($record->component, $record->area, $record->itemid);
$categoryid = $handler->create_category($record->name);
return $handler->get_categories_with_fields()[$categoryid];
}
/**
* Create a new field.
*
* @param array|stdClass $record
* @return field_controller
*/
public function create_field($record) : field_controller {
$this->fieldcount++;
$i = $this->fieldcount;
$record = (object) $record;
if (empty($record->categoryid)) {
throw new coding_exception('The categoryid value is required.');
}
$category = category_controller::create($record->categoryid);
$handler = $category->get_handler();
if (!isset($record->name)) {
$record->name = "Field $i";
}
if (!isset($record->shortname)) {
$record->shortname = "fld$i";
}
if (!isset($record->description)) {
$record->description = "Field $i description";
}
if (!isset($record->descriptionformat)) {
$record->descriptionformat = FORMAT_HTML;
}
if (!isset($record->type)) {
$record->type = 'text';
}
if (!isset($record->sortorder)) {
$record->sortorder = 0;
}
if (empty($record->configdata)) {
$configdata = [];
} else if (is_array($record->configdata)) {
$configdata = $record->configdata;
} else {
$configdata = @json_decode($record->configdata, true);
$configdata = $configdata ?? [];
}
$configdata += [
'required' => 0,
'uniquevalues' => 0,
'locked' => 0,
'visibility' => 2,
'defaultvalue' => '',
'displaysize' => 0,
'maxlength' => 0,
'ispassword' => 0,
'link' => '',
'linktarget' => '',
'checkbydefault' => 0,
'startyear' => 2000,
'endyear' => 3000,
'includetime' => 1,
];
$record->configdata = json_encode($configdata);
$field = field_controller::create(0, (object)['type' => $record->type], $category);
$handler->save_field_configuration($field, $record);
return $handler->get_categories_with_fields()[$field->get('categoryid')]->get_fields()[$field->get('id')];
}
/**
* Adds instance data for one field
*
* @param field_controller $field
* @param int $instanceid
* @param mixed $value
* @return \core_customfield\data_controller
*/
public function add_instance_data(field_controller $field, int $instanceid, $value) : \core_customfield\data_controller {
$data = \core_customfield\data_controller::create(0, (object)['instanceid' => $instanceid], $field);
$data->set('contextid', $data->get_context()->id);
$rc = new ReflectionClass(get_class($data));
$rcm = $rc->getMethod('get_form_element_name');
$rcm->setAccessible(true);
$formelementname = $rcm->invokeArgs($data, []);
$record = (object)[$formelementname => $value];
$data->instance_form_save($record);
return $data;
}
}