6e4909848e37fc7bb35693bc4dafb0b30ea46267
[moodle.git] / badges / criteria / award_criteria_overall.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * This file contains the overall badge award criteria type
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  */
27 defined('MOODLE_INTERNAL') || die();
29 /**
30  * Overall badge award criteria
31  *
32  */
33 class award_criteria_overall extends award_criteria {
35     /* @var int Criteria [BADGE_CRITERIA_TYPE_OVERALL] */
36     public $criteriatype = BADGE_CRITERIA_TYPE_OVERALL;
38     /**
39      * Add appropriate form elements to the criteria form
40      *
41      * @param stdClass $data details of overall criterion
42      */
43     public function config_form_criteria($data) {
44         global $OUTPUT;
45         $prefix = 'criteria-' . $this->id;
46         if (count($data->criteria) > 2) {
47             echo $OUTPUT->box_start();
48             if (!empty($this->description)) {
49                 $badge = new badge($this->badgeid);
50                 echo $OUTPUT->box(
51                     format_text($this->description, FORMAT_HTML, array('context' => $badge->get_context())),
52                     'criteria-description');
53             }
54             echo $OUTPUT->heading($this->get_title(), 2);
56             $agg = $data->get_aggregation_methods();
57             if (!$data->is_locked() && !$data->is_active()) {
58                 $editurl = new moodle_url('/badges/criteria_settings.php',
59                                array('badgeid' => $this->badgeid,
60                                    'edit' => true,
61                                    'type' => $this->criteriatype,
62                                    'crit' => $this->id
63                                )
64                         );
65                 $editaction = $OUTPUT->action_icon($editurl, new pix_icon('t/edit', get_string('edit')), null,
66                               array('class' => 'criteria-action'));
67                 echo $OUTPUT->box($editaction, array('criteria-header'));
69                 $url = new moodle_url('criteria.php', array('id' => $data->id, 'sesskey' => sesskey()));
70                 $table = new html_table();
71                 $table->attributes = array('class' => 'clearfix');
72                 $table->colclasses = array('', 'activatebadge');
73                 $table->data[] = array(
74                         $OUTPUT->single_select($url, 'update', $agg, $data->get_aggregation_method($this->criteriatype), null),
75                         get_string('overallcrit', 'badges')
76                         );
77                 echo html_writer::table($table);
78             } else {
79                 echo $OUTPUT->box(get_string('criteria_descr_' . $this->criteriatype, 'badges',
80                         core_text::strtoupper($agg[$data->get_aggregation_method()])), 'clearfix');
81             }
82             echo $OUTPUT->box_end();
83         }
84     }
86     /**
87      * Add appropriate parameter elements to the criteria form
88      *
89      */
90     public function config_options(&$mform, $param) {
91     }
93     /**
94      * Get criteria details for displaying to users
95      *
96      * @return string
97      */
98     public function get_details($short = '') {
99     }
101     /**
102      * Review this criteria and decide if it has been completed
103      * Overall criteria review should be called only from other criteria handlers.
104      *
105      * @param int $userid User whose criteria completion needs to be reviewed.
106      * @param bool $filtered An additional parameter indicating that user list
107      *        has been reduced and some expensive checks can be skipped.
108      *
109      * @return bool Whether criteria is complete
110      */
111     public function review($userid, $filtered = false) {
112         global $DB;
114         $sql = "SELECT bc.*, bcm.critid, bcm.userid, bcm.datemet
115                 FROM {badge_criteria} bc
116                 LEFT JOIN {badge_criteria_met} bcm
117                     ON bc.id = bcm.critid AND bcm.userid = :userid
118                 WHERE bc.badgeid = :badgeid
119                     AND bc.criteriatype != :criteriatype ";
121         $params = array(
122                     'userid' => $userid,
123                     'badgeid' => $this->badgeid,
124                     'criteriatype' => BADGE_CRITERIA_TYPE_OVERALL
125                 );
127         $criteria = $DB->get_records_sql($sql, $params);
128         $overall = false;
129         foreach ($criteria as $crit) {
130             if ($this->method == BADGE_CRITERIA_AGGREGATION_ALL) {
131                 if ($crit->datemet === null) {
132                     return false;
133                 } else {
134                     $overall = true;
135                     continue;
136                 }
137             } else {
138                 if ($crit->datemet === null) {
139                     $overall = false;
140                     continue;
141                 } else {
142                     return true;
143                 }
144             }
145         }
147         return $overall;
148     }
150     /**
151      * Returns array with sql code and parameters returning all ids
152      * of users who meet this particular criterion.
153      *
154      * @return array list($join, $where, $params)
155      */
156     public function get_completed_criteria_sql() {
157         return array('', '', array());
158     }
160     /**
161      * Add appropriate criteria elements to the form
162      *
163      */
164     public function get_options(&$mform) {
165     }
167     /**
168      * Return criteria parameters
169      *
170      * @param int $critid Criterion ID
171      * @return array
172      */
173     public function get_params($cid) {
174     }
176     /**
177      * Saves overall badge criteria description.
178      *
179      * @param array $params Values from the form or any other array.
180      */
181     public function save($params = array()) {
182         global $DB;
184         // Sort out criteria description.
185         // If it is coming from the form editor, it is an array of (text, format).
186         $description = '';
187         if (isset($params['description']['text'])) {
188             $description = $params['description']['text'];
189         } else if (isset($params['description'])) {
190             $description = $params['description'];
191         }
193         $fordb = new stdClass();
194         $fordb->criteriatype = $this->criteriatype;
195         $fordb->badgeid = $this->badgeid;
196         $fordb->description = $description;
197         if ($this->id !== 0) {
198             $fordb->id = $this->id;
199             $DB->update_record('badge_criteria', $fordb);
200         } else {
201             // New record in DB, set aggregation to ALL by default.
202             $fordb->method = BADGE_CRITERIA_AGGREGATION_ALL;
203             $DB->insert_record('badge_criteria', $fordb);
204         }
205     }