Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.

declare(strict_types=1);

namespace core_badges\reportbuilder\local\entities;

use context_course;
use context_helper;
use context_system;
use html_writer;
use lang_string;
use moodle_url;
use stdClass;
use core_reportbuilder\local\entities\base;
use core_reportbuilder\local\filters\{select, text};
use core_reportbuilder\local\report\{column, filter};

defined('MOODLE_INTERNAL') or die;

global $CFG;
require_once("{$CFG->libdir}/badgeslib.php");

/**
 * Badge entity
 *
 * @package     core_badges
 * @copyright   2022 Paul Holden <paulh@moodle.com>
 * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
class badge extends base {

    /**
     * Database tables that this entity uses and their default aliases
     *
     * @return array
     */
    protected function get_default_table_aliases(): array {
        return [
            'badge' => 'b',
            'context' => 'bctx',
> 'tag_instance' => 'bti', ]; > 'tag' => 'bt',
} /** * The default title for this entity * * @return lang_string */ protected function get_default_entity_title(): lang_string { return new lang_string('badgedetails', 'core_badges'); } /** * Initialise the entity * * @return base */ public function initialise(): base { $columns = $this->get_all_columns(); foreach ($columns as $column) { $this->add_column($column); } // All the filters defined by the entity can also be used as conditions. $filters = $this->get_all_filters(); foreach ($filters as $filter) { $this ->add_filter($filter) ->add_condition($filter); } return $this; } /** * Returns list of all available columns * * @return column[] */ protected function get_all_columns(): array { global $DB; $badgealias = $this->get_table_alias('badge'); $contextalias = $this->get_table_alias('context'); // Name. $columns[] = (new column( 'name', new lang_string('name'), $this->get_entity_name() )) ->add_joins($this->get_joins()) ->set_type(column::TYPE_TEXT) ->add_field("{$badgealias}.name") ->set_is_sortable(true);
> // Name with link. // Description (note, this column contains plaintext so requires no post-processing). > $columns[] = (new column( $descriptionfieldsql = "{$badgealias}.description"; > 'namewithlink', if ($DB->get_dbfamily() === 'oracle') { > new lang_string('namewithlink', 'core_badges'), $descriptionfieldsql = $DB->sql_order_by_text($descriptionfieldsql, 1024); > $this->get_entity_name() } > )) $columns[] = (new column( > ->add_joins($this->get_joins()) 'description', > ->set_type(column::TYPE_TEXT) new lang_string('description', 'core_badges'), > ->add_fields("{$badgealias}.name, {$badgealias}.id") $this->get_entity_name() > ->set_is_sortable(true) )) > ->add_callback(static function(?string $value, stdClass $row): string { ->add_joins($this->get_joins()) > if (!$row->id) { ->set_type(column::TYPE_LONGTEXT) > return ''; ->add_field($descriptionfieldsql, 'description'); > } > // Criteria. > $url = new moodle_url('/badges/overview.php', ['id' => $row->id]); $columns[] = (new column( > return html_writer::link($url, $row->name); 'criteria', > }); new lang_string('bcriteria', 'core_badges'), >
$this->get_entity_name() )) ->add_joins($this->get_joins()) ->set_type(column::TYPE_TEXT) ->add_field("{$badgealias}.id") ->set_disabled_aggregation_all() ->add_callback(static function($badgeid): string { global $PAGE; if (!$badgeid) { return ''; } $badge = new \core_badges\badge($badgeid); $renderer = $PAGE->get_renderer('core_badges'); return $renderer->print_badge_criteria($badge, 'short'); }); // Image. $columns[] = (new column( 'image', new lang_string('badgeimage', 'core_badges'), $this->get_entity_name() )) ->add_joins($this->get_joins()) ->add_join("LEFT JOIN {context} {$contextalias} ON {$contextalias}.contextlevel = " . CONTEXT_COURSE . " AND {$contextalias}.instanceid = {$badgealias}.courseid") ->set_type(column::TYPE_INTEGER) ->add_fields("{$badgealias}.id, {$badgealias}.type, {$badgealias}.courseid") ->add_field($DB->sql_cast_to_char("{$badgealias}.imagecaption"), 'imagecaption') ->add_fields(context_helper::get_preload_record_columns_sql($contextalias)) ->set_disabled_aggregation_all() ->add_callback(static function(?int $badgeid, stdClass $badge): string { if (!$badgeid) { return ''; } if ($badge->type == BADGE_TYPE_SITE) { $context = context_system::instance(); } else { context_helper::preload_from_record($badge); $context = context_course::instance($badge->courseid); } $badgeimage = moodle_url::make_pluginfile_url($context->id, 'badges', 'badgeimage', $badgeid, '/', 'f2'); return html_writer::img($badgeimage, $badge->imagecaption); }); // Language. $columns[] = (new column( 'language', new lang_string('language'), $this->get_entity_name() )) ->add_joins($this->get_joins()) ->set_type(column::TYPE_TEXT) ->add_field("{$badgealias}.language") ->set_is_sortable(true) ->add_callback(static function($language): string { $languages = get_string_manager()->get_list_of_languages(); return $languages[$language] ?? $language ?? ''; }); // Version. $columns[] = (new column( 'version', new lang_string('version', 'core_badges'), $this->get_entity_name() )) ->add_joins($this->get_joins()) ->set_type(column::TYPE_TEXT) ->add_field("{$badgealias}.version") ->set_is_sortable(true); // Status. $columns[] = (new column( 'status', new lang_string('status', 'core_badges'), $this->get_entity_name() )) ->add_joins($this->get_joins()) ->set_type(column::TYPE_TEXT) ->add_field("{$badgealias}.status") ->set_is_sortable(true) ->add_callback(static function($status): string {
< return $status ? get_string("badgestatus_{$status}", 'core_badges') : '';
> if ($status === null) { > return ''; > } > > return get_string("badgestatus_{$status}", 'core_badges');
}); // Expiry date/period. $columns[] = (new column( 'expiry', new lang_string('expirydate', 'core_badges'), $this->get_entity_name() )) ->add_joins($this->get_joins()) ->set_type(column::TYPE_TIMESTAMP) ->add_fields("{$badgealias}.expiredate, {$badgealias}.expireperiod, {$badgealias}.id") ->set_is_sortable(true, ["{$badgealias}.expiredate", "{$badgealias}.expireperiod"]) ->set_disabled_aggregation_all() ->add_callback(static function(?int $expiredate, stdClass $badge): string { if (!$badge->id) { return ''; } else if ($expiredate) { return userdate($expiredate); } else if ($badge->expireperiod) { return format_time($badge->expireperiod); } else { return get_string('never', 'core_badges'); } }); // Image author details. foreach (['imageauthorname', 'imageauthoremail', 'imageauthorurl'] as $imageauthorfield) { $columns[] = (new column( $imageauthorfield, new lang_string($imageauthorfield, 'core_badges'), $this->get_entity_name() )) ->add_joins($this->get_joins()) ->set_type(column::TYPE_TEXT) ->add_field("{$badgealias}.{$imageauthorfield}") ->set_is_sortable(true); } return $columns; } /** * Return list of all available filters * * @return filter[] */ protected function get_all_filters(): array { $badgealias = $this->get_table_alias('badge'); // Name. $filters[] = (new filter( text::class, 'name', new lang_string('name'), $this->get_entity_name(), "{$badgealias}.name" )) ->add_joins($this->get_joins()); // Status. $filters[] = (new filter( select::class, 'status', new lang_string('status', 'core_badges'), $this->get_entity_name(), "{$badgealias}.status" )) ->add_joins($this->get_joins()) ->set_options([ BADGE_STATUS_INACTIVE => new lang_string('badgestatus_0', 'core_badges'), BADGE_STATUS_ACTIVE => new lang_string('badgestatus_1', 'core_badges'), BADGE_STATUS_INACTIVE_LOCKED => new lang_string('badgestatus_2', 'core_badges'), BADGE_STATUS_ACTIVE_LOCKED => new lang_string('badgestatus_3', 'core_badges'), BADGE_STATUS_ARCHIVED => new lang_string('badgestatus_4', 'core_badges'), ]); // Type. $filters[] = (new filter( select::class, 'type', new lang_string('type', 'core_badges'), $this->get_entity_name(), "{$badgealias}.type" )) ->add_joins($this->get_joins()) ->set_options([ BADGE_TYPE_SITE => new lang_string('site'), BADGE_TYPE_COURSE => new lang_string('course'), ]); return $filters;
> } } > } > /** > * Return joins necessary for retrieving tags > * > * @return string[] > */ > public function get_tag_joins(): array { > return $this->get_tag_joins_for_entity('core_badges', 'badge', $this->get_table_alias('badge') . '.id');