daa027f0c69abb67531cda13afcc77ed77e1c3a3
[moodle.git] / admin / tool / installaddon / renderer.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * Output rendering for the plugin.
20  *
21  * @package     tool_installaddon
22  * @category    output
23  * @copyright   2013 David Mudrak <david@moodle.com>
24  * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25  */
27 defined('MOODLE_INTERNAL') || die();
29 /**
30  * Implements the plugin renderer
31  *
32  * @copyright 2013 David Mudrak <david@moodle.com>
33  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
34  */
35 class tool_installaddon_renderer extends plugin_renderer_base {
37     /** @var tool_installaddon_installer */
38     protected $installer = null;
40     /** @var \core\update\validator */
41     protected $validator = null;
43     /**
44      * Sets the tool_installaddon_installer instance being used.
45      *
46      * @throws coding_exception if the installer has been already set
47      * @param tool_installaddon_installer $installer
48      */
49     public function set_installer_instance(tool_installaddon_installer $installer) {
50         if (is_null($this->installer)) {
51             $this->installer = $installer;
52         } else {
53             throw new coding_exception('Attempting to reset the installer instance.');
54         }
55     }
57     /**
58      * Sets the \core\update\validator instance being used.
59      *
60      * @throws coding_exception if the validator has been already set
61      * @param \core\update\validator $validator
62      */
63     public function set_validator_instance(\core\update\validator $validator) {
64         if (is_null($this->validator)) {
65             $this->validator = $validator;
66         } else {
67             throw new coding_exception('Attempting to reset the validator instance.');
68         }
69     }
71     /**
72      * Defines the index page layout
73      *
74      * @return string
75      */
76     public function index_page() {
78         if (is_null($this->installer)) {
79             throw new coding_exception('Installer instance has not been set.');
80         }
82         $permcheckurl = new moodle_url('/admin/tool/installaddon/permcheck.php');
83         $this->page->requires->yui_module('moodle-tool_installaddon-permcheck', 'M.tool_installaddon.permcheck.init',
84             array(array('permcheckurl' => $permcheckurl->out())));
85         $this->page->requires->strings_for_js(
86             array('permcheckprogress', 'permcheckresultno', 'permcheckresultyes', 'permcheckerror', 'permcheckrepeat'),
87             'tool_installaddon');
89         $out = $this->output->header();
90         $out .= $this->index_page_heading();
91         $out .= $this->index_page_repository();
92         $out .= $this->index_page_upload();
93         $out .= $this->output->footer();
95         return $out;
96     }
98     /**
99      * Defines the validation results page layout
100      *
101      * @return string
102      */
103     public function validation_page() {
105         if (is_null($this->installer)) {
106             throw new coding_exception('Installer instance has not been set.');
107         }
109         if (is_null($this->validator)) {
110             throw new coding_exception('Validator instance has not been set.');
111         }
113         $out = $this->validation_page_heading();
114         $out .= $this->validation_page_messages();
116         return $out;
117     }
119     /**
120      * Inform the user about invalid remote installation request.
121      *
122      * @param moodle_url $continueurl
123      * @return string
124      */
125     public function remote_request_invalid_page(moodle_url $continueurl) {
127         $out = $this->output->header();
128         $out .= $this->output->heading(get_string('installfromrepo', 'tool_installaddon'));
129         $out .= $this->output->box(get_string('remoterequestinvalid', 'tool_installaddon'), 'generalbox', 'notice');
130         $out .= $this->output->continue_button($continueurl, 'get');
131         $out .= $this->output->footer();
133         return $out;
134     }
136     /**
137      * Inform the user that such plugin is already installed
138      *
139      * @param stdClass $data decoded request data
140      * @param moodle_url $continueurl
141      * @return string
142      */
143     public function remote_request_alreadyinstalled_page(stdClass $data, moodle_url $continueurl) {
145         $out = $this->output->header();
146         $out .= $this->output->heading(get_string('installfromrepo', 'tool_installaddon'));
147         $out .= $this->output->box(get_string('remoterequestalreadyinstalled', 'tool_installaddon', $data), 'generalbox', 'notice');
148         $out .= $this->output->continue_button($continueurl, 'get');
149         $out .= $this->output->footer();
151         return $out;
152     }
154     /**
155      * Let the user confirm the remote installation request.
156      *
157      * @param stdClass $data decoded request data
158      * @param moodle_url $continueurl
159      * @param moodle_url $cancelurl
160      * @return string
161      */
162     public function remote_request_confirm_page(stdClass $data, moodle_url $continueurl, moodle_url $cancelurl) {
164         $out = $this->output->header();
165         $out .= $this->output->heading(get_string('installfromrepo', 'tool_installaddon'));
166         $out .= $this->output->confirm(get_string('remoterequestconfirm', 'tool_installaddon', $data), $continueurl, $cancelurl);
167         $out .= $this->output->footer();
169         return $out;
170     }
172     /**
173      * Inform the user that the target plugin type location is not writable.
174      *
175      * @param stdClass $data decoded request data
176      * @param string $plugintypepath full path to the plugin type location
177      * @param moodle_url $continueurl to repeat the write permission check
178      * @param moodle_url $cancelurl to cancel the installation
179      * @return string
180      */
181     public function remote_request_permcheck_page(stdClass $data, $plugintypepath, moodle_url $continueurl, moodle_url $cancelurl) {
183         $data->typepath = $plugintypepath;
185         $out = $this->output->header();
186         $out .= $this->output->heading(get_string('installfromrepo', 'tool_installaddon'));
187         $out .= $this->output->confirm(get_string('remoterequestpermcheck', 'tool_installaddon', $data), $continueurl, $cancelurl);
188         $out .= $this->output->footer();
190         return $out;
191     }
193     /**
194      * Inform the user about pluginfo service call failure
195      *
196      * @param stdClass $data decoded request data
197      * @param moodle_url $continueurl
198      * @return string
199      */
200     public function remote_request_pluginfo_failure(stdClass $data, moodle_url $continueurl) {
202         $out = $this->output->header();
203         $out .= $this->output->heading(get_string('installfromrepo', 'tool_installaddon'));
204         $out .= $this->output->box(get_string('remoterequestpluginfoexception', 'tool_installaddon', $data), 'generalbox', 'notice');
205         $out .= $this->output->continue_button($continueurl, 'get');
206         $out .= $this->output->footer();
208         return $out;
209     }
211     /**
212      * Inform the user about the installer exception
213      *
214      * This implementation does not actually use the passed exception. Custom renderers might want to
215      * display additional data obtained via {@link get_exception_info()}. Also note, this method is called
216      * in non-debugging mode only. If debugging is allowed at the site, default exception handler is triggered.
217      *
218      * @param tool_installaddon_installer_exception $e thrown exception
219      * @param moodle_url $continueurl
220      * @return string
221      */
222     public function installer_exception(tool_installaddon_installer_exception $e, moodle_url $continueurl) {
224         $out = $this->output->header();
225         $out .= $this->output->heading(get_string('installfromrepo', 'tool_installaddon'));
226         $out .= $this->output->box(get_string('installexception', 'tool_installaddon'), 'generalbox', 'notice');
227         $out .= $this->output->continue_button($continueurl, 'get');
228         $out .= $this->output->footer();
230         return $out;
231     }
233     // End of the external API /////////////////////////////////////////////////
235     /**
236      * Renders the index page heading
237      *
238      * @return string
239      */
240     protected function index_page_heading() {
241         return $this->output->heading(get_string('pluginname', 'tool_installaddon'));
242     }
244     /**
245      * Renders the widget for browsing the add-on repository
246      *
247      * @return string
248      */
249     protected function index_page_repository() {
251         $url = $this->installer->get_addons_repository_url();
253         $out = $this->box(
254             $this->output->single_button($url, get_string('installfromrepo', 'tool_installaddon'), 'get').
255             $this->output->help_icon('installfromrepo', 'tool_installaddon'),
256             'generalbox', 'installfromrepobox'
257         );
259         return $out;
260     }
262     /**
263      * Renders the widget for uploading the add-on ZIP package
264      *
265      * @return string
266      */
267     protected function index_page_upload() {
269         $form = $this->installer->get_installfromzip_form();
271         ob_start();
272         $form->display();
273         $out = ob_get_clean();
275         $out = $this->box($out, 'generalbox', 'installfromzipbox');
277         return $out;
278     }
280     /**
281      * Renders the page title and the overall validation verdict
282      *
283      * @return string
284      */
285     protected function validation_page_heading() {
287         $heading = $this->output->heading(get_string('validation', 'tool_installaddon'));
289         if ($this->validator->get_result()) {
290             $status = $this->output->container(
291                 html_writer::span(get_string('validationresult1', 'tool_installaddon'), 'verdict').
292                     $this->output->help_icon('validationresult1', 'tool_installaddon'),
293                 array('validationresult', 'success')
294             );
295         } else {
296             $status = $this->output->container(
297                 html_writer::span(get_string('validationresult0', 'tool_installaddon'), 'verdict').
298                     $this->output->help_icon('validationresult0', 'tool_installaddon'),
299                 array('validationresult', 'failure')
300             );
301         }
303         return $heading . $status;
304     }
306     /**
307      * Renders validation log messages.
308      *
309      * @return string
310      */
311     protected function validation_page_messages() {
313         $validator = $this->validator; // We need this to be able to use their constants.
314         $messages = $validator->get_messages();
316         if (empty($messages)) {
317             return '';
318         }
320         $table = new html_table();
321         $table->attributes['class'] = 'validationmessages generaltable';
322         $table->head = array(
323             get_string('validationresultstatus', 'tool_installaddon'),
324             get_string('validationresultmsg', 'tool_installaddon'),
325             get_string('validationresultinfo', 'tool_installaddon')
326         );
327         $table->colclasses = array('msgstatus', 'msgtext', 'msginfo');
329         $stringman = get_string_manager();
331         foreach ($messages as $message) {
333             if ($message->level === $validator::DEBUG and !debugging()) {
334                 continue;
335             }
337             $msgstatus = $validator->message_level_name($message->level);
338             $msgtext = $validator->message_code_name($message->msgcode);
339             $msginfo = $validator->message_code_info($message->msgcode, $message->addinfo);
340             if (empty($msginfo) and $message->addinfo !== null) {
341                 $msginfo = html_writer::tag('pre', s(print_r($message->addinfo, true)));
342             }
343             $msghelpicon = $validator->message_help_icon($message->msgcode);
344             if ($msghelpicon) {
345                 $msghelp = $this->output->render($msghelpicon);
346             } else {
347                 $msghelp = '';
348             }
350             $row = new html_table_row(array($msgstatus, $msgtext.$msghelp, $msginfo));
351             $row->attributes['class'] = 'level-'.$message->level.' '.$message->msgcode;
353             $table->data[] = $row;
354         }
356         return html_writer::table($table);
357     }