Commit | Line | Data |
---|---|---|
27806552 YB |
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/>. | |
16 | ||
17 | /** | |
18 | * Renderer for use with the badges output | |
19 | * | |
20 | * @package core | |
21 | * @subpackage badges | |
22 | * @copyright 2012 onwards Totara Learning Solutions Ltd {@link http://www.totaralms.com/} | |
23 | * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later | |
24 | * @author Yuliya Bozhko <yuliya.bozhko@totaralms.com> | |
25 | */ | |
26 | ||
27 | require_once($CFG->libdir . '/badgeslib.php'); | |
28 | require_once($CFG->libdir . '/tablelib.php'); | |
27806552 YB |
29 | |
30 | /** | |
31 | * Standard HTML output renderer for badges | |
32 | */ | |
33 | class core_badges_renderer extends plugin_renderer_base { | |
34 | ||
35 | // Outputs badges list. | |
36 | public function print_badges_list($badges, $userid, $profile = false, $external = false) { | |
37 | global $USER, $CFG; | |
38 | foreach ($badges as $badge) { | |
39 | if (!$external) { | |
40 | $context = ($badge->type == BADGE_TYPE_SITE) ? context_system::instance() : context_course::instance($badge->courseid); | |
41 | $bname = $badge->name; | |
42 | $imageurl = moodle_url::make_pluginfile_url($context->id, 'badges', 'badgeimage', $badge->id, '/', 'f1', false); | |
43 | } else { | |
aae219ac DW |
44 | $bname = ''; |
45 | $imageurl = ''; | |
46 | if (!empty($badge->name)) { | |
47 | $bname = s($badge->name); | |
48 | } | |
49 | if (!empty($badge->image)) { | |
50 | $imageurl = $badge->image; | |
51 | } | |
52 | if (isset($badge->assertion->badge->name)) { | |
53 | $bname = s($badge->assertion->badge->name); | |
54 | } | |
55 | if (isset($badge->imageUrl)) { | |
56 | $imageurl = $badge->imageUrl; | |
57 | } | |
27806552 YB |
58 | } |
59 | ||
60 | $name = html_writer::tag('span', $bname, array('class' => 'badge-name')); | |
61 | ||
62 | $image = html_writer::empty_tag('img', array('src' => $imageurl, 'class' => 'badge-image')); | |
63 | if (!empty($badge->dateexpire) && $badge->dateexpire < time()) { | |
64 | $image .= $this->output->pix_icon('i/expired', | |
65 | get_string('expireddate', 'badges', userdate($badge->dateexpire)), | |
66 | 'moodle', | |
67 | array('class' => 'expireimage')); | |
68 | $name .= '(' . get_string('expired', 'badges') . ')'; | |
69 | } | |
70 | ||
71 | $download = $status = $push = ''; | |
72 | if (($userid == $USER->id) && !$profile) { | |
aae219ac DW |
73 | $params = array( |
74 | 'download' => $badge->id, | |
75 | 'hash' => $badge->uniquehash, | |
76 | 'sesskey' => sesskey() | |
77 | ); | |
78 | $url = new moodle_url( | |
79 | 'mybadges.php', | |
80 | $params | |
81 | ); | |
e2805314 | 82 | $notexpiredbadge = (empty($badge->dateexpire) || $badge->dateexpire > time()); |
d3af9592 PD |
83 | $userbackpack = badges_get_user_backpack(); |
84 | if (!empty($CFG->badges_allowexternalbackpack) && $notexpiredbadge && $userbackpack) { | |
27806552 | 85 | $assertion = new moodle_url('/badges/assertion.php', array('b' => $badge->uniquehash)); |
aae219ac | 86 | $action = null; |
d3af9592 | 87 | if (badges_open_badges_backpack_api($userbackpack->id) == OPEN_BADGES_V1) { |
aae219ac | 88 | $action = new component_action('click', 'addtobackpack', array('assertion' => $assertion->out(false))); |
1837b1d5 | 89 | $addurl = new moodle_url('#'); |
d3af9592 | 90 | } else if (badges_open_badges_backpack_api($userbackpack->id) == OPEN_BADGES_V2P1) { |
15a00bea | 91 | $addurl = new moodle_url('/badges/backpack-export.php', array('hash' => $badge->uniquehash)); |
aae219ac | 92 | } else { |
1837b1d5 | 93 | $addurl = new moodle_url('/badges/backpack-add.php', array('hash' => $badge->uniquehash)); |
aae219ac | 94 | } |
1837b1d5 DW |
95 | $icon = new pix_icon('t/backpack', get_string('addtobackpack', 'badges')); |
96 | $push = $this->output->action_icon($addurl, $icon, $action); | |
27806552 YB |
97 | } |
98 | ||
99 | $download = $this->output->action_icon($url, new pix_icon('t/download', get_string('download'))); | |
100 | if ($badge->visible) { | |
101 | $url = new moodle_url('mybadges.php', array('hide' => $badge->issuedid, 'sesskey' => sesskey())); | |
102 | $status = $this->output->action_icon($url, new pix_icon('t/hide', get_string('makeprivate', 'badges'))); | |
103 | } else { | |
104 | $url = new moodle_url('mybadges.php', array('show' => $badge->issuedid, 'sesskey' => sesskey())); | |
105 | $status = $this->output->action_icon($url, new pix_icon('t/show', get_string('makepublic', 'badges'))); | |
106 | } | |
107 | } | |
108 | ||
109 | if (!$profile) { | |
110 | $url = new moodle_url('badge.php', array('hash' => $badge->uniquehash)); | |
111 | } else { | |
112 | if (!$external) { | |
2d3c0fae | 113 | $url = new moodle_url('/badges/badge.php', array('hash' => $badge->uniquehash)); |
27806552 | 114 | } else { |
2d3c0fae YB |
115 | $hash = hash('md5', $badge->hostedUrl); |
116 | $url = new moodle_url('/badges/external.php', array('hash' => $hash, 'user' => $userid)); | |
27806552 YB |
117 | } |
118 | } | |
119 | $actions = html_writer::tag('div', $push . $download . $status, array('class' => 'badge-actions')); | |
120 | $items[] = html_writer::link($url, $image . $actions . $name, array('title' => $bname)); | |
121 | } | |
122 | ||
123 | return html_writer::alist($items, array('class' => 'badges')); | |
124 | } | |
125 | ||
126 | // Recipients selection form. | |
127 | public function recipients_selection_form(user_selector_base $existinguc, user_selector_base $potentialuc) { | |
128 | $output = ''; | |
129 | $formattributes = array(); | |
130 | $formattributes['id'] = 'recipientform'; | |
04da1a5a | 131 | $formattributes['action'] = $this->page->url; |
27806552 YB |
132 | $formattributes['method'] = 'post'; |
133 | $output .= html_writer::start_tag('form', $formattributes); | |
134 | $output .= html_writer::empty_tag('input', array('type' => 'hidden', 'name' => 'sesskey', 'value' => sesskey())); | |
135 | ||
136 | $existingcell = new html_table_cell(); | |
137 | $existingcell->text = $existinguc->display(true); | |
138 | $existingcell->attributes['class'] = 'existing'; | |
139 | $actioncell = new html_table_cell(); | |
140 | $actioncell->text = html_writer::start_tag('div', array()); | |
141 | $actioncell->text .= html_writer::empty_tag('input', array( | |
142 | 'type' => 'submit', | |
143 | 'name' => 'award', | |
144 | 'value' => $this->output->larrow() . ' ' . get_string('award', 'badges'), | |
2e477f03 | 145 | 'class' => 'actionbutton btn btn-secondary') |
27806552 | 146 | ); |
b7374fac MD |
147 | $actioncell->text .= html_writer::empty_tag('input', array( |
148 | 'type' => 'submit', | |
149 | 'name' => 'revoke', | |
150 | 'value' => get_string('revoke', 'badges') . ' ' . $this->output->rarrow(), | |
2e477f03 | 151 | 'class' => 'actionbutton btn btn-secondary') |
b7374fac | 152 | ); |
27806552 YB |
153 | $actioncell->text .= html_writer::end_tag('div', array()); |
154 | $actioncell->attributes['class'] = 'actions'; | |
155 | $potentialcell = new html_table_cell(); | |
156 | $potentialcell->text = $potentialuc->display(true); | |
157 | $potentialcell->attributes['class'] = 'potential'; | |
158 | ||
159 | $table = new html_table(); | |
160 | $table->attributes['class'] = 'recipienttable boxaligncenter'; | |
161 | $table->data = array(new html_table_row(array($existingcell, $actioncell, $potentialcell))); | |
162 | $output .= html_writer::table($table); | |
163 | ||
164 | $output .= html_writer::end_tag('form'); | |
165 | return $output; | |
166 | } | |
167 | ||
168 | // Prints a badge overview infomation. | |
169 | public function print_badge_overview($badge, $context) { | |
170 | $display = ""; | |
d363a5c2 | 171 | $languages = get_string_manager()->get_list_of_languages(); |
27806552 YB |
172 | |
173 | // Badge details. | |
cd243d94 Y |
174 | $display .= $this->heading(get_string('badgedetails', 'badges'), 3); |
175 | $dl = array(); | |
176 | $dl[get_string('name')] = $badge->name; | |
d363a5c2 TT |
177 | $dl[get_string('version', 'badges')] = $badge->version; |
178 | $dl[get_string('language')] = $languages[$badge->language]; | |
cd243d94 | 179 | $dl[get_string('description', 'badges')] = $badge->description; |
64d00f4c | 180 | $dl[get_string('createdon', 'search')] = userdate($badge->timecreated); |
cd243d94 | 181 | $dl[get_string('badgeimage', 'badges')] = print_badge_image($badge, $context, 'large'); |
65ffd0a3 | 182 | $dl[get_string('imageauthorname', 'badges')] = $badge->imageauthorname; |
d363a5c2 TT |
183 | $dl[get_string('imageauthoremail', 'badges')] = |
184 | html_writer::tag('a', $badge->imageauthoremail, array('href' => 'mailto:' . $badge->imageauthoremail)); | |
185 | $dl[get_string('imageauthorurl', 'badges')] = | |
186 | html_writer::link($badge->imageauthorurl, $badge->imageauthorurl, array('target' => '_blank')); | |
187 | $dl[get_string('imagecaption', 'badges')] = $badge->imagecaption; | |
cd243d94 | 188 | $display .= $this->definition_list($dl); |
27806552 | 189 | |
cd243d94 Y |
190 | // Issuer details. |
191 | $display .= $this->heading(get_string('issuerdetails', 'badges'), 3); | |
192 | $dl = array(); | |
193 | $dl[get_string('issuername', 'badges')] = $badge->issuername; | |
194 | $dl[get_string('contact', 'badges')] = html_writer::tag('a', $badge->issuercontact, array('href' => 'mailto:' . $badge->issuercontact)); | |
195 | $display .= $this->definition_list($dl); | |
27806552 YB |
196 | |
197 | // Issuance details if any. | |
cd243d94 | 198 | $display .= $this->heading(get_string('issuancedetails', 'badges'), 3); |
27806552 YB |
199 | if ($badge->can_expire()) { |
200 | if ($badge->expiredate) { | |
201 | $display .= get_string('expiredate', 'badges', userdate($badge->expiredate)); | |
202 | } else if ($badge->expireperiod) { | |
203 | if ($badge->expireperiod < 60) { | |
204 | $display .= get_string('expireperiods', 'badges', round($badge->expireperiod, 2)); | |
205 | } else if ($badge->expireperiod < 60 * 60) { | |
206 | $display .= get_string('expireperiodm', 'badges', round($badge->expireperiod / 60, 2)); | |
207 | } else if ($badge->expireperiod < 60 * 60 * 24) { | |
208 | $display .= get_string('expireperiodh', 'badges', round($badge->expireperiod / 60 / 60, 2)); | |
209 | } else { | |
210 | $display .= get_string('expireperiod', 'badges', round($badge->expireperiod / 60 / 60 / 24, 2)); | |
211 | } | |
212 | } | |
213 | } else { | |
214 | $display .= get_string('noexpiry', 'badges'); | |
215 | } | |
27806552 YB |
216 | |
217 | // Criteria details if any. | |
cd243d94 | 218 | $display .= $this->heading(get_string('bcriteria', 'badges'), 3); |
27806552 YB |
219 | if ($badge->has_criteria()) { |
220 | $display .= self::print_badge_criteria($badge); | |
221 | } else { | |
222 | $display .= get_string('nocriteria', 'badges'); | |
223 | if (has_capability('moodle/badges:configurecriteria', $context)) { | |
224 | $display .= $this->output->single_button( | |
225 | new moodle_url('/badges/criteria.php', array('id' => $badge->id)), | |
226 | get_string('addcriteria', 'badges'), 'POST', array('class' => 'activatebadge')); | |
227 | } | |
228 | } | |
27806552 YB |
229 | |
230 | // Awards details if any. | |
231 | if (has_capability('moodle/badges:viewawarded', $context)) { | |
cd243d94 | 232 | $display .= $this->heading(get_string('awards', 'badges'), 3); |
27806552 YB |
233 | if ($badge->has_awards()) { |
234 | $url = new moodle_url('/badges/recipients.php', array('id' => $badge->id)); | |
235 | $a = new stdClass(); | |
236 | $a->link = $url->out(); | |
237 | $a->count = count($badge->get_awards()); | |
238 | $display .= get_string('numawards', 'badges', $a); | |
239 | } else { | |
240 | $display .= get_string('noawards', 'badges'); | |
241 | } | |
242 | ||
243 | if (has_capability('moodle/badges:awardbadge', $context) && | |
244 | $badge->has_manual_award_criteria() && | |
245 | $badge->is_active()) { | |
246 | $display .= $this->output->single_button( | |
247 | new moodle_url('/badges/award.php', array('id' => $badge->id)), | |
248 | get_string('award', 'badges'), 'POST', array('class' => 'activatebadge')); | |
249 | } | |
27806552 YB |
250 | } |
251 | ||
d363a5c2 TT |
252 | $display .= self::print_badge_endorsement($badge); |
253 | $display .= self::print_badge_related($badge); | |
e8bfd9b4 | 254 | $display .= self::print_badge_alignments($badge); |
d363a5c2 | 255 | |
cd243d94 | 256 | return html_writer::div($display, null, array('id' => 'badge-overview')); |
27806552 YB |
257 | } |
258 | ||
259 | // Prints action icons for the badge. | |
260 | public function print_badge_table_actions($badge, $context) { | |
261 | $actions = ""; | |
262 | ||
4d7d17dd | 263 | if (has_capability('moodle/badges:configuredetails', $context) && $badge->has_criteria()) { |
27806552 YB |
264 | // Activate/deactivate badge. |
265 | if ($badge->status == BADGE_STATUS_INACTIVE || $badge->status == BADGE_STATUS_INACTIVE_LOCKED) { | |
4d7d17dd YB |
266 | // "Activate" will go to another page and ask for confirmation. |
267 | $url = new moodle_url('/badges/action.php'); | |
268 | $url->param('id', $badge->id); | |
269 | $url->param('activate', true); | |
c5177654 | 270 | $url->param('sesskey', sesskey()); |
4d7d17dd YB |
271 | $return = new moodle_url(qualified_me()); |
272 | $url->param('return', $return->out_as_local_url(false)); | |
27806552 YB |
273 | $actions .= $this->output->action_icon($url, new pix_icon('t/show', get_string('activate', 'badges'))) . " "; |
274 | } else { | |
275 | $url = new moodle_url(qualified_me()); | |
276 | $url->param('lock', $badge->id); | |
277 | $url->param('sesskey', sesskey()); | |
278 | $actions .= $this->output->action_icon($url, new pix_icon('t/hide', get_string('deactivate', 'badges'))) . " "; | |
279 | } | |
280 | } | |
281 | ||
282 | // Award badge manually. | |
283 | if ($badge->has_manual_award_criteria() && | |
284 | has_capability('moodle/badges:awardbadge', $context) && | |
285 | $badge->is_active()) { | |
286 | $url = new moodle_url('/badges/award.php', array('id' => $badge->id)); | |
287 | $actions .= $this->output->action_icon($url, new pix_icon('t/award', get_string('award', 'badges'))) . " "; | |
288 | } | |
289 | ||
290 | // Edit badge. | |
291 | if (has_capability('moodle/badges:configuredetails', $context)) { | |
aae219ac | 292 | $url = new moodle_url('/badges/edit.php', array('id' => $badge->id, 'action' => 'badge')); |
27806552 YB |
293 | $actions .= $this->output->action_icon($url, new pix_icon('t/edit', get_string('edit'))) . " "; |
294 | } | |
295 | ||
296 | // Duplicate badge. | |
297 | if (has_capability('moodle/badges:createbadge', $context)) { | |
298 | $url = new moodle_url('/badges/action.php', array('copy' => '1', 'id' => $badge->id, 'sesskey' => sesskey())); | |
299 | $actions .= $this->output->action_icon($url, new pix_icon('t/copy', get_string('copy'))) . " "; | |
300 | } | |
301 | ||
302 | // Delete badge. | |
303 | if (has_capability('moodle/badges:deletebadge', $context)) { | |
304 | $url = new moodle_url(qualified_me()); | |
305 | $url->param('delete', $badge->id); | |
306 | $actions .= $this->output->action_icon($url, new pix_icon('t/delete', get_string('delete'))) . " "; | |
307 | } | |
308 | ||
309 | return $actions; | |
310 | } | |
311 | ||
1837b1d5 DW |
312 | /** |
313 | * Render an issued badge. | |
314 | * | |
315 | * @param \core_badges\output\issued_badge $ibadge | |
316 | * @return string | |
317 | */ | |
aae219ac | 318 | protected function render_issued_badge(\core_badges\output\issued_badge $ibadge) { |
762b2a6b | 319 | global $USER, $CFG, $DB, $SITE; |
27806552 | 320 | $issued = $ibadge->issued; |
737a352f | 321 | $userinfo = $ibadge->recipient; |
853e506a | 322 | $badgeclass = $ibadge->badgeclass; |
27806552 | 323 | $badge = new badge($ibadge->badgeid); |
853e506a | 324 | $now = time(); |
5b4204a5 SA |
325 | if (isset($issued['expires'])) { |
326 | if (!is_numeric($issued['expires'])) { | |
327 | $issued['expires'] = strtotime($issued['expires']); | |
328 | } | |
329 | $expiration = $issued['expires']; | |
330 | } else { | |
331 | $expiration = $now + 86400; | |
332 | } | |
333 | ||
d363a5c2 TT |
334 | $badgeimage = is_array($badgeclass['image']) ? $badgeclass['image']['id'] : $badgeclass['image']; |
335 | $languages = get_string_manager()->get_list_of_languages(); | |
27806552 | 336 | |
cd243d94 Y |
337 | $output = ''; |
338 | $output .= html_writer::start_tag('div', array('id' => 'badge')); | |
339 | $output .= html_writer::start_tag('div', array('id' => 'badge-image')); | |
7444ba74 | 340 | $output .= html_writer::empty_tag('img', array('src' => $badgeimage, 'alt' => $badge->name, 'width' => '100')); |
cd243d94 Y |
341 | if ($expiration < $now) { |
342 | $output .= $this->output->pix_icon('i/expired', | |
343 | get_string('expireddate', 'badges', userdate($issued['expires'])), | |
344 | 'moodle', | |
345 | array('class' => 'expireimage')); | |
346 | } | |
27806552 | 347 | |
737a352f | 348 | if ($USER->id == $userinfo->id && !empty($CFG->enablebadges)) { |
cd243d94 | 349 | $output .= $this->output->single_button( |
d03d1109 | 350 | new moodle_url('/badges/badge.php', array('hash' => $ibadge->hash, 'bake' => true)), |
e2805314 | 351 | get_string('download'), |
cd243d94 | 352 | 'POST'); |
d3af9592 PD |
353 | if (!empty($CFG->badges_allowexternalbackpack) && ($expiration > $now) |
354 | && $userbackpack = badges_get_user_backpack($USER->id)) { | |
aae219ac | 355 | |
d3af9592 | 356 | if (badges_open_badges_backpack_api($userbackpack->id) == OPEN_BADGES_V1) { |
d03d1109 | 357 | $assertion = new moodle_url('/badges/assertion.php', array('b' => $ibadge->hash)); |
aae219ac DW |
358 | $action = new component_action('click', 'addtobackpack', array('assertion' => $assertion->out(false))); |
359 | $attributes = array( | |
360 | 'type' => 'button', | |
361 | 'class' => 'btn btn-secondary m-1', | |
362 | 'id' => 'addbutton', | |
363 | 'value' => get_string('addtobackpack', 'badges')); | |
364 | $tobackpack = html_writer::tag('input', '', $attributes); | |
365 | $this->output->add_action_handler($action, 'addbutton'); | |
366 | $output .= $tobackpack; | |
367 | } else { | |
d3af9592 | 368 | if (badges_open_badges_backpack_api($userbackpack->id) == OPEN_BADGES_V2P1) { |
15a00bea TT |
369 | $assertion = new moodle_url('/badges/backpack-export.php', array('hash' => $ibadge->hash)); |
370 | } else { | |
371 | $assertion = new moodle_url('/badges/backpack-add.php', array('hash' => $ibadge->hash)); | |
372 | } | |
aae219ac DW |
373 | $attributes = ['class' => 'btn btn-secondary m-1', 'role' => 'button']; |
374 | $tobackpack = html_writer::link($assertion, get_string('addtobackpack', 'badges'), $attributes); | |
375 | $output .= $tobackpack; | |
376 | } | |
27806552 | 377 | } |
e2805314 | 378 | } |
cd243d94 | 379 | $output .= html_writer::end_tag('div'); |
737a352f | 380 | |
cd243d94 | 381 | $output .= html_writer::start_tag('div', array('id' => 'badge-details')); |
737a352f | 382 | // Recipient information. |
cd243d94 Y |
383 | $output .= $this->output->heading(get_string('recipientdetails', 'badges'), 3); |
384 | $dl = array(); | |
762b2a6b YB |
385 | if ($userinfo->deleted) { |
386 | $strdata = new stdClass(); | |
387 | $strdata->user = fullname($userinfo); | |
388 | $strdata->site = format_string($SITE->fullname, true, array('context' => context_system::instance())); | |
cd243d94 Y |
389 | |
390 | $dl[get_string('name')] = get_string('error:userdeleted', 'badges', $strdata); | |
737a352f | 391 | } else { |
cd243d94 | 392 | $dl[get_string('name')] = fullname($userinfo); |
737a352f | 393 | } |
cd243d94 | 394 | $output .= $this->definition_list($dl); |
737a352f | 395 | |
cd243d94 Y |
396 | $output .= $this->output->heading(get_string('issuerdetails', 'badges'), 3); |
397 | $dl = array(); | |
398 | $dl[get_string('issuername', 'badges')] = $badge->issuername; | |
e2805314 | 399 | if (isset($badge->issuercontact) && !empty($badge->issuercontact)) { |
cd243d94 | 400 | $dl[get_string('contact', 'badges')] = obfuscate_mailto($badge->issuercontact); |
e2805314 | 401 | } |
cd243d94 Y |
402 | $output .= $this->definition_list($dl); |
403 | ||
404 | $output .= $this->output->heading(get_string('badgedetails', 'badges'), 3); | |
405 | $dl = array(); | |
406 | $dl[get_string('name')] = $badge->name; | |
674c00ed AG |
407 | if (!empty($badge->version)) { |
408 | $dl[get_string('version', 'badges')] = $badge->version; | |
409 | } | |
706c8d19 SA |
410 | if (!empty($badge->language)) { |
411 | $dl[get_string('language')] = $languages[$badge->language]; | |
412 | } | |
cd243d94 | 413 | $dl[get_string('description', 'badges')] = $badge->description; |
674c00ed AG |
414 | if (!empty($badge->imageauthorname)) { |
415 | $dl[get_string('imageauthorname', 'badges')] = $badge->imageauthorname; | |
416 | } | |
417 | if (!empty($badge->imageauthoremail)) { | |
418 | $dl[get_string('imageauthoremail', 'badges')] = | |
419 | html_writer::tag('a', $badge->imageauthoremail, array('href' => 'mailto:' . $badge->imageauthoremail)); | |
420 | } | |
421 | if (!empty($badge->imageauthorurl)) { | |
422 | $dl[get_string('imageauthorurl', 'badges')] = | |
423 | html_writer::link($badge->imageauthorurl, $badge->imageauthorurl, array('target' => '_blank')); | |
424 | } | |
425 | if (!empty($badge->imagecaption)) { | |
426 | $dl[get_string('imagecaption', 'badges')] = $badge->imagecaption; | |
427 | } | |
27806552 | 428 | |
e2805314 YB |
429 | if ($badge->type == BADGE_TYPE_COURSE && isset($badge->courseid)) { |
430 | $coursename = $DB->get_field('course', 'fullname', array('id' => $badge->courseid)); | |
cd243d94 | 431 | $dl[get_string('course')] = $coursename; |
e2805314 | 432 | } |
cd243d94 Y |
433 | $dl[get_string('bcriteria', 'badges')] = self::print_badge_criteria($badge); |
434 | $output .= $this->definition_list($dl); | |
27806552 | 435 | |
cd243d94 Y |
436 | $output .= $this->output->heading(get_string('issuancedetails', 'badges'), 3); |
437 | $dl = array(); | |
39f4caf3 SA |
438 | if (!is_numeric($issued['issuedOn'])) { |
439 | $issued['issuedOn'] = strtotime($issued['issuedOn']); | |
440 | } | |
cd243d94 | 441 | $dl[get_string('dateawarded', 'badges')] = userdate($issued['issuedOn']); |
e2805314 | 442 | if (isset($issued['expires'])) { |
853e506a | 443 | if ($issued['expires'] < $now) { |
cd243d94 | 444 | $dl[get_string('expirydate', 'badges')] = userdate($issued['expires']) . get_string('warnexpired', 'badges'); |
e2805314 | 445 | |
e2805314 | 446 | } else { |
cd243d94 | 447 | $dl[get_string('expirydate', 'badges')] = userdate($issued['expires']); |
27806552 | 448 | } |
e2805314 | 449 | } |
27806552 | 450 | |
e2805314 YB |
451 | // Print evidence. |
452 | $agg = $badge->get_aggregation_methods(); | |
737a352f | 453 | $evidence = $badge->get_criteria_completions($userinfo->id); |
484b43f4 MG |
454 | $eids = array_map(function($o) { |
455 | return $o->critid; | |
456 | }, $evidence); | |
e2805314 YB |
457 | unset($badge->criteria[BADGE_CRITERIA_TYPE_OVERALL]); |
458 | ||
459 | $items = array(); | |
460 | foreach ($badge->criteria as $type => $c) { | |
461 | if (in_array($c->id, $eids)) { | |
462 | if (count($c->params) == 1) { | |
463 | $items[] = get_string('criteria_descr_single_' . $type , 'badges') . $c->get_details(); | |
464 | } else { | |
465 | $items[] = get_string('criteria_descr_' . $type , 'badges', | |
ae17e383 | 466 | core_text::strtoupper($agg[$badge->get_aggregation_method($type)])) . $c->get_details(); |
27806552 YB |
467 | } |
468 | } | |
e2805314 | 469 | } |
27806552 | 470 | |
cd243d94 Y |
471 | $dl[get_string('evidence', 'badges')] = get_string('completioninfo', 'badges') . html_writer::alist($items, array(), 'ul'); |
472 | $output .= $this->definition_list($dl); | |
c693beb3 AG |
473 | $endorsement = $badge->get_endorsement(); |
474 | if (!empty($endorsement)) { | |
475 | $output .= self::print_badge_endorsement($badge); | |
476 | } | |
263a5833 DW |
477 | |
478 | $relatedbadges = $badge->get_related_badges(true); | |
479 | $items = array(); | |
480 | foreach ($relatedbadges as $related) { | |
481 | $relatedurl = new moodle_url('/badges/overview.php', array('id' => $related->id)); | |
482 | $items[] = html_writer::link($relatedurl->out(), $related->name, array('target' => '_blank')); | |
483 | } | |
484 | if (!empty($items)) { | |
c693beb3 | 485 | $output .= $this->heading(get_string('relatedbages', 'badges'), 3); |
d363a5c2 | 486 | $output .= html_writer::alist($items, array(), 'ul'); |
d363a5c2 | 487 | } |
263a5833 | 488 | |
e8bfd9b4 DW |
489 | $alignments = $badge->get_alignments(); |
490 | if (!empty($alignments)) { | |
c693beb3 | 491 | $output .= $this->heading(get_string('alignment', 'badges'), 3); |
d363a5c2 | 492 | $items = array(); |
e8bfd9b4 DW |
493 | foreach ($alignments as $alignment) { |
494 | $items[] = html_writer::link($alignment->targeturl, $alignment->targetname, array('target' => '_blank')); | |
d363a5c2 TT |
495 | } |
496 | $output .= html_writer::alist($items, array(), 'ul'); | |
d363a5c2 | 497 | } |
cd243d94 | 498 | $output .= html_writer::end_tag('div'); |
27806552 | 499 | |
cd243d94 | 500 | return $output; |
27806552 YB |
501 | } |
502 | ||
1837b1d5 DW |
503 | /** |
504 | * Render an external badge. | |
505 | * | |
506 | * @param \core_badges\output\external_badge $ibadge | |
507 | * @return string | |
508 | */ | |
aae219ac | 509 | protected function render_external_badge(\core_badges\output\external_badge $ibadge) { |
27806552 YB |
510 | $issued = $ibadge->issued; |
511 | $assertion = $issued->assertion; | |
512 | $issuer = $assertion->badge->issuer; | |
737a352f | 513 | $userinfo = $ibadge->recipient; |
27806552 | 514 | $table = new html_table(); |
ea76b652 | 515 | $today = strtotime(date('Y-m-d')); |
27806552 | 516 | |
cd243d94 Y |
517 | $output = ''; |
518 | $output .= html_writer::start_tag('div', array('id' => 'badge')); | |
519 | $output .= html_writer::start_tag('div', array('id' => 'badge-image')); | |
aae219ac DW |
520 | if (isset($issued->imageUrl)) { |
521 | $issued->image = $issued->imageUrl; | |
522 | } | |
7444ba74 | 523 | $output .= html_writer::empty_tag('img', array('src' => $issued->image, 'width' => '100')); |
ea76b652 | 524 | if (isset($assertion->expires)) { |
39f4caf3 | 525 | $expiration = is_numeric($assertion->expires) ? $assertion->expires : strtotime($assertion->expires); |
ea76b652 YB |
526 | if ($expiration < $today) { |
527 | $output .= $this->output->pix_icon('i/expired', | |
528 | get_string('expireddate', 'badges', userdate($expiration)), | |
529 | 'moodle', | |
530 | array('class' => 'expireimage')); | |
531 | } | |
cd243d94 Y |
532 | } |
533 | $output .= html_writer::end_tag('div'); | |
27806552 | 534 | |
cd243d94 | 535 | $output .= html_writer::start_tag('div', array('id' => 'badge-details')); |
737a352f YB |
536 | |
537 | // Recipient information. | |
cd243d94 Y |
538 | $output .= $this->output->heading(get_string('recipientdetails', 'badges'), 3); |
539 | $dl = array(); | |
737a352f YB |
540 | // Technically, we should alway have a user at this point, but added an extra check just in case. |
541 | if ($userinfo) { | |
737a352f YB |
542 | if (!$ibadge->valid) { |
543 | $notify = $this->output->notification(get_string('recipientvalidationproblem', 'badges'), 'notifynotice'); | |
cd243d94 Y |
544 | $dl[get_string('name')] = fullname($userinfo) . $notify; |
545 | } else { | |
546 | $dl[get_string('name')] = fullname($userinfo); | |
737a352f YB |
547 | } |
548 | } else { | |
549 | $notify = $this->output->notification(get_string('recipientidentificationproblem', 'badges'), 'notifynotice'); | |
cd243d94 | 550 | $dl[get_string('name')] = $notify; |
737a352f | 551 | } |
cd243d94 Y |
552 | $output .= $this->definition_list($dl); |
553 | ||
554 | $output .= $this->output->heading(get_string('issuerdetails', 'badges'), 3); | |
555 | $dl = array(); | |
ea76b652 | 556 | $dl[get_string('issuername', 'badges')] = s($issuer->name); |
aae219ac DW |
557 | if (isset($issuer->origin)) { |
558 | $dl[get_string('issuerurl', 'badges')] = html_writer::tag('a', $issuer->origin, array('href' => $issuer->origin)); | |
559 | } | |
737a352f | 560 | |
27806552 | 561 | if (isset($issuer->contact)) { |
cd243d94 Y |
562 | $dl[get_string('contact', 'badges')] = obfuscate_mailto($issuer->contact); |
563 | } | |
564 | $output .= $this->definition_list($dl); | |
565 | ||
566 | $output .= $this->output->heading(get_string('badgedetails', 'badges'), 3); | |
567 | $dl = array(); | |
ea76b652 YB |
568 | $dl[get_string('name')] = s($assertion->badge->name); |
569 | $dl[get_string('description', 'badges')] = s($assertion->badge->description); | |
aae219ac DW |
570 | if (isset($assertion->badge->criteria)) { |
571 | $dl[get_string('bcriteria', 'badges')] = html_writer::tag( | |
572 | 'a', | |
573 | s($assertion->badge->criteria), | |
574 | array('href' => $assertion->badge->criteria) | |
575 | ); | |
576 | } | |
cd243d94 Y |
577 | $output .= $this->definition_list($dl); |
578 | ||
cd243d94 | 579 | $dl = array(); |
27806552 | 580 | if (isset($assertion->issued_on)) { |
39f4caf3 | 581 | $issuedate = is_numeric($assertion->issued_on) ? $assertion->issued_on : strtotime($assertion->issued_on); |
ea76b652 | 582 | $dl[get_string('dateawarded', 'badges')] = userdate($issuedate); |
27806552 | 583 | } |
ea76b652 | 584 | if (isset($assertion->expires)) { |
27806552 | 585 | if ($expiration < $today) { |
ea76b652 | 586 | $dl[get_string('expirydate', 'badges')] = userdate($expiration) . get_string('warnexpired', 'badges'); |
27806552 | 587 | } else { |
ea76b652 | 588 | $dl[get_string('expirydate', 'badges')] = userdate($expiration); |
27806552 YB |
589 | } |
590 | } | |
591 | if (isset($assertion->evidence)) { | |
aae219ac DW |
592 | $dl[get_string('evidence', 'badges')] = html_writer::tag( |
593 | 'a', | |
594 | s($assertion->evidence), | |
595 | array('href' => $assertion->evidence) | |
596 | ); | |
597 | } | |
598 | if (!empty($dl)) { | |
599 | $output .= $this->output->heading(get_string('issuancedetails', 'badges'), 3); | |
600 | $output .= $this->definition_list($dl); | |
27806552 | 601 | } |
cd243d94 | 602 | $output .= html_writer::end_tag('div'); |
27806552 | 603 | |
cd243d94 | 604 | return $output; |
27806552 YB |
605 | } |
606 | ||
1837b1d5 DW |
607 | /** |
608 | * Render a collection of user badges. | |
609 | * | |
610 | * @param \core_badges\output\badge_user_collection $badges | |
611 | * @return string | |
612 | */ | |
aae219ac | 613 | protected function render_badge_user_collection(\core_badges\output\badge_user_collection $badges) { |
1dcd0d34 | 614 | global $CFG, $USER, $SITE; |
e2805314 YB |
615 | $backpack = $badges->backpack; |
616 | $mybackpack = new moodle_url('/badges/mybackpack.php'); | |
617 | ||
27806552 YB |
618 | $paging = new paging_bar($badges->totalcount, $badges->page, $badges->perpage, $this->page->url, 'page'); |
619 | $htmlpagingbar = $this->render($paging); | |
620 | ||
e2805314 YB |
621 | // Set backpack connection string. |
622 | $backpackconnect = ''; | |
623 | if (!empty($CFG->badges_allowexternalbackpack) && is_null($backpack)) { | |
624 | $backpackconnect = $this->output->box(get_string('localconnectto', 'badges', $mybackpack->out()), 'noticebox'); | |
625 | } | |
27806552 YB |
626 | // Search box. |
627 | $searchform = $this->output->box($this->helper_search_form($badges->search), 'boxwidthwide boxaligncenter'); | |
628 | ||
629 | // Download all button. | |
aae219ac | 630 | $actionhtml = $this->output->single_button( |
27806552 YB |
631 | new moodle_url('/badges/mybadges.php', array('downloadall' => true, 'sesskey' => sesskey())), |
632 | get_string('downloadall'), 'POST', array('class' => 'activatebadge')); | |
aae219ac DW |
633 | $downloadall = $this->output->box('', 'col-md-3'); |
634 | $downloadall .= $this->output->box($actionhtml, 'col-md-9'); | |
4394f9e3 | 635 | $downloadall = $this->output->box($downloadall, 'row ml-5'); |
27806552 YB |
636 | |
637 | // Local badges. | |
508e756e | 638 | $localhtml = html_writer::start_tag('div', array('id' => 'issued-badge-table', 'class' => 'generalbox')); |
aae219ac DW |
639 | $sitename = format_string($SITE->fullname, true, array('context' => context_system::instance())); |
640 | $heading = get_string('localbadges', 'badges', $sitename); | |
508e756e | 641 | $localhtml .= $this->output->heading_with_help($heading, 'localbadgesh', 'badges'); |
27806552 | 642 | if ($badges->badges) { |
aae219ac | 643 | $countmessage = $this->output->box(get_string('badgesearned', 'badges', $badges->totalcount)); |
27806552 YB |
644 | |
645 | $htmllist = $this->print_badges_list($badges->badges, $USER->id); | |
1837b1d5 DW |
646 | $localhtml .= $backpackconnect . $countmessage . $searchform; |
647 | $localhtml .= $htmlpagingbar . $htmllist . $htmlpagingbar . $downloadall; | |
27806552 YB |
648 | } else { |
649 | $localhtml .= $searchform . $this->output->notification(get_string('nobadges', 'badges')); | |
650 | } | |
508e756e | 651 | $localhtml .= html_writer::end_tag('div'); |
27806552 YB |
652 | |
653 | // External badges. | |
27806552 | 654 | $externalhtml = ""; |
60d72efb | 655 | if (!empty($CFG->badges_allowexternalbackpack)) { |
508e756e BB |
656 | $externalhtml .= html_writer::start_tag('div', array('class' => 'generalbox')); |
657 | $externalhtml .= $this->output->heading_with_help(get_string('externalbadges', 'badges'), 'externalbadges', 'badges'); | |
27806552 | 658 | if (!is_null($backpack)) { |
e2805314 | 659 | if ($backpack->totalcollections == 0) { |
aae219ac | 660 | $externalhtml .= get_string('nobackpackcollectionssummary', 'badges', $backpack); |
27806552 | 661 | } else { |
e2805314 | 662 | if ($backpack->totalbadges == 0) { |
aae219ac | 663 | $externalhtml .= get_string('nobackpackbadgessummary', 'badges', $backpack); |
e2805314 | 664 | } else { |
aae219ac | 665 | $externalhtml .= get_string('backpackbadgessummary', 'badges', $backpack); |
e2805314 YB |
666 | $externalhtml .= '<br/><br/>' . $this->print_badges_list($backpack->badges, $USER->id, true, true); |
667 | } | |
27806552 | 668 | } |
27806552 | 669 | } else { |
e2805314 | 670 | $externalhtml .= get_string('externalconnectto', 'badges', $mybackpack->out()); |
27806552 | 671 | } |
27806552 | 672 | |
508e756e | 673 | $externalhtml .= html_writer::end_tag('div'); |
aae219ac DW |
674 | $attr = ['class' => 'btn btn-secondary']; |
675 | $label = get_string('backpackbadgessettings', 'badges'); | |
676 | $backpacksettings = html_writer::link(new moodle_url('/badges/mybackpack.php'), $label, $attr); | |
677 | $actionshtml = $this->output->box('', 'col-md-3'); | |
678 | $actionshtml .= $this->output->box($backpacksettings, 'col-md-9'); | |
4394f9e3 | 679 | $actionshtml = $this->output->box($actionshtml, 'row ml-5'); |
aae219ac | 680 | $externalhtml .= $actionshtml; |
27806552 YB |
681 | } |
682 | ||
683 | return $localhtml . $externalhtml; | |
684 | } | |
685 | ||
1837b1d5 DW |
686 | /** |
687 | * Render a collection of badges. | |
688 | * | |
689 | * @param \core_badges\output\badge_collection $badges | |
690 | * @return string | |
691 | */ | |
aae219ac | 692 | protected function render_badge_collection(\core_badges\output\badge_collection $badges) { |
27806552 YB |
693 | $paging = new paging_bar($badges->totalcount, $badges->page, $badges->perpage, $this->page->url, 'page'); |
694 | $htmlpagingbar = $this->render($paging); | |
695 | $table = new html_table(); | |
6c4dbbf0 | 696 | $table->attributes['class'] = 'table table-bordered table-striped'; |
27806552 YB |
697 | |
698 | $sortbyname = $this->helper_sortable_heading(get_string('name'), | |
699 | 'name', $badges->sort, $badges->dir); | |
700 | $sortbyawarded = $this->helper_sortable_heading(get_string('awardedtoyou', 'badges'), | |
701 | 'dateissued', $badges->sort, $badges->dir); | |
702 | $table->head = array( | |
703 | get_string('badgeimage', 'badges'), | |
704 | $sortbyname, | |
705 | get_string('description', 'badges'), | |
706 | get_string('bcriteria', 'badges'), | |
707 | $sortbyawarded | |
708 | ); | |
709 | $table->colclasses = array('badgeimage', 'name', 'description', 'criteria', 'awards'); | |
710 | ||
711 | foreach ($badges->badges as $badge) { | |
712 | $badgeimage = print_badge_image($badge, $this->page->context, 'large'); | |
713 | $name = $badge->name; | |
714 | $description = $badge->description; | |
715 | $criteria = self::print_badge_criteria($badge); | |
716 | if ($badge->dateissued) { | |
a8dd22a7 | 717 | $icon = new pix_icon('i/valid', |
27806552 YB |
718 | get_string('dateearned', 'badges', |
719 | userdate($badge->dateissued, get_string('strftimedatefullshort', 'core_langconfig')))); | |
720 | $badgeurl = new moodle_url('/badges/badge.php', array('hash' => $badge->uniquehash)); | |
721 | $awarded = $this->output->action_icon($badgeurl, $icon, null, null, true); | |
722 | } else { | |
723 | $awarded = ""; | |
724 | } | |
725 | $row = array($badgeimage, $name, $description, $criteria, $awarded); | |
726 | $table->data[] = $row; | |
727 | } | |
728 | ||
729 | $htmltable = html_writer::table($table); | |
730 | ||
731 | return $htmlpagingbar . $htmltable . $htmlpagingbar; | |
732 | } | |
733 | ||
1837b1d5 DW |
734 | /** |
735 | * Render a table of badges. | |
736 | * | |
737 | * @param \core_badges\output\badge_management $badges | |
738 | * @return string | |
739 | */ | |
aae219ac | 740 | protected function render_badge_management(\core_badges\output\badge_management $badges) { |
27806552 YB |
741 | $paging = new paging_bar($badges->totalcount, $badges->page, $badges->perpage, $this->page->url, 'page'); |
742 | ||
743 | // New badge button. | |
19a9f2ea YB |
744 | $htmlnew = ''; |
745 | if (has_capability('moodle/badges:createbadge', $this->page->context)) { | |
746 | $n['type'] = $this->page->url->get_param('type'); | |
747 | $n['id'] = $this->page->url->get_param('id'); | |
1837b1d5 | 748 | $btn = $this->output->single_button(new moodle_url('newbadge.php', $n), get_string('newbadge', 'badges')); |
aae219ac | 749 | $htmlnew = $this->output->box($btn); |
19a9f2ea | 750 | } |
27806552 YB |
751 | |
752 | $htmlpagingbar = $this->render($paging); | |
753 | $table = new html_table(); | |
6c4dbbf0 | 754 | $table->attributes['class'] = 'table table-bordered table-striped'; |
27806552 YB |
755 | |
756 | $sortbyname = $this->helper_sortable_heading(get_string('name'), | |
757 | 'name', $badges->sort, $badges->dir); | |
758 | $sortbystatus = $this->helper_sortable_heading(get_string('status', 'badges'), | |
759 | 'status', $badges->sort, $badges->dir); | |
760 | $table->head = array( | |
761 | $sortbyname, | |
762 | $sortbystatus, | |
763 | get_string('bcriteria', 'badges'), | |
764 | get_string('awards', 'badges'), | |
765 | get_string('actions') | |
766 | ); | |
767 | $table->colclasses = array('name', 'status', 'criteria', 'awards', 'actions'); | |
768 | ||
769 | foreach ($badges->badges as $b) { | |
770 | $style = !$b->is_active() ? array('class' => 'dimmed') : array(); | |
771 | $forlink = print_badge_image($b, $this->page->context) . ' ' . | |
772 | html_writer::start_tag('span') . $b->name . html_writer::end_tag('span'); | |
773 | $name = html_writer::link(new moodle_url('/badges/overview.php', array('id' => $b->id)), $forlink, $style); | |
774 | $status = $b->statstring; | |
775 | $criteria = self::print_badge_criteria($b, 'short'); | |
776 | ||
777 | if (has_capability('moodle/badges:viewawarded', $this->page->context)) { | |
778 | $awards = html_writer::link(new moodle_url('/badges/recipients.php', array('id' => $b->id)), $b->awards); | |
779 | } else { | |
780 | $awards = $b->awards; | |
781 | } | |
782 | ||
783 | $actions = self::print_badge_table_actions($b, $this->page->context); | |
784 | ||
785 | $row = array($name, $status, $criteria, $awards, $actions); | |
786 | $table->data[] = $row; | |
787 | } | |
788 | $htmltable = html_writer::table($table); | |
789 | ||
790 | return $htmlnew . $htmlpagingbar . $htmltable . $htmlpagingbar; | |
791 | } | |
792 | ||
1837b1d5 DW |
793 | /** |
794 | * Prints tabs for badge editing. | |
795 | * | |
796 | * @param integer $badgeid The badgeid to edit. | |
797 | * @param context $context The current context. | |
798 | * @param string $current The currently selected tab. | |
799 | * @return string | |
800 | */ | |
27806552 YB |
801 | public function print_badge_tabs($badgeid, $context, $current = 'overview') { |
802 | global $DB; | |
803 | ||
d363a5c2 | 804 | $badge = new badge($badgeid); |
a5f82c5b | 805 | $row = array(); |
27806552 YB |
806 | |
807 | $row[] = new tabobject('overview', | |
808 | new moodle_url('/badges/overview.php', array('id' => $badgeid)), | |
809 | get_string('boverview', 'badges') | |
810 | ); | |
811 | ||
812 | if (has_capability('moodle/badges:configuredetails', $context)) { | |
9ca1707f | 813 | $row[] = new tabobject('badge', |
aae219ac | 814 | new moodle_url('/badges/edit.php', array('id' => $badgeid, 'action' => 'badge')), |
27806552 YB |
815 | get_string('bdetails', 'badges') |
816 | ); | |
817 | } | |
818 | ||
819 | if (has_capability('moodle/badges:configurecriteria', $context)) { | |
820 | $row[] = new tabobject('criteria', | |
821 | new moodle_url('/badges/criteria.php', array('id' => $badgeid)), | |
822 | get_string('bcriteria', 'badges') | |
823 | ); | |
824 | } | |
825 | ||
826 | if (has_capability('moodle/badges:configuremessages', $context)) { | |
827 | $row[] = new tabobject('message', | |
828 | new moodle_url('/badges/edit.php', array('id' => $badgeid, 'action' => 'message')), | |
829 | get_string('bmessage', 'badges') | |
830 | ); | |
831 | } | |
832 | ||
833 | if (has_capability('moodle/badges:viewawarded', $context)) { | |
7f964cfd YB |
834 | $awarded = $DB->count_records_sql('SELECT COUNT(b.userid) |
835 | FROM {badge_issued} b INNER JOIN {user} u ON b.userid = u.id | |
836 | WHERE b.badgeid = :badgeid AND u.deleted = 0', array('badgeid' => $badgeid)); | |
27806552 YB |
837 | $row[] = new tabobject('awards', |
838 | new moodle_url('/badges/recipients.php', array('id' => $badgeid)), | |
839 | get_string('bawards', 'badges', $awarded) | |
840 | ); | |
841 | } | |
842 | ||
d363a5c2 TT |
843 | if (has_capability('moodle/badges:configuredetails', $context)) { |
844 | $row[] = new tabobject('bendorsement', | |
845 | new moodle_url('/badges/endorsement.php', array('id' => $badgeid)), | |
846 | get_string('bendorsement', 'badges') | |
847 | ); | |
848 | } | |
849 | ||
850 | if (has_capability('moodle/badges:configuredetails', $context)) { | |
c6607726 JD |
851 | $sql = "SELECT COUNT(br.badgeid) |
852 | FROM {badge_related} br | |
853 | WHERE (br.badgeid = :badgeid OR br.relatedbadgeid = :badgeid2)"; | |
854 | $related = $DB->count_records_sql($sql, ['badgeid' => $badgeid, 'badgeid2' => $badgeid]); | |
d363a5c2 TT |
855 | $row[] = new tabobject('brelated', |
856 | new moodle_url('/badges/related.php', array('id' => $badgeid)), | |
857 | get_string('brelated', 'badges', $related) | |
858 | ); | |
859 | } | |
860 | ||
861 | if (has_capability('moodle/badges:configuredetails', $context)) { | |
e8bfd9b4 DW |
862 | $alignments = $DB->count_records_sql("SELECT COUNT(bc.id) |
863 | FROM {badge_alignment} bc WHERE bc.badgeid = :badgeid", array('badgeid' => $badgeid)); | |
9ca1707f | 864 | $row[] = new tabobject('alignment', |
e8bfd9b4 DW |
865 | new moodle_url('/badges/alignment.php', array('id' => $badgeid)), |
866 | get_string('balignment', 'badges', $alignments) | |
d363a5c2 TT |
867 | ); |
868 | } | |
869 | ||
a5f82c5b | 870 | echo $this->tabtree($row, $current); |
27806552 YB |
871 | } |
872 | ||
36388ba8 AD |
873 | /** |
874 | * Prints badge status box. | |
1837b1d5 DW |
875 | * |
876 | * @param badge $badge | |
36388ba8 AD |
877 | * @return Either the status box html as a string or null |
878 | */ | |
27806552 | 879 | public function print_badge_status_box(badge $badge) { |
27806552 | 880 | if (has_capability('moodle/badges:configurecriteria', $badge->get_context())) { |
36388ba8 | 881 | |
27806552 YB |
882 | if (!$badge->has_criteria()) { |
883 | $criteriaurl = new moodle_url('/badges/criteria.php', array('id' => $badge->id)); | |
884 | $status = get_string('nocriteria', 'badges'); | |
885 | if ($this->page->url != $criteriaurl) { | |
886 | $action = $this->output->single_button( | |
887 | $criteriaurl, | |
888 | get_string('addcriteria', 'badges'), 'POST', array('class' => 'activatebadge')); | |
889 | } else { | |
890 | $action = ''; | |
891 | } | |
cd243d94 Y |
892 | |
893 | $message = $status . $action; | |
27806552 YB |
894 | } else { |
895 | $status = get_string('statusmessage_' . $badge->status, 'badges'); | |
896 | if ($badge->is_active()) { | |
897 | $action = $this->output->single_button(new moodle_url('/badges/action.php', | |
898 | array('id' => $badge->id, 'lock' => 1, 'sesskey' => sesskey(), | |
899 | 'return' => $this->page->url->out_as_local_url(false))), | |
900 | get_string('deactivate', 'badges'), 'POST', array('class' => 'activatebadge')); | |
901 | } else { | |
902 | $action = $this->output->single_button(new moodle_url('/badges/action.php', | |
903 | array('id' => $badge->id, 'activate' => 1, 'sesskey' => sesskey(), | |
904 | 'return' => $this->page->url->out_as_local_url(false))), | |
905 | get_string('activate', 'badges'), 'POST', array('class' => 'activatebadge')); | |
906 | } | |
cd243d94 Y |
907 | |
908 | $message = $status . $this->output->help_icon('status', 'badges') . $action; | |
909 | ||
27806552 | 910 | } |
27806552 | 911 | |
36388ba8 | 912 | $style = $badge->is_active() ? 'generalbox statusbox active' : 'generalbox statusbox inactive'; |
cd243d94 | 913 | return $this->output->box($message, $style); |
36388ba8 | 914 | } |
27806552 | 915 | |
36388ba8 | 916 | return null; |
27806552 YB |
917 | } |
918 | ||
3784d3be YB |
919 | /** |
920 | * Returns information about badge criteria in a list form. | |
921 | * | |
922 | * @param badge $badge Badge objects | |
923 | * @param string $short Indicates whether to print full info about this badge | |
924 | * @return string $output HTML string to output | |
925 | */ | |
27806552 | 926 | public function print_badge_criteria(badge $badge, $short = '') { |
27806552 YB |
927 | $agg = $badge->get_aggregation_methods(); |
928 | if (empty($badge->criteria)) { | |
929 | return get_string('nocriteria', 'badges'); | |
3784d3be YB |
930 | } |
931 | ||
932 | $overalldescr = ''; | |
0b6ba27a Y |
933 | $overall = $badge->criteria[BADGE_CRITERIA_TYPE_OVERALL]; |
934 | if (!$short && !empty($overall->description)) { | |
935 | $overalldescr = $this->output->box( | |
fffeb03f | 936 | format_text($overall->description, $overall->descriptionformat, array('context' => $badge->get_context())), |
0b6ba27a Y |
937 | 'criteria-description' |
938 | ); | |
3784d3be | 939 | } |
0b6ba27a Y |
940 | |
941 | // Get the condition string. | |
3784d3be | 942 | if (count($badge->criteria) == 2) { |
0b6ba27a | 943 | $condition = ''; |
27806552 | 944 | if (!$short) { |
0b6ba27a | 945 | $condition = get_string('criteria_descr', 'badges'); |
27806552 YB |
946 | } |
947 | } else { | |
0b6ba27a | 948 | $condition = get_string('criteria_descr_' . $short . BADGE_CRITERIA_TYPE_OVERALL, 'badges', |
3784d3be | 949 | core_text::strtoupper($agg[$badge->get_aggregation_method()])); |
27806552 | 950 | } |
0b6ba27a | 951 | |
27806552 | 952 | unset($badge->criteria[BADGE_CRITERIA_TYPE_OVERALL]); |
0b6ba27a Y |
953 | |
954 | $items = array(); | |
955 | // If only one criterion left, make sure its description goe to the top. | |
956 | if (count($badge->criteria) == 1) { | |
957 | $c = reset($badge->criteria); | |
958 | if (!$short && !empty($c->description)) { | |
959 | $overalldescr = $this->output->box( | |
fffeb03f | 960 | format_text($c->description, $c->descriptionformat, array('context' => $badge->get_context())), |
0b6ba27a Y |
961 | 'criteria-description' |
962 | ); | |
3784d3be | 963 | } |
27806552 | 964 | if (count($c->params) == 1) { |
0b6ba27a | 965 | $items[] = get_string('criteria_descr_single_' . $short . $c->criteriatype , 'badges') . |
3784d3be | 966 | $c->get_details($short); |
27806552 | 967 | } else { |
0b6ba27a Y |
968 | $items[] = get_string('criteria_descr_' . $short . $c->criteriatype, 'badges', |
969 | core_text::strtoupper($agg[$badge->get_aggregation_method($c->criteriatype)])) . | |
970 | $c->get_details($short); | |
971 | } | |
972 | } else { | |
973 | foreach ($badge->criteria as $type => $c) { | |
974 | $criteriadescr = ''; | |
975 | if (!$short && !empty($c->description)) { | |
976 | $criteriadescr = $this->output->box( | |
fffeb03f | 977 | format_text($c->description, $c->descriptionformat, array('context' => $badge->get_context())), |
0b6ba27a Y |
978 | 'criteria-description' |
979 | ); | |
980 | } | |
981 | if (count($c->params) == 1) { | |
982 | $items[] = get_string('criteria_descr_single_' . $short . $type , 'badges') . | |
983 | $c->get_details($short) . $criteriadescr; | |
984 | } else { | |
985 | $items[] = get_string('criteria_descr_' . $short . $type , 'badges', | |
986 | core_text::strtoupper($agg[$badge->get_aggregation_method($type)])) . | |
987 | $c->get_details($short) . | |
988 | $criteriadescr; | |
989 | } | |
27806552 YB |
990 | } |
991 | } | |
0b6ba27a Y |
992 | |
993 | return $overalldescr . $condition . html_writer::alist($items, array(), 'ul');; | |
27806552 YB |
994 | } |
995 | ||
1837b1d5 DW |
996 | /** |
997 | * Prints criteria actions for badge editing. | |
998 | * | |
999 | * @param badge $badge | |
1000 | * @return string | |
1001 | */ | |
27806552 | 1002 | public function print_criteria_actions(badge $badge) { |
32bd11cb | 1003 | $output = ''; |
27806552 YB |
1004 | if (!$badge->is_active() && !$badge->is_locked()) { |
1005 | $accepted = $badge->get_accepted_criteria(); | |
1006 | $potential = array_diff($accepted, array_keys($badge->criteria)); | |
1007 | ||
1008 | if (!empty($potential)) { | |
1009 | foreach ($potential as $p) { | |
1010 | if ($p != 0) { | |
1011 | $select[$p] = get_string('criteria_' . $p, 'badges'); | |
1012 | } | |
1013 | } | |
32bd11cb BB |
1014 | $output .= $this->output->single_select( |
1015 | new moodle_url('/badges/criteria_settings.php', array('badgeid' => $badge->id, 'add' => true)), | |
1016 | 'type', | |
1017 | $select, | |
1018 | '', | |
1019 | array('' => 'choosedots'), | |
1020 | null, | |
1021 | array('label' => get_string('addbadgecriteria', 'badges')) | |
1022 | ); | |
27806552 | 1023 | } else { |
32bd11cb | 1024 | $output .= $this->output->box(get_string('nothingtoadd', 'badges'), 'clearfix'); |
27806552 YB |
1025 | } |
1026 | } | |
1027 | ||
32bd11cb | 1028 | return $output; |
27806552 YB |
1029 | } |
1030 | ||
1837b1d5 DW |
1031 | /** |
1032 | * Renders a table with users who have earned the badge. | |
1033 | * Based on stamps collection plugin. | |
1034 | * | |
1035 | * @param \core_badges\output\badge_recipients $recipients | |
1036 | * @return string | |
1037 | */ | |
aae219ac | 1038 | protected function render_badge_recipients(\core_badges\output\badge_recipients $recipients) { |
27806552 YB |
1039 | $paging = new paging_bar($recipients->totalcount, $recipients->page, $recipients->perpage, $this->page->url, 'page'); |
1040 | $htmlpagingbar = $this->render($paging); | |
1041 | $table = new html_table(); | |
f8ba185a | 1042 | $table->attributes['class'] = 'generaltable boxaligncenter boxwidthwide'; |
27806552 YB |
1043 | |
1044 | $sortbyfirstname = $this->helper_sortable_heading(get_string('firstname'), | |
1045 | 'firstname', $recipients->sort, $recipients->dir); | |
1046 | $sortbylastname = $this->helper_sortable_heading(get_string('lastname'), | |
1047 | 'lastname', $recipients->sort, $recipients->dir); | |
1048 | if ($this->helper_fullname_format() == 'lf') { | |
1049 | $sortbyname = $sortbylastname . ' / ' . $sortbyfirstname; | |
1050 | } else { | |
1051 | $sortbyname = $sortbyfirstname . ' / ' . $sortbylastname; | |
1052 | } | |
1053 | ||
1054 | $sortbydate = $this->helper_sortable_heading(get_string('dateawarded', 'badges'), | |
1055 | 'dateissued', $recipients->sort, $recipients->dir); | |
1056 | ||
1057 | $table->head = array($sortbyname, $sortbydate, ''); | |
1058 | ||
1059 | foreach ($recipients->userids as $holder) { | |
1060 | $fullname = fullname($holder); | |
1061 | $fullname = html_writer::link( | |
1062 | new moodle_url('/user/profile.php', array('id' => $holder->userid)), | |
1063 | $fullname | |
1064 | ); | |
1065 | $awarded = userdate($holder->dateissued); | |
1066 | $badgeurl = html_writer::link( | |
1067 | new moodle_url('/badges/badge.php', array('hash' => $holder->uniquehash)), | |
1068 | get_string('viewbadge', 'badges') | |
1069 | ); | |
1070 | ||
1071 | $row = array($fullname, $awarded, $badgeurl); | |
1072 | $table->data[] = $row; | |
1073 | } | |
1074 | ||
1075 | $htmltable = html_writer::table($table); | |
1076 | ||
1077 | return $htmlpagingbar . $htmltable . $htmlpagingbar; | |
1078 | } | |
1079 | ||
1080 | //////////////////////////////////////////////////////////////////////////// | |
1081 | // Helper methods | |
1082 | // Reused from stamps collection plugin | |
1083 | //////////////////////////////////////////////////////////////////////////// | |
1084 | ||
1085 | /** | |
1086 | * Renders a text with icons to sort by the given column | |
1087 | * | |
1088 | * This is intended for table headings. | |
1089 | * | |
1090 | * @param string $text The heading text | |
1091 | * @param string $sortid The column id used for sorting | |
1092 | * @param string $sortby Currently sorted by (column id) | |
1093 | * @param string $sorthow Currently sorted how (ASC|DESC) | |
1094 | * | |
1095 | * @return string | |
1096 | */ | |
1097 | protected function helper_sortable_heading($text, $sortid = null, $sortby = null, $sorthow = null) { | |
1098 | $out = html_writer::tag('span', $text, array('class' => 'text')); | |
1099 | ||
1100 | if (!is_null($sortid)) { | |
1101 | if ($sortby !== $sortid || $sorthow !== 'ASC') { | |
1102 | $url = new moodle_url($this->page->url); | |
1103 | $url->params(array('sort' => $sortid, 'dir' => 'ASC')); | |
1104 | $out .= $this->output->action_icon($url, | |
1105 | new pix_icon('t/sort_asc', get_string('sortbyx', 'core', s($text)), null, array('class' => 'iconsort'))); | |
1106 | } | |
1107 | if ($sortby !== $sortid || $sorthow !== 'DESC') { | |
1108 | $url = new moodle_url($this->page->url); | |
1109 | $url->params(array('sort' => $sortid, 'dir' => 'DESC')); | |
1110 | $out .= $this->output->action_icon($url, | |
1111 | new pix_icon('t/sort_desc', get_string('sortbyxreverse', 'core', s($text)), null, array('class' => 'iconsort'))); | |
1112 | } | |
1113 | } | |
1114 | return $out; | |
1115 | } | |
1116 | /** | |
1117 | * Tries to guess the fullname format set at the site | |
1118 | * | |
1119 | * @return string fl|lf | |
1120 | */ | |
1121 | protected function helper_fullname_format() { | |
1122 | $fake = new stdClass(); | |
1123 | $fake->lastname = 'LLLL'; | |
1124 | $fake->firstname = 'FFFF'; | |
1125 | $fullname = get_string('fullnamedisplay', '', $fake); | |
1126 | if (strpos($fullname, 'LLLL') < strpos($fullname, 'FFFF')) { | |
1127 | return 'lf'; | |
1128 | } else { | |
1129 | return 'fl'; | |
1130 | } | |
1131 | } | |
1132 | /** | |
1133 | * Renders a search form | |
1134 | * | |
1135 | * @param string $search Search string | |
1136 | * @return string HTML | |
1137 | */ | |
1138 | protected function helper_search_form($search) { | |
1139 | global $CFG; | |
1140 | require_once($CFG->libdir . '/formslib.php'); | |
1141 | ||
1142 | $mform = new MoodleQuickForm('searchform', 'POST', $this->page->url); | |
1143 | ||
1144 | $mform->addElement('hidden', 'sesskey', sesskey()); | |
1145 | ||
1146 | $el[] = $mform->createElement('text', 'search', get_string('search'), array('size' => 20)); | |
1147 | $mform->setDefault('search', $search); | |
1148 | $el[] = $mform->createElement('submit', 'submitsearch', get_string('search')); | |
1149 | $el[] = $mform->createElement('submit', 'clearsearch', get_string('clear')); | |
1150 | $mform->addGroup($el, 'searchgroup', get_string('searchname', 'badges'), ' ', false); | |
1151 | ||
1152 | ob_start(); | |
1153 | $mform->display(); | |
1154 | $out = ob_get_clean(); | |
1155 | ||
1156 | return $out; | |
1157 | } | |
cd243d94 Y |
1158 | |
1159 | /** | |
1160 | * Renders a definition list | |
1161 | * | |
1162 | * @param array $items the list of items to define | |
1163 | * @param array | |
1164 | */ | |
1165 | protected function definition_list(array $items, array $attributes = array()) { | |
1166 | $output = html_writer::start_tag('dl', $attributes); | |
1167 | foreach ($items as $label => $value) { | |
1168 | $output .= html_writer::tag('dt', $label); | |
1169 | $output .= html_writer::tag('dd', $value); | |
1170 | } | |
1171 | $output .= html_writer::end_tag('dl'); | |
1172 | return $output; | |
1173 | } | |
d363a5c2 TT |
1174 | |
1175 | /** | |
1176 | * Outputs list en badges. | |
1177 | * | |
1178 | * @param badge $badge Badge object. | |
1179 | * @return string $output content endorsement to output. | |
1180 | */ | |
1181 | protected function print_badge_endorsement(badge $badge) { | |
1182 | $output = ''; | |
1183 | $endorsement = $badge->get_endorsement(); | |
1184 | $dl = array(); | |
1185 | $output .= $this->heading(get_string('endorsement', 'badges'), 3); | |
1186 | if (!empty($endorsement)) { | |
1187 | $dl[get_string('issuername', 'badges')] = $endorsement->issuername; | |
65ffd0a3 PFO |
1188 | $dl[get_string('issueremail', 'badges')] = |
1189 | html_writer::tag('a', $endorsement->issueremail, array('href' => 'mailto:' . $endorsement->issueremail)); | |
d363a5c2 TT |
1190 | $dl[get_string('issuerurl', 'badges')] = html_writer::link($endorsement->issuerurl, $endorsement->issuerurl, |
1191 | array('target' => '_blank')); | |
750f1588 | 1192 | $dl[get_string('dateawarded', 'badges')] = userdate($endorsement->dateissued); |
d363a5c2 TT |
1193 | $dl[get_string('claimid', 'badges')] = html_writer::link($endorsement->claimid, $endorsement->claimid, |
1194 | array('target' => '_blank')); | |
1195 | $dl[get_string('claimcomment', 'badges')] = $endorsement->claimcomment; | |
1196 | $output .= $this->definition_list($dl); | |
1197 | } else { | |
1198 | $output .= get_string('noendorsement', 'badges'); | |
1199 | } | |
1200 | return $output; | |
1201 | } | |
1202 | ||
1203 | /** | |
1204 | * Print list badges related. | |
1205 | * | |
1206 | * @param badge $badge Badge objects. | |
1207 | * @return string $output List related badges to output. | |
1208 | */ | |
1209 | protected function print_badge_related(badge $badge) { | |
1210 | $output = ''; | |
1211 | $relatedbadges = $badge->get_related_badges(); | |
1212 | $output .= $this->heading(get_string('relatedbages', 'badges'), 3); | |
1213 | if (!empty($relatedbadges)) { | |
1214 | $items = array(); | |
1215 | foreach ($relatedbadges as $related) { | |
1216 | $relatedurl = new moodle_url('/badges/overview.php', array('id' => $related->id)); | |
1217 | $items[] = html_writer::link($relatedurl->out(), $related->name, array('target' => '_blank')); | |
1218 | } | |
1219 | $output .= html_writer::alist($items, array(), 'ul'); | |
1220 | } else { | |
1221 | $output .= get_string('norelated', 'badges'); | |
1222 | } | |
1223 | return $output; | |
1224 | } | |
1225 | ||
1226 | /** | |
e8bfd9b4 | 1227 | * Print list badge alignments. |
d363a5c2 TT |
1228 | * |
1229 | * @param badge $badge Badge objects. | |
e8bfd9b4 | 1230 | * @return string $output List alignments to output. |
d363a5c2 | 1231 | */ |
e8bfd9b4 | 1232 | protected function print_badge_alignments(badge $badge) { |
d363a5c2 TT |
1233 | $output = ''; |
1234 | $output .= $this->heading(get_string('alignment', 'badges'), 3); | |
e8bfd9b4 DW |
1235 | $alignments = $badge->get_alignments(); |
1236 | if (!empty($alignments)) { | |
d363a5c2 | 1237 | $items = array(); |
e8bfd9b4 DW |
1238 | foreach ($alignments as $alignment) { |
1239 | $urlaligment = new moodle_url('alignment.php', | |
1240 | array('id' => $badge->id, 'alignmentid' => $alignment->id) | |
d363a5c2 | 1241 | ); |
e8bfd9b4 | 1242 | $items[] = html_writer::link($urlaligment, $alignment->targetname, array('target' => '_blank')); |
d363a5c2 TT |
1243 | } |
1244 | $output .= html_writer::alist($items, array(), 'ul'); | |
1245 | } else { | |
1246 | $output .= get_string('noalignment', 'badges'); | |
1247 | } | |
1248 | return $output; | |
1249 | } | |
1250 | ||
1251 | /** | |
1252 | * Renders a table for related badges. | |
1253 | * | |
aae219ac | 1254 | * @param \core_badges\output\badge_related $related list related badges. |
d363a5c2 TT |
1255 | * @return string list related badges to output. |
1256 | */ | |
aae219ac | 1257 | protected function render_badge_related(\core_badges\output\badge_related $related) { |
d363a5c2 TT |
1258 | $currentbadge = new badge($related->currentbadgeid); |
1259 | $languages = get_string_manager()->get_list_of_languages(); | |
1260 | $paging = new paging_bar($related->totalcount, $related->page, $related->perpage, $this->page->url, 'page'); | |
1261 | $htmlpagingbar = $this->render($paging); | |
1262 | $table = new html_table(); | |
1263 | $table->attributes['class'] = 'generaltable boxaligncenter boxwidthwide'; | |
1264 | $table->head = array( | |
1265 | get_string('name'), | |
1266 | get_string('version', 'badges'), | |
1267 | get_string('language', 'badges'), | |
1268 | get_string('type', 'badges') | |
1269 | ); | |
1270 | if (!$currentbadge->is_active() && !$currentbadge->is_locked()) { | |
1271 | array_push($table->head, ''); | |
1272 | } | |
1273 | ||
1274 | foreach ($related->badges as $badge) { | |
1275 | $badgeobject = new badge($badge->id); | |
1276 | $style = array('title' => $badgeobject->name); | |
1277 | if (!$badgeobject->is_active()) { | |
1278 | $style['class'] = 'dimmed'; | |
1279 | } | |
1280 | $context = ($badgeobject->type == BADGE_TYPE_SITE) ? | |
1281 | context_system::instance() : context_course::instance($badgeobject->courseid); | |
1282 | $forlink = print_badge_image($badgeobject, $context) . ' ' . | |
1283 | html_writer::start_tag('span') . $badgeobject->name . html_writer::end_tag('span'); | |
1284 | $name = html_writer::link(new moodle_url('/badges/overview.php', array('id' => $badgeobject->id)), $forlink, $style); | |
1285 | ||
1286 | $row = array( | |
1287 | $name, | |
1288 | $badge->version, | |
1289 | $badge->language ? $languages[$badge->language] : '', | |
1290 | $badge->type == BADGE_TYPE_COURSE ? get_string('badgesview', 'badges') : get_string('sitebadges', 'badges') | |
1291 | ); | |
1292 | if (!$currentbadge->is_active() && !$currentbadge->is_locked()) { | |
1293 | $action = $this->output->action_icon( | |
1294 | new moodle_url('related_action.php', | |
1295 | array( | |
1296 | 'badgeid' => $related->currentbadgeid, | |
1297 | 'relatedid' => $badge->id, | |
1298 | 'action' => 'remove' | |
1299 | ) | |
1300 | ), new pix_icon('t/delete', get_string('delete'))); | |
1301 | $actions = html_writer::tag('div', $action, array('class' => 'badge-actions')); | |
1302 | array_push($row, $actions); | |
1303 | } | |
1304 | $table->data[] = $row; | |
1305 | } | |
1306 | $htmltable = html_writer::table($table); | |
1307 | ||
1308 | return $htmlpagingbar . $htmltable . $htmlpagingbar; | |
1309 | } | |
1310 | ||
1311 | /** | |
e8bfd9b4 | 1312 | * Renders a table with alignment. |
d363a5c2 | 1313 | * |
aae219ac | 1314 | * @param core_badges\output\badge_alignments $alignments List alignments. |
e8bfd9b4 | 1315 | * @return string List alignment to output. |
d363a5c2 | 1316 | */ |
aae219ac | 1317 | protected function render_badge_alignments(\core_badges\output\badge_alignments $alignments) { |
e8bfd9b4 DW |
1318 | $currentbadge = new badge($alignments->currentbadgeid); |
1319 | $paging = new paging_bar($alignments->totalcount, $alignments->page, $alignments->perpage, $this->page->url, 'page'); | |
d363a5c2 TT |
1320 | $htmlpagingbar = $this->render($paging); |
1321 | $table = new html_table(); | |
1322 | $table->attributes['class'] = 'generaltable boxaligncenter boxwidthwide'; | |
1323 | $table->head = array('Name', 'URL', ''); | |
1324 | ||
e8bfd9b4 DW |
1325 | foreach ($alignments->alignments as $item) { |
1326 | $urlaligment = new moodle_url('alignment.php', | |
d363a5c2 TT |
1327 | array( |
1328 | 'id' => $currentbadge->id, | |
1329 | 'alignmentid' => $item->id, | |
1330 | ) | |
1331 | ); | |
1332 | $row = array( | |
1333 | html_writer::link($urlaligment, $item->targetname), | |
1334 | html_writer::link($item->targeturl, $item->targeturl, array('target' => '_blank')) | |
1335 | ); | |
1336 | if (!$currentbadge->is_active() && !$currentbadge->is_locked()) { | |
1337 | $delete = $this->output->action_icon( | |
e8bfd9b4 | 1338 | new moodle_url('alignment_action.php', |
d363a5c2 TT |
1339 | array( |
1340 | 'id' => $currentbadge->id, | |
1341 | 'alignmentid' => $item->id, | |
1342 | 'action' => 'remove' | |
1343 | ) | |
1344 | ), new pix_icon('t/delete', get_string('delete'))); | |
1345 | $edit = $this->output->action_icon( | |
e8bfd9b4 | 1346 | new moodle_url('alignment.php', |
d363a5c2 TT |
1347 | array( |
1348 | 'id' => $currentbadge->id, | |
1349 | 'alignmentid' => $item->id, | |
1350 | 'action' => 'edit' | |
1351 | ) | |
1352 | ), new pix_icon('t/edit', get_string('edit'))); | |
1353 | $actions = html_writer::tag('div', $edit . $delete, array('class' => 'badge-actions')); | |
1354 | array_push($row, $actions); | |
1355 | } | |
1356 | $table->data[] = $row; | |
1357 | } | |
1358 | $htmltable = html_writer::table($table); | |
1359 | ||
1360 | return $htmlpagingbar . $htmltable . $htmlpagingbar; | |
1361 | } | |
737a352f | 1362 | |
27806552 | 1363 | /** |
aae219ac | 1364 | * Defer to template. |
27806552 | 1365 | * |
aae219ac DW |
1366 | * @param \core_badges\output\external_backpacks_page $page |
1367 | * @return bool|string | |
27806552 | 1368 | */ |
aae219ac DW |
1369 | public function render_external_backpacks_page(\core_badges\output\external_backpacks_page $page) { |
1370 | $data = $page->export_for_template($this); | |
1371 | return parent::render_from_template('core_badges/external_backpacks_page', $data); | |
27806552 | 1372 | } |
3e567085 SA |
1373 | |
1374 | /** | |
1375 | * Get the result of a backpack validation with its settings. It returns: | |
1376 | * - A informative message if the backpack version is different from OBv2. | |
1377 | * - A warning with the error if it's not possible to connect to this backpack. | |
1378 | * - A successful message if the connection has worked. | |
1379 | * | |
1380 | * @param int $backpackid The backpack identifier. | |
1381 | * @return string A message with the validation result. | |
1382 | */ | |
1383 | public function render_test_backpack_result(int $backpackid): string { | |
1384 | // Get the backpack. | |
1385 | $backpack = badges_get_site_backpack($backpackid); | |
1386 | ||
1387 | // Add the header to the result. | |
1388 | $result = $this->heading(get_string('testbackpack', 'badges', $backpack->backpackweburl)); | |
1389 | ||
1390 | if ($backpack->apiversion != OPEN_BADGES_V2) { | |
1391 | // Only OBv2 supports this validation. | |
1392 | $result .= get_string('backpackconnectionnottested', 'badges'); | |
1393 | } else { | |
1394 | $message = badges_verify_backpack($backpackid); | |
1395 | if (empty($message)) { | |
1396 | $result .= get_string('backpackconnectionok', 'badges'); | |
1397 | } else { | |
1398 | $result .= $message; | |
1399 | } | |
1400 | } | |
1401 | ||
1402 | return $result; | |
1403 | } | |
27806552 | 1404 | } |