Proyectos de Subversion Moodle

Rev

Autoría | Ultima modificación | Ver Log |

<?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/>.

/**
 * this file contains the status table class to display configured exclusions.
 *
 * File         exclusiontable.php
 * Encoding     UTF-8
 * @copyright   Sebsoft.nl
 * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */

namespace tool_usersuspension;

defined('MOODLE_INTERNAL') || die;
require_once($CFG->libdir . '/tablelib.php');

/**
 * tool_usersuspension\exclusiontable
 *
 * @package     tool_usersuspension
 *
 * @copyright   Sebsoft.nl
 * @author      R.J. van Dongen <rogier@sebsoft.nl>
 * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
class exclusiontable extends \flexible_table {

    /**
     * Raw data array
     * @var array
     */
    protected $rawdata;

    /**
     * item deletion string
     * @var string
     */
    protected $strdelete;

    /**
     * table type string
     * @var string
     */
    protected $tabletype = 'all';

    /**
     * Create a new instance of the exclusiontable
     */
    public function __construct() {
        global $USER;
        parent::__construct(__CLASS__. '-' . $USER->id . '-' . $this->tabletype);
        $this->rawdata = array();
        $this->strdelete = get_string('action:delete-exclusion', 'tool_usersuspension');
        $this->no_sorting('action');
    }

    /**
     * Renders the table
     *
     * @param int $pagesize
     * @param bool $useinitialsbar
     */
    public function render($pagesize, $useinitialsbar = true) {
        $this->define_columns(array('type', 'name', 'timecreated', 'action'));
        $this->define_headers(array(
            get_string('thead:type', 'tool_usersuspension'),
            get_string('thead:name', 'tool_usersuspension'),
            get_string('thead:timecreated', 'tool_usersuspension'),
            get_string('thead:action', 'tool_usersuspension'))
        );

        $this->setup();

        switch ($this->tabletype)
        {
            case 'user':
                $this->load_type_users($pagesize);
                break;
            case 'cohort':
                $this->load_type_cohorts($pagesize);
                break;
            default:
                $this->load_all($pagesize);
                break;
        }

        $this->build_table();
        $this->finish_output();
    }

    /**
     * Take the data returned from the db_query and go through all the rows
     * processing each col using either col_{columnname} method or other_cols
     * method or if other_cols returns NULL then put the data straight into the
     * table.
     */
    public function build_table() {
        if ($this->rawdata) {
            foreach ($this->rawdata as $row) {
                $formattedrow = $this->format_row($row);
                $this->add_data_keyed($formattedrow, $this->get_row_class($row));
            }
        }
    }

    /**
     *
     * Get any extra classes names to add to this row in the HTML.
     * @param \stdClass $row array the data for this row.
     * @return string added to the class="" attribute of the tr.
     */
    public function get_row_class($row) {
        return '';
    }

    /**
     * Return the SQL and parameters for the 'user' type part of the exclusion table
     * @return array
     */
    protected function get_type_users_sql() {
        global $DB;
        $pfx = util::get_prefix();
        $fields = 'e.id,e.type,u.id as refid,' . $DB->sql_fullname('u.firstname', 'u.lastname') .
                ' AS name,e.timecreated,null AS action';
        $from = '{tool_usersuspension_excl} e JOIN {user} u ON e.refid=u.id';
        $where = "type = :{$pfx}type";
        $sql = "SELECT $fields FROM $from WHERE $where";
        return array($sql, array("{$pfx}type" => 'user'));
    }

    /**
     * Load the data for the 'user' type part of the exclusion table
     * @param int $pagesize
     */
    protected function load_type_users($pagesize) {
        global $DB;
        // Table size.
        $count = $DB->count_records('tool_usersuspension_excl', array('type' => 'user'));
        $this->pagesize($pagesize, $count);

        list($sql, $params) = $this->get_type_users_sql();
        $sort = $this->get_sql_sort();
        if ($sort) {
            $sql .= " ORDER BY $sort";
        }
        $records = $DB->get_records_sql($sql, $params,
                $this->get_page_start(), $this->get_page_size());
        $this->rawdata = array_merge($this->rawdata, $records);
    }

    /**
     * Return the SQL and parameters for the 'cohort' type part of the exclusion table
     * @return array
     */
    protected function get_type_cohorts_sql() {
        $pfx = util::get_prefix();
        $fields = 'e.id,e.type,c.id as refid,c.name,e.timecreated,null AS action';
        $from = '{tool_usersuspension_excl} e JOIN {cohort} c ON e.refid=c.id';
        $where = "type = :{$pfx}type";
        $sql = "SELECT $fields FROM $from WHERE $where";
        return array($sql, array("{$pfx}type" => 'cohort'));
    }

    /**
     * Load the data for the 'cohort' type part of the exclusion table
     * @param int $pagesize
     */
    protected function load_type_cohorts($pagesize) {
        global $DB;
        // Table size.
        $count = $DB->count_records('tool_usersuspension_excl', array('type' => 'user'));
        $this->pagesize($pagesize, $count);

        list($sql, $params) = $this->get_type_cohorts_sql();
        $sort = $this->get_sql_sort();
        if ($sort) {
            $sql .= " ORDER BY $sort";
        }
        $records = $DB->get_records_sql($sql . $sort, $params,
                $this->get_page_start(), $this->get_page_size());
        $this->rawdata = array_merge($this->rawdata, $records);
    }

    /**
     * Load all data for the exclusion table
     * @param int $pagesize
     */
    protected function load_all($pagesize) {
        global $DB;
        // Table size.
        $count = $DB->count_records('tool_usersuspension_excl');
        $this->pagesize($pagesize, $count);

        list($sql, $params) = $this->get_type_users_sql();
        list($sql2, $params2) = $this->get_type_cohorts_sql();

        $params = array_merge($params, $params2);
        $sql .= ' UNION ' . $sql2;
        $sort = $this->get_sql_sort();
        if ($sort) {
            $sql .= " ORDER BY $sort";
        }
        $records = $DB->get_records_sql($sql, $params,
                $this->get_page_start(), $this->get_page_size());
        $this->rawdata = $records;
    }

    /**
     * Render visual representation of the 'username' column for use in the table
     *
     * @param \stdClass $row
     * @return string time string
     */
    public function col_name($row) {
        global $CFG;
        if ($row->type === 'user') {
            $link = new \moodle_url($CFG->wwwroot . '/user/profile.php', array('id' => $row->id));
            return '<a href="' . $link->out() . '">' . $row->name . '</a>';
        } else {
            $link = new \moodle_url($CFG->wwwroot . '/cohort/index.php');
            return '<a href="' . $link->out() . '">' . $row->name . '</a>';
        }
    }

    /**
     * Render visual representation of the 'timemodified' column for use in the table
     *
     * @param \stdClass $row
     * @return string time string
     */
    public function col_timecreated($row) {
        return userdate($row->timecreated);
    }

    /**
     * Render visual representation of the 'action' column for use in the table
     *
     * @param \stdClass $row
     * @return string actions
     */
    public function col_action($row) {
        $actions = array();
        $actions[] = $this->get_action($row, 'delete', true);
        return implode('', $actions);
    }

    /**
     * Return the image tag representing an action image
     *
     * @param string $action
     * @return string HTML image tag
     */
    protected function get_action_image($action) {
        global $OUTPUT;
        $actionstr = 'str' . $action;
        return '<img src="' . $OUTPUT->image_url($action, 'tool_usersuspension') .
                '" title="' . $this->{$actionstr} . '"/>';
    }

    /**
     * Return a string containing the link to an action
     *
     * @param \stdClass $row
     * @param string $action
     * @param bool $confirm whether or not to render a javascript confirm box
     * @return string link representing the action with an image
     */
    protected function get_action($row, $action, $confirm = false) {
        $actionstr = 'str' . $action;
        $onclick = '';
        if ($confirm) {
            $onclick = ' onclick="return confirm(\'' .
                    get_string('action:confirm-'.$action.'-exclusion', 'tool_usersuspension') .
                    '\');"';
        }
        return '<a ' . $onclick . 'href="' . new \moodle_url($this->baseurl,
                array('action' => $action, 'id' => $row->id, 'sesskey' => sesskey())) .
                '" alt="' . $this->{$actionstr} .
                '">' . $this->get_action_image($action) . '</a>';
    }

}