123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523 |
- <?php
- /* For licensing terms, see /license.txt */
- set_time_limit(0);
- use CpChart\Cache as pCache;
- use CpChart\Data as pData;
- use CpChart\Image as pImage;
- /**
- * Class FlatViewTable
- * Table to display flat view (all evaluations and links for all students).
- *
- * @author Stijn Konings
- * @author Bert Steppé - (refactored, optimised)
- * @author Julio Montoya Armas - Gradebook Graphics
- *
- * @package chamilo.gradebook
- */
- class FlatViewTable extends SortableTable
- {
- public $datagen;
- private $selectcat;
- private $limit_enabled;
- private $offset;
- private $mainCourseCategory;
- /**
- * @param Category $selectcat
- * @param array $users
- * @param array $evals
- * @param array $links
- * @param bool $limit_enabled
- * @param int $offset
- * @param null $addparams
- * @param Category $mainCourseCategory
- */
- public function __construct(
- $selectcat,
- $users = [],
- $evals = [],
- $links = [],
- $limit_enabled = false,
- $offset = 0,
- $addparams = null,
- $mainCourseCategory = null
- ) {
- parent:: __construct(
- 'flatviewlist',
- null,
- null,
- api_is_western_name_order() ? 1 : 0
- );
- $this->selectcat = $selectcat;
- $this->datagen = new FlatViewDataGenerator(
- $users,
- $evals,
- $links,
- ['only_subcat' => $this->selectcat->get_id()],
- $mainCourseCategory
- );
- $this->limit_enabled = $limit_enabled;
- $this->offset = $offset;
- if (isset($addparams)) {
- $this->set_additional_parameters($addparams);
- }
- // step 2: generate rows: students
- $this->datagen->category = $this->selectcat;
- $this->mainCourseCategory = $mainCourseCategory;
- }
- /**
- * @param bool $value
- */
- public function setLimitEnabled($value)
- {
- $this->limit_enabled = (bool) $value;
- }
- /**
- * @return Category
- */
- public function getMainCourseCategory()
- {
- return $this->mainCourseCategory;
- }
- /**
- * Display gradebook graphs.
- */
- public function display_graph_by_resource()
- {
- $headerName = $this->datagen->get_header_names();
- $total_users = $this->datagen->get_total_users_count();
- $displayscore = ScoreDisplay::instance();
- $customdisplays = $displayscore->get_custom_score_display_settings();
- if (empty($customdisplays)) {
- echo get_lang('To view graph score rule must be enabled');
- return '';
- }
- $user_results = $this->datagen->get_data_to_graph2(false);
- if (empty($user_results) || empty($total_users)) {
- echo get_lang('No results found');
- return '';
- }
- // Removing first name
- array_shift($headerName);
- // Removing last name
- array_shift($headerName);
- // Removing username
- array_shift($headerName);
- $pre_result = $new_result = [];
- foreach ($user_results as $result) {
- for ($i = 0; $i < count($headerName); $i++) {
- if (isset($result[$i + 1])) {
- $pre_result[$i + 3][] = $result[$i + 1];
- }
- }
- }
- $i = 0;
- $resource_list = [];
- $pre_result2 = [];
- foreach ($pre_result as $key => $res_array) {
- rsort($res_array);
- $pre_result2[] = $res_array;
- }
- //@todo when a display custom does not exist the order of the color does not match
- //filling all the answer that are not responded with 0
- rsort($customdisplays);
- if ($total_users > 0) {
- foreach ($pre_result2 as $key => $res_array) {
- $key_list = [];
- foreach ($res_array as $user_result) {
- $userResult = isset($user_result[1]) ? $user_result[1] : null;
- if (!isset($resource_list[$key][$userResult])) {
- $resource_list[$key][$userResult] = 0;
- }
- $resource_list[$key][$userResult]++;
- $key_list[] = $userResult;
- }
- foreach ($customdisplays as $display) {
- if (!in_array($display['display'], $key_list)) {
- $resource_list[$key][$display['display']] = 0;
- }
- }
- $i++;
- }
- }
- //fixing $resource_list
- $max = 0;
- $new_list = [];
- foreach ($resource_list as $key => $value) {
- $new_value = [];
- foreach ($customdisplays as $item) {
- if ($value[$item['display']] > $max) {
- $max = $value[$item['display']];
- }
- $new_value[$item['display']] = strip_tags($value[$item['display']]);
- }
- $new_list[] = $new_value;
- }
- $resource_list = $new_list;
- $i = 1;
- foreach ($resource_list as $key => $resource) {
- // Reverse array, otherwise we get highest values first
- $resource = array_reverse($resource, true);
- $dataSet = new pData();
- $dataSet->addPoints($resource, 'Serie');
- $dataSet->addPoints(array_keys($resource), 'Labels');
- $header = $headerName[$i - 1];
- if (is_array($header) && isset($header['header'])) {
- $header = $header['header'];
- }
- $dataSet->setSerieDescription('Labels', strip_tags($header));
- $dataSet->setAbscissa('Labels');
- $dataSet->setAbscissaName(get_lang('Skills ranking'));
- $dataSet->setAxisName(0, get_lang('Learners'));
- $palette = [
- '0' => ['R' => 186, 'G' => 206, 'B' => 151, 'Alpha' => 100],
- '1' => ['R' => 210, 'G' => 148, 'B' => 147, 'Alpha' => 100],
- '2' => ['R' => 148, 'G' => 170, 'B' => 208, 'Alpha' => 100],
- '3' => ['R' => 221, 'G' => 133, 'B' => 61, 'Alpha' => 100],
- '4' => ['R' => 65, 'G' => 153, 'B' => 176, 'Alpha' => 100],
- '5' => ['R' => 114, 'G' => 88, 'B' => 144, 'Alpha' => 100],
- '6' => ['R' => 138, 'G' => 166, 'B' => 78, 'Alpha' => 100],
- '7' => ['R' => 171, 'G' => 70, 'B' => 67, 'Alpha' => 100],
- '8' => ['R' => 69, 'G' => 115, 'B' => 168, 'Alpha' => 100],
- ];
- // Cache definition
- $cachePath = api_get_path(SYS_ARCHIVE_PATH);
- $myCache = new pCache(['CacheFolder' => substr($cachePath, 0, strlen($cachePath) - 1)]);
- $chartHash = $myCache->getHash($dataSet);
- if ($myCache->isInCache($chartHash)) {
- $imgPath = api_get_path(SYS_ARCHIVE_PATH).$chartHash;
- $myCache->saveFromCache($chartHash, $imgPath);
- $imgPath = api_get_path(WEB_ARCHIVE_PATH).$chartHash;
- } else {
- /* Create the pChart object */
- $widthSize = 480;
- $heightSize = 250;
- $myPicture = new pImage($widthSize, $heightSize, $dataSet);
- /* Turn of Antialiasing */
- $myPicture->Antialias = false;
- /* Add a border to the picture */
- $myPicture->drawRectangle(
- 0,
- 0,
- $widthSize - 1,
- $heightSize - 1,
- [
- 'R' => 0,
- 'G' => 0,
- 'B' => 0,
- ]
- );
- /* Set the default font */
- $myPicture->setFontProperties(
- [
- 'FontName' => api_get_path(SYS_FONTS_PATH).'opensans/OpenSans-Regular.ttf',
- 'FontSize' => 10,
- ]
- );
- /* Write the chart title */
- $myPicture->drawText(
- 250,
- 30,
- strip_tags($header),
- [
- 'FontSize' => 12,
- 'Align' => TEXT_ALIGN_BOTTOMMIDDLE,
- ]
- );
- /* Define the chart area */
- $myPicture->setGraphArea(50, 40, $widthSize - 20, $heightSize - 50);
- /* Draw the scale */
- $scaleSettings = [
- 'GridR' => 200,
- 'GridG' => 200,
- 'GridB' => 200,
- 'DrawSubTicks' => true,
- 'CycleBackground' => true,
- 'Mode' => SCALE_MODE_START0,
- ];
- $myPicture->drawScale($scaleSettings);
- /* Turn on shadow computing */
- $myPicture->setShadow(
- true,
- [
- 'X' => 1,
- 'Y' => 1,
- 'R' => 0,
- 'G' => 0,
- 'B' => 0,
- 'Alpha' => 10,
- ]
- );
- /* Draw the chart */
- $myPicture->setShadow(
- true,
- [
- 'X' => 1,
- 'Y' => 1,
- 'R' => 0,
- 'G' => 0,
- 'B' => 0,
- 'Alpha' => 10,
- ]
- );
- $settings = [
- 'OverrideColors' => $palette,
- 'Gradient' => false,
- 'GradientMode' => GRADIENT_SIMPLE,
- 'DisplayPos' => LABEL_POS_TOP,
- 'DisplayValues' => true,
- 'DisplayR' => 0,
- 'DisplayG' => 0,
- 'DisplayB' => 0,
- 'DisplayShadow' => true,
- 'Surrounding' => 10,
- ];
- $myPicture->drawBarChart($settings);
- /* Render the picture (choose the best way) */
- $myCache->writeToCache($chartHash, $myPicture);
- $imgPath = api_get_path(SYS_ARCHIVE_PATH).$chartHash;
- $myCache->saveFromCache($chartHash, $imgPath);
- $imgPath = api_get_path(WEB_ARCHIVE_PATH).$chartHash;
- }
- echo '<img src="'.$imgPath.'" >';
- if ($i % 2 == 0 && $i != 0) {
- echo '<br /><br />';
- } else {
- echo ' ';
- }
- $i++;
- }
- }
- /**
- * Function used by SortableTable to get total number of items in the table.
- */
- public function get_total_number_of_items()
- {
- return $this->datagen->get_total_users_count();
- }
- /**
- * Function used by SortableTable to generate the data to display.
- */
- public function get_table_data(
- $from = 1,
- $per_page = null,
- $column = null,
- $direction = null,
- $sort = null
- ) {
- $is_western_name_order = api_is_western_name_order();
- // create page navigation if needed
- $totalitems = $this->datagen->get_total_items_count();
- if ($this->limit_enabled && $totalitems > GRADEBOOK_ITEM_LIMIT) {
- $selectlimit = GRADEBOOK_ITEM_LIMIT;
- } else {
- $selectlimit = $totalitems;
- }
- $header = null;
- if ($this->limit_enabled && $totalitems > GRADEBOOK_ITEM_LIMIT) {
- $header .= '<table style="width: 100%; text-align: right; margin-left: auto; margin-right: auto;" border="0" cellpadding="2">'
- .'<tbody>'
- .'<tr>';
- // previous X
- $header .= '<td style="width:100%;">';
- if ($this->offset >= GRADEBOOK_ITEM_LIMIT) {
- $header .= '<a href="'.api_get_self()
- .'?selectcat='.Security::remove_XSS($_GET['selectcat'])
- .'&offset='.(($this->offset) - GRADEBOOK_ITEM_LIMIT)
- .(isset($_GET['search']) ? '&search='.Security::remove_XSS($_GET['search']) : '').'">'
- .Display::return_icon(
- 'action_prev.png',
- get_lang('Previous page'),
- [],
- ICON_SIZE_MEDIUM
- )
- .'</a>';
- } else {
- $header .= Display::return_icon(
- 'action_prev_na.png',
- get_lang('Previous page'),
- [],
- ICON_SIZE_MEDIUM
- );
- }
- $header .= ' ';
- // next X
- $calcnext = (($this->offset + (2 * GRADEBOOK_ITEM_LIMIT)) > $totalitems) ?
- ($totalitems - (GRADEBOOK_ITEM_LIMIT + $this->offset)) : GRADEBOOK_ITEM_LIMIT;
- if ($calcnext > 0) {
- $header .= '<a href="'.api_get_self()
- .'?selectcat='.Security::remove_XSS($_GET['selectcat'])
- .'&offset='.($this->offset + GRADEBOOK_ITEM_LIMIT)
- .(isset($_GET['search']) ? '&search='.Security::remove_XSS($_GET['search']) : '').'">'
- .Display::return_icon('action_next.png', get_lang('Next page'), [], ICON_SIZE_MEDIUM)
- .'</a>';
- } else {
- $header .= Display::return_icon(
- 'action_next_na.png',
- get_lang('Next page'),
- [],
- ICON_SIZE_MEDIUM
- );
- }
- $header .= '</td>';
- $header .= '</tbody></table>';
- echo $header;
- }
- // retrieve sorting type
- if ($is_western_name_order) {
- $users_sorting = ($this->column == 0 ? FlatViewDataGenerator::FVDG_SORT_FIRSTNAME : FlatViewDataGenerator::FVDG_SORT_LASTNAME);
- } else {
- $users_sorting = ($this->column == 0 ? FlatViewDataGenerator::FVDG_SORT_LASTNAME : FlatViewDataGenerator::FVDG_SORT_FIRSTNAME);
- }
- if ($this->direction == 'DESC') {
- $users_sorting |= FlatViewDataGenerator::FVDG_SORT_DESC;
- } else {
- $users_sorting |= FlatViewDataGenerator::FVDG_SORT_ASC;
- }
- // step 1: generate columns: evaluations and links
- $header_names = $this->datagen->get_header_names($this->offset, $selectlimit);
- $userRowSpan = false;
- foreach ($header_names as $item) {
- if (is_array($item)) {
- $userRowSpan = true;
- break;
- }
- }
- $thAttributes = '';
- if ($userRowSpan) {
- $thAttributes = 'rowspan=2';
- }
- $this->set_header(0, $header_names[0], true, $thAttributes);
- $this->set_header(1, $header_names[1], true, $thAttributes);
- $column = 2;
- $firstHeader = [];
- while ($column < count($header_names)) {
- $headerData = $header_names[$column];
- if (is_array($headerData)) {
- $countItems = count($headerData['items']);
- $this->set_header(
- $column,
- $headerData['header'],
- false,
- 'colspan="'.$countItems.'"'
- );
- foreach ($headerData['items'] as $item) {
- $firstHeader[] = '<span class="text-center">'.$item.'</span>';
- }
- } else {
- $this->set_header($column, $headerData, false, $thAttributes);
- }
- $column++;
- }
- $data_array = $this->datagen->get_data(
- $users_sorting,
- $from,
- $this->per_page,
- $this->offset,
- $selectlimit
- );
- $table_data = [];
- if (!empty($firstHeader)) {
- $table_data[] = $firstHeader;
- }
- $columnOffset = empty($this->datagen->params['show_official_code']) ? 0 : 1;
- foreach ($data_array as $user_row) {
- $user_id = $user_row[0];
- unset($user_row[0]);
- $userInfo = api_get_user_info($user_id);
- if ($is_western_name_order) {
- $user_row[1 + $columnOffset] = $this->build_name_link(
- $user_id,
- $userInfo['firstname']
- );
- $user_row[2 + $columnOffset] = $this->build_name_link(
- $user_id,
- $userInfo['lastname']
- );
- } else {
- $user_row[1 + $columnOffset] = $this->build_name_link(
- $user_id,
- $userInfo['lastname']
- );
- $user_row[2 + $columnOffset] = $this->build_name_link(
- $user_id,
- $userInfo['firstname']
- );
- }
- $user_row = array_values($user_row);
- $table_data[] = $user_row;
- }
- return $table_data;
- }
- /**
- * @param $userId
- * @param $name
- *
- * @return string
- */
- private function build_name_link($userId, $name)
- {
- return '<a href="user_stats.php?userid='.$userId.'&selectcat='.$this->selectcat->get_id().'&'.api_get_cidreq().'">'.$name.'</a>';
- }
- }
|