on-demand release 4.0dev+
[moodle.git] / contentbank / classes / output / bankcontent.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  * core_contentbank specific renderers
19  *
20  * @package   core_contentbank
21  * @copyright  2020 Ferran Recio <ferran@moodle.com>
22  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 namespace core_contentbank\output;
27 use renderable;
28 use templatable;
29 use renderer_base;
30 use stdClass;
31 use core_contentbank\content;
33 /**
34  * Class containing data for bank content
35  *
36  * @copyright  2020 Ferran Recio <ferran@moodle.com>
37  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
38  */
39 class bankcontent implements renderable, templatable {
41     /**
42      * @var \core_contentbank\content[]    Array of content bank contents.
43      */
44     private $contents;
46     /**
47      * @var array   $toolbar object.
48      */
49     private $toolbar;
51     /**
52      * @var \context    Given context. Null by default.
53      */
54     private $context;
56     /**
57      * Construct this renderable.
58      *
59      * @param \core_contentbank\content[] $contents   Array of content bank contents.
60      * @param array $toolbar     List of content bank toolbar options.
61      * @param \context $context Optional context to check (default null)
62      */
63     public function __construct(array $contents, array $toolbar, \context $context = null) {
64         $this->contents = $contents;
65         $this->toolbar = $toolbar;
66         $this->context = $context;
67     }
69     /**
70      * Export the data.
71      *
72      * @param renderer_base $output
73      * @return stdClass
74      */
75     public function export_for_template(renderer_base $output): stdClass {
76         global $PAGE;
78         $PAGE->requires->js_call_amd('core_contentbank/search', 'init');
79         $PAGE->requires->js_call_amd('core_contentbank/sort', 'init');
81         $data = new stdClass();
82         $contentdata = array();
83         foreach ($this->contents as $content) {
84             $file = $content->get_file();
85             $filesize = $file ? $file->get_filesize() : 0;
86             $mimetype = $file ? get_mimetype_description($file) : '';
87             $contenttypeclass = $content->get_content_type().'\\contenttype';
88             $contenttype = new $contenttypeclass($this->context);
89             if ($content->get_visibility() == content::VISIBILITY_UNLISTED) {
90                 $name = get_string('visibilitytitleunlisted', 'contentbank', $content->get_name());
91             } else {
92                 $name = $content->get_name();
93             }
94             $author = \core_user::get_user($content->get_content()->usercreated);
95             $contentdata[] = array(
96                 'name' => $name,
97                 'title' => strtolower($name),
98                 'link' => $contenttype->get_view_url($content),
99                 'icon' => $contenttype->get_icon($content),
100                 'uses' => count($content->get_uses()),
101                 'timemodified' => $content->get_timemodified(),
102                 'bytes' => $filesize,
103                 'size' => display_size($filesize),
104                 'type' => $mimetype,
105                 'author' => fullname($author),
106                 'visibilityunlisted' => $content->get_visibility() == content::VISIBILITY_UNLISTED
107             );
108         }
109         $data->viewlist = get_user_preferences('core_contentbank_view_list');
110         $data->contents = $contentdata;
111         // The tools are displayed in the action bar on the index page.
112         foreach ($this->toolbar as $tool) {
113             // Customize the output of a tool, like dropdowns.
114             $method = 'export_tool_'.$tool['action'];
115             if (method_exists($this, $method)) {
116                 $this->$method($tool);
117             }
118             $data->tools[] = $tool;
119         }
121         return $data;
122     }
124     /**
125      * Adds the content type items to display to the Add dropdown.
126      *
127      * Each content type is represented as an object with the properties:
128      *     - name: the name of the content type.
129      *     - baseurl: the base content type editor URL.
130      *     - types: different types of the content type to display as dropdown items.
131      *
132      * @param array $tool Data for rendering the Add dropdown, including the editable content types.
133      */
134     private function export_tool_add(array &$tool) {
135         $editabletypes = $tool['contenttypes'];
137         $addoptions = [];
138         foreach ($editabletypes as $class => $type) {
139             $contentype = new $class($this->context);
140             // Get the creation options of each content type.
141             $types = $contentype->get_contenttype_types();
142             if ($types) {
143                 // Add a text describing the content type as first option. This will be displayed in the drop down to
144                 // separate the options for the different content types.
145                 $contentdesc = new stdClass();
146                 $contentdesc->typename = get_string('description', $contentype->get_contenttype_name());
147                 array_unshift($types, $contentdesc);
148                 // Context data for the template.
149                 $addcontenttype = new stdClass();
150                 // Content type name.
151                 $addcontenttype->name = $type;
152                 // Content type editor base URL.
153                 $tool['link']->param('plugin', $type);
154                 $addcontenttype->baseurl = $tool['link']->out();
155                 // Different types of the content type.
156                 $addcontenttype->types = $types;
157                 $addoptions[] = $addcontenttype;
158             }
159         }
161         $tool['contenttypes'] = $addoptions;
162     }