3ac78b4437fbc076479f6c8585bbdb9fec6f00c5
[moodle.git] / admin / tool / uploadcourse / classes / tracker.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  * Output tracker.
19  *
20  * @package    tool_uploadcourse
21  * @copyright  2013 Frédéric Massart
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 defined('MOODLE_INTERNAL') || die();
26 require_once($CFG->libdir . '/weblib.php');
28 /**
29  * Class output tracker.
30  *
31  * @package    tool_uploadcourse
32  * @copyright  2013 Frédéric Massart
33  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
34  */
35 class tool_uploadcourse_tracker {
37     /**
38      * Constant to output nothing.
39      */
40     const NO_OUTPUT = 0;
42     /**
43      * Constant to output HTML.
44      */
45     const OUTPUT_HTML = 1;
47     /**
48      * Constant to output plain text.
49      */
50     const OUTPUT_PLAIN = 2;
52     /**
53      * @var array columns to display.
54      */
55     protected $columns = array('line', 'result', 'id', 'shortname', 'fullname', 'idnumber', 'status');
57     /**
58      * @var int row number.
59      */
60     protected $rownb = 0;
62     /**
63      * @var int chosen output mode.
64      */
65     protected $outputmode;
67     /**
68      * @var object output buffer.
69      */
70     protected $buffer;
72     /**
73      * Constructor.
74      *
75      * @param int $outputmode desired output mode.
76      */
77     public function __construct($outputmode = self::NO_OUTPUT) {
78         $this->outputmode = $outputmode;
79         if ($this->outputmode == self::OUTPUT_PLAIN) {
80             $this->buffer = new progress_trace_buffer(new text_progress_trace());
81         }
82     }
84     /**
85      * Finish the output.
86      *
87      * @return void
88      */
89     public function finish() {
90         if ($this->outputmode == self::NO_OUTPUT) {
91             return;
92         }
94         if ($this->outputmode == self::OUTPUT_HTML) {
95             echo html_writer::end_tag('table');
96         }
97     }
99     /**
100      * Output the results.
101      *
102      * @param int $total total courses.
103      * @param int $created count of courses created.
104      * @param int $updated count of courses updated.
105      * @param int $deleted count of courses deleted.
106      * @param int $errors count of errors.
107      * @return void
108      */
109     public function results($total, $created, $updated, $deleted, $errors) {
110         if ($this->outputmode == self::NO_OUTPUT) {
111             return;
112         }
114         $message = array(
115             get_string('coursestotal', 'tool_uploadcourse', $total),
116             get_string('coursescreated', 'tool_uploadcourse', $created),
117             get_string('coursesupdated', 'tool_uploadcourse', $updated),
118             get_string('coursesdeleted', 'tool_uploadcourse', $deleted),
119             get_string('courseserrors', 'tool_uploadcourse', $errors)
120         );
122         if ($this->outputmode == self::OUTPUT_PLAIN) {
123             foreach ($message as $msg) {
124                 $this->buffer->output($msg);
125             }
126         } else if ($this->outputmode == self::OUTPUT_HTML) {
127             $buffer = new progress_trace_buffer(new html_list_progress_trace());
128             foreach ($message as $msg) {
129                 $buffer->output($msg);
130             }
131             $buffer->finished();
132         }
133     }
135     /**
136      * Output one more line.
137      *
138      * @param int $line line number.
139      * @param int $outcome 0 for failure, 1 for success, 2 for success with errors. Use 2 when
140      *                     most of the process succeeded but there might have been outstanding errors.
141      * @param array $status array of statuses.
142      * @param array $data extra data to display.
143      * @return void
144      */
145     public function output($line, $outcome, $status, $data) {
146         global $OUTPUT;
147         if ($this->outputmode == self::NO_OUTPUT) {
148             return;
149         }
151         if ($this->outputmode == self::OUTPUT_PLAIN) {
152             if ($outcome == 1) {
153                 $ok = 'OK';
154             } else if (!$outcome) {
155                 $ok = 'NOK';        // Not OK.
156             } else {
157                 $ok = 'EOK';        // Errors, but OK.
158             }
159             $message = array(
160                 $line,
161                 $ok,
162                 isset($data['id']) ? $data['id'] : '',
163                 isset($data['shortname']) ? $data['shortname'] : '',
164                 isset($data['fullname']) ? $data['fullname'] : '',
165                 isset($data['idnumber']) ? $data['idnumber'] : ''
166             );
167             $this->buffer->output(implode("\t", $message));
168             if (!empty($status)) {
169                 foreach ($status as $st) {
170                     $this->buffer->output($st, 1);
171                 }
172             }
173         } else if ($this->outputmode == self::OUTPUT_HTML) {
174             $ci = 0;
175             $this->rownb++;
176             if (is_array($status)) {
177                 $status = implode(html_writer::empty_tag('br'), $status);
178             }
179             if ($outcome == 1) {
180                 $outcome = $OUTPUT->pix_icon('i/valid', '');
181             } else if (!$outcome) {
182                 $outcome = $OUTPUT->pix_icon('i/invalid', '');
183             } else {
184                 $outcome = $OUTPUT->pix_icon('i/caution', '');
185             }
186             echo html_writer::start_tag('tr', array('class' => 'r' . $this->rownb % 2));
187             echo html_writer::tag('td', $line, array('class' => 'c' . $ci++));
188             echo html_writer::tag('td', $outcome, array('class' => 'c' . $ci++));
189             echo html_writer::tag('td', isset($data['id']) ? $data['id'] : '', array('class' => 'c' . $ci++));
190             echo html_writer::tag('td', isset($data['shortname']) ? $data['shortname'] : '', array('class' => 'c' . $ci++));
191             echo html_writer::tag('td', isset($data['fullname']) ? $data['fullname'] : '', array('class' => 'c' . $ci++));
192             echo html_writer::tag('td', isset($data['idnumber']) ? $data['idnumber'] : '', array('class' => 'c' . $ci++));
193             echo html_writer::tag('td', $status, array('class' => 'c' . $ci++));
194             echo html_writer::end_tag('tr');
195         }
196     }
198     /**
199      * Start the output.
200      *
201      * @return void
202      */
203     public function start() {
204         if ($this->outputmode == self::NO_OUTPUT) {
205             return;
206         }
208         if ($this->outputmode == self::OUTPUT_PLAIN) {
209             $columns = array_flip($this->columns);
210             unset($columns['status']);
211             $columns = array_flip($columns);
212             $this->buffer->output(implode("\t", $columns));
213         } else if ($this->outputmode == self::OUTPUT_HTML) {
214             $ci = 0;
215             echo html_writer::start_tag('table', array('class' => 'generaltable boxaligncenter flexible-wrap',
216                 'summary' => get_string('uploadcoursesresult', 'tool_uploadcourse')));
217             echo html_writer::start_tag('tr', array('class' => 'heading r' . $this->rownb));
218             echo html_writer::tag('th', get_string('csvline', 'tool_uploadcourse'),
219                 array('class' => 'c' . $ci++, 'scope' => 'col'));
220             echo html_writer::tag('th', get_string('result', 'tool_uploadcourse'), array('class' => 'c' . $ci++, 'scope' => 'col'));
221             echo html_writer::tag('th', get_string('id', 'tool_uploadcourse'), array('class' => 'c' . $ci++, 'scope' => 'col'));
222             echo html_writer::tag('th', get_string('shortname'), array('class' => 'c' . $ci++, 'scope' => 'col'));
223             echo html_writer::tag('th', get_string('fullname'), array('class' => 'c' . $ci++, 'scope' => 'col'));
224             echo html_writer::tag('th', get_string('idnumber'), array('class' => 'c' . $ci++, 'scope' => 'col'));
225             echo html_writer::tag('th', get_string('status'), array('class' => 'c' . $ci++, 'scope' => 'col'));
226             echo html_writer::end_tag('tr');
227         }
228     }