MDL-67062 core_h5p: delete libraries
[moodle.git] / course / classes / local / exporters / course_content_item_exporter.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * Contains the course_content_item_exporter class.
19  *
20  * @package    core
21  * @subpackage course
22  * @copyright  2020 Jake Dallimore <jrhdallimore@gmail.com>
23  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
25 namespace core_course\local\exporters;
27 defined('MOODLE_INTERNAL') || die();
29 use core\external\exporter;
30 use core_course\local\entity\content_item;
32 /**
33  * The course_content_item_exporter class.
34  *
35  * @copyright  2020 Jake Dallimore <jrhdallimore@gmail.com>
36  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
37  */
38 class course_content_item_exporter extends exporter {
40     /** @var content_item $contentitem the content_item to export. */
41     private $contentitem;
43     /**
44      * The course_content_item_exporter constructor.
45      *
46      * @param content_item $contentitem the content item to export.
47      * @param array $related the array of related objects used during export.
48      */
49     public function __construct(content_item $contentitem, array $related = []) {
50         $this->contentitem = $contentitem;
52         return parent::__construct([], $related);
53     }
55     /**
56      * Definition of all properties originating in the export target, \core_course\local\entity\content_item.
57      *
58      * @return array The array of property values, indexed by name.
59      */
60     protected static function define_properties() {
61         return [
62             'id' => ['type' => PARAM_INT, 'description' => 'The id of the content item'],
63             'name' => ['type' => PARAM_TEXT, 'description' => 'Name of the content item'],
64             'title' => ['type' => PARAM_TEXT, 'description' => 'The string title of the content item, human readable'],
65             'link' => ['type' => PARAM_URL, 'description' => 'The link to the content item creation page'],
66             'icon' => ['type' => PARAM_RAW, 'description' => 'Html containing the icon for the content item'],
67             'help' => ['type' => PARAM_RAW, 'description' => 'Html description / help for the content item'],
68             'archetype' => ['type' => PARAM_RAW, 'description' => 'The archetype of the module exposing the content item'],
69             'componentname' => ['type' => PARAM_TEXT, 'description' => 'The name of the component exposing the content item'],
70         ];
71     }
73     /**
74      * Definition of all properties which are either calculated or originate in a related domain object.
75      *
76      * @return array The array of property values, indexed by name.
77      */
78     protected static function define_other_properties() {
79         // This will hold user-dependant properties such as whether the item is starred or recommended.
80         return [
81             'favourite' => ['type' => PARAM_BOOL, 'description' => 'Has the user favourited the content item'],
82             'legacyitem' => [
83                 'type' => PARAM_BOOL,
84                 'description' => 'If this item was pulled from the old callback and has no item id.'
85             ]
86         ];
87     }
89     /**
90      * Get ALL properties for the content_item DTO being exported.
91      *
92      * These properties are a mix of:
93      * - readonly properties of the primary object (content_item) being exported.
94      * - calculated values
95      * - properties originating from the related domain objects.
96      *
97      * Normally, those properties defined in get_properties() are added to the export automatically as part of the superclass code,
98      * provided they are public properties on the export target. In this case, the export target is content_item, which doesn't
99      * provide public access to its properties, so those are fetched via their respective getters here.
100      *
101      * @param \renderer_base $output
102      * @return array The array of property values, indexed by name.
103      */
104     protected function get_other_values(\renderer_base $output) {
106         $favourite = false;
107         $itemtype = 'contentitem_' . $this->contentitem->get_component_name();
108         if (isset($this->related['favouriteitems'])) {
109             foreach ($this->related['favouriteitems'] as $favobj) {
110                 if ($favobj->itemtype === $itemtype && in_array($this->contentitem->get_id(), $favobj->ids)) {
111                     $favourite = true;
112                 }
113             }
114         }
116         $properties = [
117             'id' => $this->contentitem->get_id(),
118             'name' => $this->contentitem->get_name(),
119             'title' => $this->contentitem->get_title()->get_value(),
120             'link' => $this->contentitem->get_link()->out(false),
121             'icon' => $this->contentitem->get_icon(),
122             'help' => $this->contentitem->get_help(),
123             'archetype' => $this->contentitem->get_archetype(),
124             'componentname' => $this->contentitem->get_component_name(),
125             'favourite' => $favourite,
126             'legacyitem' => ($this->contentitem->get_id() == -1)
127         ];
129         return $properties;
130     }
132     /**
133      * Define the list of related objects, used by this exporter.
134      *
135      * @return array the list of related objects.
136      */
137     protected static function define_related(): array {
138         return [
139             'context' => '\context',
140             'favouriteitems' => '\stdClass[]?'
141         ];
142     }