. /** * Contains class mod_feedback_responses_table * * @package mod_feedback * @copyright 2016 Marina Glancy * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); global $CFG; require_once($CFG->libdir . '/tablelib.php'); /** * Class mod_feedback_responses_table * * @package mod_feedback * @copyright 2016 Marina Glancy * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class mod_feedback_responses_table extends table_sql { /** @var cm_info */ protected $cm; /** @var int */ protected $grandtotal = null; /** @var bool */ protected $showall = false; /** @var string */ protected $showallparamname = 'showall'; /** * Constructor * * @param cm_info $cm */ public function __construct(cm_info $cm) { $this->cm = $cm; parent::__construct('feedback-showentry-list-' . $cm->instance); $this->showall = optional_param($this->showallparamname, 0, PARAM_BOOL); $this->define_baseurl(new moodle_url('/mod/feedback/show_entries.php', ['id' => $this->cm->id])); if ($this->showall) { $this->baseurl->param($this->showallparamname, $this->showall); } $this->init(); } /** * Initialises table */ protected function init() { $tablecolumns = array('userpic', 'fullname', 'completed_timemodified'); $tableheaders = array(get_string('userpic'), get_string('fullnameuser'), get_string('date')); $context = context_module::instance($this->cm->id); if (has_capability('mod/feedback:deletesubmissions', $context)) { $tablecolumns[] = 'deleteentry'; $tableheaders[] = ''; } $this->define_columns($tablecolumns); $this->define_headers($tableheaders); $this->sortable(true, 'lastname', SORT_ASC); $this->collapsible(false); $this->set_attribute('id', 'showentrytable'); $params = array(); $params['anon'] = FEEDBACK_ANONYMOUS_NO; $params['instance'] = $this->cm->instance; $params['notdeleted'] = 0; $ufields = user_picture::fields('u', null, 'userid'); $fields = 'DISTINCT c.id, c.timemodified as completed_timemodified, '.$ufields; $from = '{user} u, {feedback_completed} c'; $where = 'anonymous_response = :anon AND u.id = c.userid AND c.feedback = :instance AND u.deleted = :notdeleted'; $group = groups_get_activity_group($this->cm, true); if ($group) { $from .= ', {groups_members} g'; $where .= ' AND g.groupid = :group AND g.userid = c.userid'; $params['group'] = $group; } $this->set_sql($fields, $from, $where, $params); $this->set_count_sql("SELECT COUNT(DISTINCT c.id) FROM $from WHERE $where", $params); } /** * Prepares column userpic for display * @param stdClass $row * @return string */ public function col_userpic($row) { global $OUTPUT; return $OUTPUT->user_picture($row, array('courseid' => $this->cm->course)); } /** * Prepares column deleteentry for display * @param stdClass $row * @return string */ public function col_deleteentry($row) { $context = context_module::instance($this->cm->id); if (has_capability('mod/feedback:deletesubmissions', $context)) { $deleteentryurl = new moodle_url($this->baseurl, ['delete' => $row->id]); return html_writer::link($deleteentryurl, get_string('delete_entry', 'feedback')); } } /** * Returns a link for viewing a single response * @param stdClass $row * @return \moodle_url */ protected function get_link_single_entry($row) { return new moodle_url($this->baseurl, ['userid' => $row->userid, 'showcompleted' => $row->id]); } /** * Prepares column completed_timemodified for display * @param stdClass $student * @return string */ public function col_completed_timemodified($student) { return html_writer::link($this->get_link_single_entry($student), userdate($student->completed_timemodified)); } /** * Query the db. Store results in the table object for use by build_table. * * @param int $pagesize size of page for paginated displayed table. * @param bool $useinitialsbar do you want to use the initials bar. Bar * will only be used if there is a fullname column defined for the table. */ public function query_db($pagesize, $useinitialsbar=true) { global $DB; $this->totalrows = $grandtotal = $this->get_total_responses_count(); $this->initialbars($useinitialsbar); list($wsql, $wparams) = $this->get_sql_where(); if ($wsql) { $this->countsql .= ' AND '.$wsql; $this->countparams = array_merge($this->countparams, $wparams); $this->sql->where .= ' AND '.$wsql; $this->sql->params = array_merge($this->sql->params, $wparams); $this->totalrows = $DB->count_records_sql($this->countsql, $this->countparams); } if ($this->totalrows > $pagesize) { $this->pagesize($pagesize, $this->totalrows); } if ($sort = $this->get_sql_sort()) { $sort = "ORDER BY $sort"; } $sql = "SELECT {$this->sql->fields} FROM {$this->sql->from} WHERE {$this->sql->where} {$sort}"; $this->rawdata = $DB->get_recordset_sql($sql, $this->sql->params, $this->get_page_start(), $this->get_page_size()); } /** * Returns total number of reponses (without any filters applied) * @return int */ public function get_total_responses_count() { global $DB; if ($this->grandtotal === null) { $this->grandtotal = $DB->count_records_sql($this->countsql, $this->countparams); } return $this->grandtotal; } /** * Displays the table */ public function display() { global $OUTPUT; groups_print_activity_menu($this->cm, $this->baseurl); $grandtotal = $this->get_total_responses_count(); if (!$grandtotal) { echo $OUTPUT->box(get_string('nothingtodisplay'), 'generalbox nothingtodisplay'); return; } $this->out($this->showall ? $grandtotal : FEEDBACK_DEFAULT_PAGE_COUNT, $grandtotal > FEEDBACK_DEFAULT_PAGE_COUNT); // Toggle 'Show all' link. if ($this->totalrows > FEEDBACK_DEFAULT_PAGE_COUNT) { if (!$this->use_pages) { echo html_writer::div(html_writer::link(new moodle_url($this->baseurl, [$this->showallparamname => 0]), get_string('showperpage', '', FEEDBACK_DEFAULT_PAGE_COUNT)), 'showall'); } else { echo html_writer::div(html_writer::link(new moodle_url($this->baseurl, [$this->showallparamname => 1]), get_string('showall', '', $this->totalrows)), 'showall'); } } } /** * Returns links to previous/next responses in the list * @param stdClass $record * @return array array of three elements [$prevresponseurl, $returnurl, $nextresponseurl] */ public function get_reponse_navigation_links($record) { $this->setup(); $grandtotal = $this->get_total_responses_count(); $this->query_db($grandtotal); $lastrow = $thisrow = $nextrow = null; $counter = 0; $page = 0; while ($this->rawdata->valid()) { $row = $this->rawdata->current(); if ($row->id == $record->id) { $page = $this->showall ? 0 : floor($counter / FEEDBACK_DEFAULT_PAGE_COUNT); $thisrow = $row; $this->rawdata->next(); $nextrow = $this->rawdata->valid() ? $this->rawdata->current() : null; break; } $lastrow = $row; $this->rawdata->next(); $counter++; } $this->rawdata->close(); if (!$thisrow) { $lastrow = null; } return [ $lastrow ? $this->get_link_single_entry($lastrow) : null, new moodle_url($this->baseurl, [$this->request[TABLE_VAR_PAGE] => $page]), $nextrow ? $this->get_link_single_entry($nextrow) : null, ]; } }