source: moodle/trunk/fuentes/backup/util/ui/renderer.php @ 136

Last change on this file since 136 was 136, checked in by mabarracus, 3 years ago

Ported code to xenial

File size: 35.5 KB
RevLine 
[136]1<?php
2
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/>.
17
18/**
19 * This file contains backup and restore output renderers
20 *
21 * @package   moodlecore
22 * @copyright 2010 Sam Hemelryk
23 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24 */
25
26/**
27 * The primary renderer for the backup.
28 *
29 * Can be retrieved with the following code:
30 * <?php
31 * $renderer = $PAGE->get_renderer('core','backup');
32 * ?>
33 *
34 * @copyright 2010 Sam Hemelryk
35 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
36 */
37class core_backup_renderer extends plugin_renderer_base {
38    /**
39     * Renderers a progress bar for the backup or restore given the items that
40     * make it up.
41     * @param array $items An array of items
42     * @return string
43     */
44    public function progress_bar(array $items) {
45        foreach ($items as &$item) {
46            $text = $item['text'];
47            unset($item['text']);
48            if (array_key_exists('link', $item)) {
49                $link = $item['link'];
50                unset($item['link']);
51                $item = html_writer::link($link, $text, $item);
52            } else {
53                $item = html_writer::tag('span', $text, $item);
54            }
55        }
56        return html_writer::tag('div', join(get_separator(), $items), array('class'=>'backup_progress clearfix'));
57    }
58
59    /**
60     * The backup and restore pages may display a log (if any) in a scrolling box.
61     *
62     * @param string $loghtml Log content in HTML format
63     * @return string HTML content that shows the log
64     */
65    public function log_display($loghtml) {
66        global $OUTPUT;
67        $out = html_writer::start_div('backup_log');
68        $out .= $OUTPUT->heading(get_string('backuplog', 'backup'));
69        $out .= html_writer::start_div('backup_log_contents');
70        $out .= $loghtml;
71        $out .= html_writer::end_div();
72        $out .= html_writer::end_div();
73        return $out;
74    }
75
76    /**
77     * Prints a dependency notification
78     * @param string $message
79     * @return string
80     */
81    public function dependency_notification($message) {
82        return html_writer::tag('div', $message, array('class'=>'notification dependencies_enforced'));
83    }
84
85    /**
86     * Displays the details of a backup file
87     *
88     * @param stdClass $details
89     * @param moodle_url $nextstageurl
90     * @return string
91     */
92    public function backup_details($details, $nextstageurl) {
93        $yestick = $this->output->pix_icon('i/valid', get_string('yes'));
94        $notick = $this->output->pix_icon('i/invalid', get_string('no'));
95
96        $html  = html_writer::start_tag('div', array('class'=>'backup-restore'));
97
98        $html .= html_writer::start_tag('div', array('class'=>'backup-section'));
99        $html .= $this->output->heading(get_string('backupdetails', 'backup'), 2, array('class'=>'header'));
100        $html .= $this->backup_detail_pair(get_string('backuptype', 'backup'), get_string('backuptype'.$details->type, 'backup'));
101        $html .= $this->backup_detail_pair(get_string('backupformat', 'backup'), get_string('backupformat'.$details->format, 'backup'));
102        $html .= $this->backup_detail_pair(get_string('backupmode', 'backup'), get_string('backupmode'.$details->mode, 'backup'));
103        $html .= $this->backup_detail_pair(get_string('backupdate', 'backup'), userdate($details->backup_date));
104        $html .= $this->backup_detail_pair(get_string('moodleversion', 'backup'),
105                html_writer::tag('span', $details->moodle_release, array('class'=>'moodle_release')).
106                html_writer::tag('span', '['.$details->moodle_version.']', array('class'=>'moodle_version sub-detail')));
107        $html .= $this->backup_detail_pair(get_string('backupversion', 'backup'),
108                html_writer::tag('span', $details->backup_release, array('class'=>'moodle_release')).
109                html_writer::tag('span', '['.$details->backup_version.']', array('class'=>'moodle_version sub-detail')));
110        $html .= $this->backup_detail_pair(get_string('originalwwwroot', 'backup'),
111                html_writer::tag('span', $details->original_wwwroot, array('class'=>'originalwwwroot')).
112                html_writer::tag('span', '['.$details->original_site_identifier_hash.']', array('class'=>'sitehash sub-detail')));
113        if (!empty($details->include_file_references_to_external_content)) {
114            $message = '';
115            if (backup_general_helper::backup_is_samesite($details)) {
116                $message = $yestick . ' ' . get_string('filereferencessamesite', 'backup');
117            } else {
118                $message = $notick . ' ' . get_string('filereferencesnotsamesite', 'backup');
119            }
120            $html .= $this->backup_detail_pair(get_string('includefilereferences', 'backup'), $message);
121        }
122
123        $html .= html_writer::end_tag('div');
124
125        $html .= html_writer::start_tag('div', array('class'=>'backup-section settings-section'));
126        $html .= $this->output->heading(get_string('backupsettings', 'backup'), 2, array('class'=>'header'));
127        foreach ($details->root_settings as $label=>$value) {
128            if ($label == 'filename' or $label == 'user_files') {
129                continue;
130            }
131            $html .= $this->backup_detail_pair(get_string('rootsetting'.str_replace('_','',$label), 'backup'), $value?$yestick:$notick);
132        }
133        $html .= html_writer::end_tag('div');
134
135        if ($details->type === 'course') {
136            $html .= html_writer::start_tag('div', array('class'=>'backup-section'));
137            $html .= $this->output->heading(get_string('backupcoursedetails', 'backup'), 2, array('class'=>'header'));
138            $html .= $this->backup_detail_pair(get_string('coursetitle', 'backup'), $details->course->title);
139            $html .= $this->backup_detail_pair(get_string('courseid', 'backup'), $details->course->courseid);
140
141            $html .= html_writer::start_tag('div', array('class'=>'backup-sub-section'));
142            $html .= $this->output->heading(get_string('backupcoursesections', 'backup'), 3, array('class'=>'subheader'));
143            foreach ($details->sections as $key=>$section) {
144                $included = $key.'_included';
145                $userinfo = $key.'_userinfo';
146                if ($section->settings[$included] && $section->settings[$userinfo]) {
147                    $value = get_string('sectionincanduser','backup');
148                } else if ($section->settings[$included]) {
149                    $value = get_string('sectioninc','backup');
150                } else {
151                    continue;
152                }
153                $html .= $this->backup_detail_pair(get_string('backupcoursesection', 'backup', $section->title), $value);
154                $table = null;
155                foreach ($details->activities as $activitykey=>$activity) {
156                    if ($activity->sectionid != $section->sectionid) {
157                        continue;
158                    }
159                    if (empty($table)) {
160                        $table = new html_table();
161                        $table->head = array(get_string('module','backup'), get_string('title','backup'), get_string('userinfo','backup'));
162                        $table->colclasses = array('modulename', 'moduletitle', 'userinfoincluded');
163                        $table->align = array('left','left', 'center');
164                        $table->attributes = array('class'=>'activitytable generaltable');
165                        $table->data = array();
166                    }
167                    $name = get_string('pluginname', $activity->modulename);
168                    $icon = new pix_icon('icon', $name, $activity->modulename, array('class' => 'iconlarge icon-pre'));
169                    $table->data[] = array(
170                        $this->output->render($icon).$name,
171                        $activity->title,
172                        ($activity->settings[$activitykey.'_userinfo'])?$yestick:$notick,
173                    );
174                }
175                if (!empty($table)) {
176                    $html .= $this->backup_detail_pair(get_string('sectionactivities','backup'), html_writer::table($table));
177                }
178
179            }
180            $html .= html_writer::end_tag('div');
181            $html .= html_writer::end_tag('div');
182        }
183
184        $html .= $this->output->single_button($nextstageurl, get_string('continue'), 'post');
185        $html .= html_writer::end_tag('div');
186
187        return $html;
188    }
189
190    /**
191     * Displays the general information about a backup file with non-standard format
192     *
193     * @param moodle_url $nextstageurl URL to send user to
194     * @param array $details basic info about the file (format, type)
195     * @return string HTML code to display
196     */
197    public function backup_details_nonstandard($nextstageurl, array $details) {
198
199        $html  = html_writer::start_tag('div', array('class' => 'backup-restore nonstandardformat'));
200        $html .= html_writer::start_tag('div', array('class' => 'backup-section'));
201        $html .= $this->output->heading(get_string('backupdetails', 'backup'), 2, 'header');
202        $html .= $this->output->box(get_string('backupdetailsnonstandardinfo', 'backup'), 'noticebox');
203        $html .= $this->backup_detail_pair(
204            get_string('backupformat', 'backup'),
205            get_string('backupformat'.$details['format'], 'backup'));
206        $html .= $this->backup_detail_pair(
207            get_string('backuptype', 'backup'),
208            get_string('backuptype'.$details['type'], 'backup'));
209        $html .= html_writer::end_tag('div');
210        $html .= $this->output->single_button($nextstageurl, get_string('continue'), 'post');
211        $html .= html_writer::end_tag('div');
212
213        return $html;
214    }
215
216    /**
217     * Displays the general information about a backup file with unknown format
218     *
219     * @param moodle_url $nextstageurl URL to send user to
220     * @return string HTML code to display
221     */
222    public function backup_details_unknown(moodle_url $nextstageurl) {
223
224        $html  = html_writer::start_div('unknownformat');
225        $html .= $this->output->heading(get_string('errorinvalidformat', 'backup'), 2);
226        $html .= $this->output->notification(get_string('errorinvalidformatinfo', 'backup'), 'notifyproblem');
227        $html .= $this->output->single_button($nextstageurl, get_string('continue'), 'post');
228        $html .= html_writer::end_div();
229
230        return $html;
231    }
232
233    /**
234     * Displays a course selector for restore
235     *
236     * @param moodle_url $nextstageurl
237     * @param bool $wholecourse true if we are restoring whole course (as with backup::TYPE_1COURSE), false otherwise
238     * @param restore_category_search $categories
239     * @param restore_course_search $courses
240     * @param int $currentcourse
241     * @return string
242     */
243    public function course_selector(moodle_url $nextstageurl, $wholecourse = true, restore_category_search $categories = null, restore_course_search $courses=null, $currentcourse = null) {
244        global $CFG, $PAGE;
245        require_once($CFG->dirroot.'/course/lib.php');
246
247        // These variables are used to check if the form using this function was submitted.
248        $target = optional_param('target', false, PARAM_INT);
249        $targetid = optional_param('targetid', null, PARAM_INT);
250
251        // Check if they submitted the form but did not provide all the data we need.
252        $missingdata = false;
253        if ($target and is_null($targetid)) {
254            $missingdata = true;
255        }
256
257        $nextstageurl->param('sesskey', sesskey());
258
259        $form = html_writer::start_tag('form', array('method' => 'post', 'action' => $nextstageurl->out_omit_querystring(),
260            'class' => 'mform'));
261        foreach ($nextstageurl->params() as $key=>$value) {
262            $form .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>$key, 'value'=>$value));
263        }
264
265        $hasrestoreoption = false;
266
267        $html  = html_writer::start_tag('div', array('class'=>'backup-course-selector backup-restore'));
268        if ($wholecourse && !empty($categories) && ($categories->get_count() > 0 || $categories->get_search())) {
269            // New course
270            $hasrestoreoption = true;
271            $html .= $form;
272            $html .= html_writer::start_tag('div', array('class'=>'bcs-new-course backup-section'));
273            $html .= $this->output->heading(get_string('restoretonewcourse', 'backup'), 2, array('class'=>'header'));
274            $html .= $this->backup_detail_input(get_string('restoretonewcourse', 'backup'), 'radio', 'target', backup::TARGET_NEW_COURSE, array('checked'=>'checked'));
275            $selectacategoryhtml = $this->backup_detail_pair(get_string('selectacategory', 'backup'), $this->render($categories));
276            // Display the category selection as required if the form was submitted but this data was not supplied.
277            if ($missingdata && $target == backup::TARGET_NEW_COURSE) {
278                $html .= html_writer::span(get_string('required'), 'error');
279                $html .= html_writer::start_tag('fieldset', array('class' => 'error'));
280                $html .= $selectacategoryhtml;
281                $html .= html_writer::end_tag('fieldset');
282            } else {
283                $html .= $selectacategoryhtml;
284            }
285            $html .= $this->backup_detail_pair('', html_writer::empty_tag('input', array('type'=>'submit', 'value'=>get_string('continue'))));
286            $html .= html_writer::end_tag('div');
287            $html .= html_writer::end_tag('form');
288        }
289
290        if ($wholecourse && !empty($currentcourse)) {
291            // Current course
292            $hasrestoreoption = true;
293            $html .= $form;
294            $html .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>'targetid', 'value'=>$currentcourse));
295            $html .= html_writer::start_tag('div', array('class'=>'bcs-current-course backup-section'));
296            $html .= $this->output->heading(get_string('restoretocurrentcourse', 'backup'), 2, array('class'=>'header'));
297            $html .= $this->backup_detail_input(get_string('restoretocurrentcourseadding', 'backup'), 'radio', 'target', backup::TARGET_CURRENT_ADDING, array('checked'=>'checked'));
298            $html .= $this->backup_detail_input(get_string('restoretocurrentcoursedeleting', 'backup'), 'radio', 'target', backup::TARGET_CURRENT_DELETING);
299            $html .= $this->backup_detail_pair('', html_writer::empty_tag('input', array('type'=>'submit', 'value'=>get_string('continue'))));
300            $html .= html_writer::end_tag('div');
301            $html .= html_writer::end_tag('form');
302        }
303
304        // If we are restoring an activity, then include the current course.
305        if (!$wholecourse) {
306            $courses->invalidate_results(); // Clean list of courses.
307            $courses->set_include_currentcourse();
308        }
309        if (!empty($courses) && ($courses->get_count() > 0 || $courses->get_search())) {
310            // Existing course
311            $hasrestoreoption = true;
312            $html .= $form;
313            $html .= html_writer::start_tag('div', array('class'=>'bcs-existing-course backup-section'));
314            $html .= $this->output->heading(get_string('restoretoexistingcourse', 'backup'), 2, array('class'=>'header'));
315            if ($wholecourse) {
316                $html .= $this->backup_detail_input(get_string('restoretoexistingcourseadding', 'backup'), 'radio', 'target', backup::TARGET_EXISTING_ADDING, array('checked'=>'checked'));
317                $html .= $this->backup_detail_input(get_string('restoretoexistingcoursedeleting', 'backup'), 'radio', 'target', backup::TARGET_EXISTING_DELETING);
318            } else {
319                $html .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>'target', 'value'=>backup::TARGET_EXISTING_ADDING));
320            }
321            $selectacoursehtml = $this->backup_detail_pair(get_string('selectacourse', 'backup'), $this->render($courses));
322            // Display the course selection as required if the form was submitted but this data was not supplied.
323            if ($missingdata && $target == backup::TARGET_EXISTING_ADDING) {
324                $html .= html_writer::span(get_string('required'), 'error');
325                $html .= html_writer::start_tag('fieldset', array('class' => 'error'));
326                $html .= $selectacoursehtml;
327                $html .= html_writer::end_tag('fieldset');
328            } else {
329                $html .= $selectacoursehtml;
330            }
331            $html .= $this->backup_detail_pair('', html_writer::empty_tag('input', array('type'=>'submit', 'value'=>get_string('continue'))));
332            $html .= html_writer::end_tag('div');
333            $html .= html_writer::end_tag('form');
334        }
335
336        if (!$hasrestoreoption) {
337            echo $this->output->notification(get_string('norestoreoptions','backup'));
338        }
339
340        $html .= html_writer::end_tag('div');
341        return $html;
342    }
343
344    /**
345     * Displays the import course selector
346     *
347     * @param moodle_url $nextstageurl
348     * @param import_course_search $courses
349     * @return string
350     */
351    public function import_course_selector(moodle_url $nextstageurl, import_course_search $courses=null) {
352        $html  = html_writer::start_tag('div', array('class'=>'import-course-selector backup-restore'));
353        $html .= html_writer::start_tag('form', array('method'=>'post', 'action'=>$nextstageurl->out_omit_querystring()));
354        foreach ($nextstageurl->params() as $key=>$value) {
355            $html .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>$key, 'value'=>$value));
356        }
357        // We only allow import adding for now. Enforce it here.
358        $html .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>'target', 'value'=>backup::TARGET_CURRENT_ADDING));
359        $html .= html_writer::start_tag('div', array('class'=>'ics-existing-course backup-section'));
360        $html .= $this->output->heading(get_string('importdatafrom'), 2, array('class'=>'header'));
361        $html .= $this->backup_detail_pair(get_string('selectacourse', 'backup'), $this->render($courses));
362        $html .= $this->backup_detail_pair('', html_writer::empty_tag('input', array('type'=>'submit', 'value'=>get_string('continue'))));
363        $html .= html_writer::end_tag('div');
364        $html .= html_writer::end_tag('form');
365        $html .= html_writer::end_tag('div');
366        return $html;
367    }
368
369    /**
370     * Creates a detailed pairing (key + value)
371     *
372     * @staticvar int $count
373     * @param string $label
374     * @param string $value
375     * @return string
376     */
377    protected function backup_detail_pair($label, $value) {
378        static $count= 0;
379        $count++;
380        $html  = html_writer::start_tag('div', array('class'=>'detail-pair'));
381        $html .= html_writer::tag('label', $label, array('class'=>'detail-pair-label', 'for'=>'detail-pair-value-'.$count));
382        $html .= html_writer::tag('div', $value, array('class'=>'detail-pair-value', 'name'=>'detail-pair-value-'.$count));
383        $html .= html_writer::end_tag('div');
384        return $html;
385    }
386
387    /**
388     * Created a detailed pairing with an input
389     *
390     * @param string $label
391     * @param string $type
392     * @param string $name
393     * @param string $value
394     * @param array $attributes
395     * @param string|null $description
396     * @return string
397     */
398    protected function backup_detail_input($label, $type, $name, $value, array $attributes=array(), $description=null) {
399        if (!empty ($description)) {
400            $description = html_writer::tag('span', $description, array('class'=>'description'));
401        } else {
402            $description = '';
403        }
404        return $this->backup_detail_pair($label, html_writer::empty_tag('input', $attributes+array('name'=>$name, 'type'=>$type, 'value'=>$value)).$description);
405    }
406
407    /**
408     * Creates a detailed pairing with a select
409     *
410     * @param string $label
411     * @param string $name
412     * @param array $options
413     * @param string $selected
414     * @param bool $nothing
415     * @param array $attributes
416     * @param string|null $description
417     * @return string
418     */
419    protected function backup_detail_select($label, $name, $options, $selected='', $nothing=false, array $attributes=array(), $description=null) {
420        if (!empty ($description)) {
421            $description = html_writer::tag('span', $description, array('class'=>'description'));
422        } else {
423            $description = '';
424        }
425        return $this->backup_detail_pair($label, html_writer::select($options, $name, $selected, false, $attributes).$description);
426    }
427
428    /**
429     * Displays precheck notices
430     *
431     * @param array $results
432     * @return string
433     */
434    public function precheck_notices($results) {
435        $output = html_writer::start_tag('div', array('class'=>'restore-precheck-notices'));
436        if (array_key_exists('errors', $results)) {
437            foreach ($results['errors'] as $error) {
438                $output .= $this->output->notification($error);
439            }
440        }
441        if (array_key_exists('warnings', $results)) {
442            foreach ($results['warnings'] as $warning) {
443                $output .= $this->output->notification($warning, 'notifyproblem');
444            }
445        }
446        return $output.html_writer::end_tag('div');
447    }
448
449    /**
450     * Displays substage buttons
451     *
452     * @param bool $haserrors
453     * @return string
454     */
455    public function substage_buttons($haserrors) {
456        $output  = html_writer::start_tag('div', array('continuebutton'));
457        if (!$haserrors) {
458            $output .= html_writer::empty_tag('input', array('type'=>'submit', 'value'=>get_string('continue')));
459        }
460        $output .= html_writer::empty_tag('input', array('type'=>'submit', 'name'=>'cancel', 'value'=>get_string('cancel')));
461        $output .= html_writer::end_tag('div');
462        return $output;
463    }
464
465    /**
466     * Displays a role mapping interface
467     *
468     * @param array $rolemappings
469     * @param array $roles
470     * @return string
471     */
472    public function role_mappings($rolemappings, $roles) {
473        $roles[0] = get_string('none');
474        $output  = html_writer::start_tag('div', array('class'=>'restore-rolemappings'));
475        $output .= $this->output->heading(get_string('restorerolemappings', 'backup'), 2);
476        foreach ($rolemappings as $id=>$mapping) {
477            $label = $mapping->name;
478            $name = 'mapping'.$id;
479            $selected = $mapping->targetroleid;
480            $output .= $this->backup_detail_select($label, $name, $roles, $mapping->targetroleid, false, array(), $mapping->description);
481        }
482        $output .= html_writer::end_tag('div');
483        return $output;
484    }
485
486    /**
487     * Displays a continue button
488     *
489     * @param string|moodle_url $url
490     * @param string $method
491     * @return string
492     */
493    public function continue_button($url, $method='post') {
494        if (!($url instanceof moodle_url)) {
495            $url = new moodle_url($url);
496        }
497        if ($method != 'post') {
498            $method = 'get';
499        }
500        $url->param('sesskey', sesskey());
501        $button = new single_button($url, get_string('continue'), $method);
502        $button->class = 'continuebutton';
503        return $this->render($button);
504    }
505    /**
506     * Print a backup files tree
507     * @param array $options
508     * @return string
509     */
510    public function backup_files_viewer(array $options = null) {
511        $files = new backup_files_viewer($options);
512        return $this->render($files);
513    }
514
515    /**
516     * Displays a backup files viewer
517     *
518     * @global stdClass $USER
519     * @param backup_files_viewer $tree
520     * @return string
521     */
522    public function render_backup_files_viewer(backup_files_viewer $viewer) {
523        global $CFG;
524        $files = $viewer->files;
525
526        $table = new html_table();
527        $table->attributes['class'] = 'backup-files-table generaltable';
528        $table->head = array(get_string('filename', 'backup'), get_string('time'), get_string('size'), get_string('download'), get_string('restore'));
529        $table->width = '100%';
530        $table->data = array();
531
532        foreach ($files as $file) {
533            if ($file->is_directory()) {
534                continue;
535            }
536            $fileurl = moodle_url::make_pluginfile_url($file->get_contextid(), $file->get_component(), $file->get_filearea(), null, $file->get_filepath(), $file->get_filename(), true);
537            $params = array();
538            $params['action'] = 'choosebackupfile';
539            $params['filename'] = $file->get_filename();
540            $params['filepath'] = $file->get_filepath();
541            $params['component'] = $file->get_component();
542            $params['filearea'] = $file->get_filearea();
543            $params['filecontextid'] = $file->get_contextid();
544            $params['contextid'] = $viewer->currentcontext->id;
545            $params['itemid'] = $file->get_itemid();
546            $restoreurl = new moodle_url('/backup/restorefile.php', $params);
547            $table->data[] = array(
548                $file->get_filename(),
549                userdate($file->get_timemodified()),
550                display_size($file->get_filesize()),
551                html_writer::link($fileurl, get_string('download')),
552                html_writer::link($restoreurl, get_string('restore')),
553                );
554        }
555
556        $html = html_writer::table($table);
557        $html .= $this->output->single_button(new moodle_url('/backup/backupfilesedit.php', array('currentcontext'=>$viewer->currentcontext->id, 'contextid'=>$viewer->filecontext->id, 'filearea'=>$viewer->filearea, 'component'=>$viewer->component, 'returnurl'=>$this->page->url->out())), get_string('managefiles', 'backup'), 'post');
558
559        return $html;
560    }
561
562    /**
563     * Renders a restore course search object
564     *
565     * @param restore_course_search $component
566     * @return string
567     */
568    public function render_restore_course_search(restore_course_search $component) {
569        $url = $component->get_url();
570
571        $output = html_writer::start_tag('div', array('class' => 'restore-course-search'));
572        $output .= html_writer::start_tag('div', array('class' => 'rcs-results'));
573
574        $table = new html_table();
575        $table->head = array('', get_string('shortnamecourse'), get_string('fullnamecourse'));
576        $table->data = array();
577        if ($component->get_count() !== 0) {
578            foreach ($component->get_results() as $course) {
579                $row = new html_table_row();
580                $row->attributes['class'] = 'rcs-course';
581                if (!$course->visible) {
582                    $row->attributes['class'] .= ' dimmed';
583                }
584                $row->cells = array(
585                    html_writer::empty_tag('input', array('type'=>'radio', 'name'=>'targetid', 'value'=>$course->id)),
586                    format_string($course->shortname, true, array('context' => context_course::instance($course->id))),
587                    format_string($course->fullname, true, array('context' => context_course::instance($course->id)))
588                );
589                $table->data[] = $row;
590            }
591            if ($component->has_more_results()) {
592                $cell = new html_table_cell(get_string('moreresults', 'backup'));
593                $cell->colspan = 3;
594                $cell->attributes['class'] = 'notifyproblem';
595                $row = new html_table_row(array($cell));
596                $row->attributes['class'] = 'rcs-course';
597                $table->data[] = $row;
598            }
599        } else {
600            $cell = new html_table_cell(get_string('nomatchingcourses', 'backup'));
601            $cell->colspan = 3;
602            $cell->attributes['class'] = 'notifyproblem';
603            $row = new html_table_row(array($cell));
604            $row->attributes['class'] = 'rcs-course';
605            $table->data[] = $row;
606        }
607        $output .= html_writer::table($table);
608        $output .= html_writer::end_tag('div');
609
610        $output .= html_writer::start_tag('div', array('class'=>'rcs-search'));
611        $output .= html_writer::empty_tag('input', array('type'=>'text', 'name'=>restore_course_search::$VAR_SEARCH, 'value'=>$component->get_search()));
612        $output .= html_writer::empty_tag('input', array('type'=>'submit', 'name'=>'searchcourses', 'value'=>get_string('search')));
613        $output .= html_writer::end_tag('div');
614
615        $output .= html_writer::end_tag('div');
616        return $output;
617    }
618
619    /**
620     * Renders an import course search object
621     *
622     * @param import_course_search $component
623     * @return string
624     */
625    public function render_import_course_search(import_course_search $component) {
626        $url = $component->get_url();
627
628        $output = html_writer::start_tag('div', array('class' => 'import-course-search'));
629        if ($component->get_count() === 0) {
630            $output .= $this->output->notification(get_string('nomatchingcourses', 'backup'));
631
632            $output .= html_writer::start_tag('div', array('class'=>'ics-search'));
633            $output .= html_writer::empty_tag('input', array('type'=>'text', 'name'=>restore_course_search::$VAR_SEARCH, 'value'=>$component->get_search()));
634            $output .= html_writer::empty_tag('input', array('type'=>'submit', 'name'=>'searchcourses', 'value'=>get_string('search')));
635            $output .= html_writer::end_tag('div');
636
637            $output .= html_writer::end_tag('div');
638            return $output;
639        }
640
641        $countstr = '';
642        if ($component->has_more_results()) {
643            $countstr = get_string('morecoursesearchresults', 'backup', $component->get_count());
644        } else {
645            $countstr = get_string('totalcoursesearchresults', 'backup', $component->get_count());
646        }
647
648        $output .= html_writer::tag('div', $countstr, array('class'=>'ics-totalresults'));
649        $output .= html_writer::start_tag('div', array('class' => 'ics-results'));
650
651        $table = new html_table();
652        $table->head = array('', get_string('shortnamecourse'), get_string('fullnamecourse'));
653        $table->data = array();
654        foreach ($component->get_results() as $course) {
655            $row = new html_table_row();
656            $row->attributes['class'] = 'ics-course';
657            if (!$course->visible) {
658                $row->attributes['class'] .= ' dimmed';
659            }
660            $row->cells = array(
661                html_writer::empty_tag('input', array('type'=>'radio', 'name'=>'importid', 'value'=>$course->id)),
662                format_string($course->shortname, true, array('context' => context_course::instance($course->id))),
663                format_string($course->fullname, true, array('context' => context_course::instance($course->id)))
664            );
665            $table->data[] = $row;
666        }
667        if ($component->has_more_results()) {
668            $cell = new html_table_cell(get_string('moreresults', 'backup'));
669            $cell->colspan = 3;
670            $cell->attributes['class'] = 'notifyproblem';
671            $row = new html_table_row(array($cell));
672            $row->attributes['class'] = 'rcs-course';
673            $table->data[] = $row;
674        }
675        $output .= html_writer::table($table);
676        $output .= html_writer::end_tag('div');
677
678        $output .= html_writer::start_tag('div', array('class'=>'ics-search'));
679        $output .= html_writer::empty_tag('input', array('type'=>'text', 'name'=>restore_course_search::$VAR_SEARCH, 'value'=>$component->get_search()));
680        $output .= html_writer::empty_tag('input', array('type'=>'submit', 'name'=>'searchcourses', 'value'=>get_string('search')));
681        $output .= html_writer::end_tag('div');
682
683        $output .= html_writer::end_tag('div');
684        return $output;
685    }
686
687    /**
688     * Renders a restore category search object
689     *
690     * @param restore_category_search $component
691     * @return string
692     */
693    public function render_restore_category_search(restore_category_search $component) {
694        $url = $component->get_url();
695
696        $output = html_writer::start_tag('div', array('class' => 'restore-course-search'));
697        $output .= html_writer::start_tag('div', array('class' => 'rcs-results'));
698
699        $table = new html_table();
700        $table->head = array('', get_string('name'), get_string('description'));
701        $table->data = array();
702
703        if ($component->get_count() !== 0) {
704            foreach ($component->get_results() as $category) {
705                $row = new html_table_row();
706                $row->attributes['class'] = 'rcs-course';
707                if (!$category->visible) {
708                    $row->attributes['class'] .= ' dimmed';
709                }
710                $row->cells = array(
711                    html_writer::empty_tag('input', array('type'=>'radio', 'name'=>'targetid', 'value'=>$category->id)),
712                    format_string($category->name, true, array('context' => context_coursecat::instance($category->id))),
713                    format_text($category->description, $category->descriptionformat, array('overflowdiv'=>true))
714                );
715                $table->data[] = $row;
716            }
717            if ($component->has_more_results()) {
718                $cell = new html_table_cell(get_string('moreresults', 'backup'));
719                $cell->attributes['class'] = 'notifyproblem';
720                $cell->colspan = 3;
721                $row = new html_table_row(array($cell));
722                $row->attributes['class'] = 'rcs-course';
723                $table->data[] = $row;
724            }
725        } else {
726            $cell = new html_table_cell(get_string('nomatchingcourses', 'backup'));
727            $cell->colspan = 3;
728            $cell->attributes['class'] = 'notifyproblem';
729            $row = new html_table_row(array($cell));
730            $row->attributes['class'] = 'rcs-course';
731            $table->data[] = $row;
732        }
733        $output .= html_writer::table($table);
734        $output .= html_writer::end_tag('div');
735
736        $output .= html_writer::start_tag('div', array('class'=>'rcs-search'));
737        $output .= html_writer::empty_tag('input', array('type'=>'text', 'name'=>restore_category_search::$VAR_SEARCH, 'value'=>$component->get_search()));
738        $output .= html_writer::empty_tag('input', array('type'=>'submit', 'name'=>'searchcourses', 'value'=>get_string('search')));
739        $output .= html_writer::end_tag('div');
740
741        $output .= html_writer::end_tag('div');
742        return $output;
743    }
744}
745
746/**
747 * Data structure representing backup files viewer
748 *
749 * @copyright 2010 Dongsheng Cai
750 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
751 * @since     Moodle 2.0
752 */
753class backup_files_viewer implements renderable {
754    public $files;
755    public $filecontext;
756    public $component;
757    public $filearea;
758    public $currentcontext;
759
760    /**
761     * Constructor of backup_files_viewer class
762     * @param array $options
763     */
764    public function __construct(array $options = null) {
765        global $CFG, $USER;
766        $fs = get_file_storage();
767        $this->currentcontext = $options['currentcontext'];
768        $this->filecontext    = $options['filecontext'];
769        $this->component      = $options['component'];
770        $this->filearea       = $options['filearea'];
771        $files = $fs->get_area_files($this->filecontext->id, $this->component, $this->filearea, false, 'timecreated');
772        $this->files = array_reverse($files);
773    }
774}
Note: See TracBrowser for help on using the repository browser.