231 lines
		
	
	
	
		
			8.5 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			231 lines
		
	
	
	
		
			8.5 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable file
		
	
	
	
	
| <?php
 | |
| 
 | |
| /**
 | |
|  * File containing timetable class.
 | |
|  *
 | |
|  * @package    block_online_users
 | |
|  * @copyright  1999 onwards Martin Dougiamas (http://dougiamas.com)
 | |
|  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 | |
|  */
 | |
| 
 | |
| namespace block_timetable;
 | |
| 
 | |
| defined('MOODLE_INTERNAL') || die();
 | |
| 
 | |
| /**
 | |
|  * Class used to list and count online users
 | |
|  *
 | |
|  * @package    block_online_users
 | |
|  * @copyright  1999 onwards Martin Dougiamas (http://dougiamas.com)
 | |
|  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 | |
|  */
 | |
| class timetable {
 | |
| 
 | |
|     /** @var array the data of timetable */
 | |
|     public $data;
 | |
| 
 | |
|     /**
 | |
|      * Class constructor
 | |
|      *
 | |
|      * @param string $type The type of the timetable [class, room, teacher]
 | |
|      * @param int $name Name of class or room or teacher
 | |
|      */
 | |
|     public function __construct($type, $name) {
 | |
| 	$this->type = $type;
 | |
| 	$this->name = $name;
 | |
| 	$this->periodmax=0;
 | |
| 	$this->clear_data();
 | |
| //	$this->data = array();
 | |
| //	for ($i=1; $i<=6; $i++) $this->data[$i] = array();
 | |
| 
 | |
|     }
 | |
| 
 | |
|     public function clear_data() {
 | |
| 	$this->data = array();
 | |
| 	for ($i=1; $i<=6; $i++) $this->data[$i] = array();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @param int $week The week of timetable
 | |
|      */
 | |
|     public function read_db($week) {
 | |
|         global $USER, $DB, $CFG;
 | |
| 
 | |
| 	$this->clear_data();
 | |
|         $this->numdayweek = 5 + get_config('timetable', 'saturday');
 | |
| 
 | |
| 	$this->monday = new \DateTime();
 | |
| 	if ($week>0) {
 | |
|         	$this->monday->add(new \DateInterval("P".($week)."W"));
 | |
| 	} elseif ($week<0) {
 | |
| 		$this->monday->sub(new \DateInterval("P".(-$week)."W"));
 | |
| 	}
 | |
| 
 | |
| 	$dayofweek = $this->monday->format('w');
 | |
|         if ($dayofweek > $this->numdayweek) {
 | |
|                 $this->monday->add(new \DateInterval("P".(8-$dayofweek)."D"));
 | |
|         } elseif ($dayofweek < 1) {
 | |
|                 $this->monday->add(new \DateInterval("P1D"));
 | |
|         } else {
 | |
|                 $this->monday->sub(new \DateInterval("P".($dayofweek-1)."D"));
 | |
|         }
 | |
| 
 | |
|         $this->week = $this->monday->format("W");
 | |
|         $this->lastday = new \DateTime($this->monday->format('Y-m-d\TH:i:sP'));
 | |
|         $this->lastday->add(new \DateInterval("P".($this->numdayweek-1)."D"));
 | |
| 
 | |
| 	//$this->content->text .= $monday->format('d.m') . " - " . $lastday->format('d.m');
 | |
| 
 | |
| 	$sql = "$this->type = '$this->name' and not (mid(week, $this->week, 1) = '0')";
 | |
| 	//$sql = "$this->type = '$this->name' and (mid(week, $this->week, 1) = '1')";
 | |
| 	if ($result = $DB->get_records_select('timetable_lesson',$sql)) {
 | |
| 		foreach ($result as $lesson) {
 | |
| 			//if (!exists($this->data[$lesson->day][$lesson->period])) $this->data[$lesson->day][$lesson->period] = array();
 | |
| 			$this->data[$lesson->day][$lesson->period]['lesson'][] = $lesson;
 | |
| 			if ($this->periodmax < $lesson->period) $this->periodmax = $lesson->period;
 | |
| 		}
 | |
| 	}
 | |
| 	$day = new \DateTime($this->monday->format('Y-m-d\TH:i:sP'));
 | |
| 	// TODO CHANGE DATABASE: table substitution: classesa -> classa, classesb -> classb !!!
 | |
| 	for ($i=0; $i<$this->numdayweek; $i++) {
 | |
| 		if ($this->type == 'class') {
 | |
| 			$sql = "date = '".$day->format('Ymd')."' AND ({$this->type}esa LIKE '%{$this->name}%' OR {$this->type}esb LIKE '%{$this->name}%')";
 | |
| 		} else {
 | |
| 			$sql = "date = '".$day->format('Ymd')."' AND ({$this->type}a LIKE '%{$this->name}%' OR {$this->type}b LIKE '%{$this->name}%')";
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 		if ($result = $DB->get_records_select('timetable_substitution',$sql)) {
 | |
| 			foreach ($result as $substitution) {
 | |
| 				$this->data[$i+1][$substitution->period]['substitution'][] = $substitution;
 | |
| 				if ($this->periodmax < $lesson->period) $this->periodmax = $lesson->period;
 | |
| 			}
 | |
| 		}
 | |
| 		$day->add(new \DateInterval("P1D"));
 | |
| 
 | |
|     	}
 | |
|  
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Count the number of online users
 | |
|      *
 | |
|      * @return int
 | |
|      */
 | |
|     public function print_navigation($week) {
 | |
|     /**
 | |
|      * Count the number of online users
 | |
|      *
 | |
|      * @return int
 | |
|      */
 | |
| 	    $table = new \html_table();
 | |
| 	    $table->attributes['class'] = 'minicalendar calendartable calendar-controls';
 | |
| 	    //$table->head = array('','Mo','Di', 'Mi' , 'Do', 'Fr');
 | |
| 	    $tablerow = new \html_table_row();
 | |
| 	    if ($week>0) {
 | |
| 	    	$tablerow->cells[] = new \html_table_cell('<a href="#slide-'.($week-1).'" class="arrow_link previous" title="Vorherige Woche" data-week="-1"><span class="arrow">◄</span></a>');
 | |
| 	    } else {
 | |
| 	    	$tablerow->cells[] = new \html_table_cell('');
 | |
| 	    }
 | |
| 	    $tablerow->cells[] = new \html_table_cell('<a href="#">'.$this->monday->format('d.m') . " - " . $this->lastday->format('d.m').'</a>');
 | |
| 	    if ($week<2) {
 | |
| 	    	$tablerow->cells[] = new \html_table_cell('<a href="#slide-'.($week+1).'" class="arrow_link next" title="Nächste Woche" data-month="8" data-week="1"><span class="arrow">►</span></a>');
 | |
| 	    } else {
 | |
| 	    	$tablerow->cells[] = new \html_table_cell('');
 | |
| 	    }
 | |
| 
 | |
| 
 | |
| 	    $table->data[] = $tablerow;
 | |
| 	return \html_writer::table($table);
 | |
| 
 | |
|     }
 | |
| 
 | |
|     public function get_caption($week) {
 | |
| 	    $result = "";
 | |
| 	    if ($week>0) {
 | |
| 	    	//$result .= '<a href="#slide-'.($week-1).'" class="arrow_link previous" title="Vorherige Woche" data-week="-1"><span class="arrow">◄</span></a>';
 | |
| 	    	$result .= '<a href="javascript:M.block_timetable.scroll_week('.($week-1).');" class="arrow_link previous" title="Vorherige Woche"  data-week="1"><span class="arrow">◄<</span></a>';
 | |
| 	    } else {
 | |
| 	    	$result .=  '<a href="#" class="previous" style="visibility:hidden" data-week="-1"></A>';
 | |
| 	    	//$result .= '<a href="#" class="arrow_link previous" data-week="-1"><span class="arrow" style="display:none"></span></a>';
 | |
| 	    }
 | |
| 	    $result .= '<span class="hide"> | </span>';
 | |
| 	    $result .= '<span class="current">';
 | |
| 	    $result .= '<a href="#">'.$this->monday->format('d.m') . " - " . $this->lastday->format('d.m').'</a>';
 | |
| 	    $result .= "</span>";
 | |
| 	    $result .= '<span class="hide"> | </span>';
 | |
| 	    if ($week<2) {
 | |
| 	    	//$result .= '<a href="#slide-'.($week+1).'" class="arrow_link next" title="Nächste Woche" data-month="8" data-week="1"><span class="arrow">►</span></a>';
 | |
| 	    	$result .= '<a href="javascript:M.block_timetable.scroll_week('.($week+1).');" class="arrow_link next" title="Nächste Woche" data-month="8" data-week="1"><span class="arrow">►</span></a>';
 | |
| 	    } else {
 | |
| 	    	$result .= '';
 | |
| 	    }
 | |
| 	return $result;
 | |
| 
 | |
|     }
 | |
| 
 | |
| 
 | |
|     public function print_table($view,$week) {
 | |
| 	global $DB;
 | |
| 	//var_dump($this->data[1]);
 | |
| 	$numperiod = get_config('timetable', 'numperiod');
 | |
| 	$numdayweek = 5 + get_config('timetable', 'saturday');
 | |
| 	if ($this->periodmax>$numperiod) $numperiod = $this->periodmax;
 | |
| 	$table = new \html_table();
 | |
| 	//$table->attributes['class'] = "minicalendar calendartable generaltable timetable_view_$view";
 | |
| 	$table->attributes['class'] = "minicalendar calendartable generaltable timetable_view_$view";
 | |
| 	$table->caption = "<div class='calendar-controls'>".$this->get_caption($week)."</div>";
 | |
| 	//$table->style = 'display: none;';
 | |
| 	$table->head = array('','Mo','Di', 'Mi' , 'Do', 'Fr');
 | |
| 	if ($numdayweek == 6) $table->head[] = 'Sa';
 | |
| 	for ($i = 1; $i<=$numperiod; $i++) {
 | |
| 		$tablerow = new \html_table_row();
 | |
| 		$cell = new \html_table_cell($i);
 | |
| 		$cell->style = 'font-weight: bold;';
 | |
| //		$cell->attributes['class'] = 'header';
 | |
| 		$tablerow->cells[] = $cell;
 | |
| 		for ($k = 1; $k <= $numdayweek; $k++) {
 | |
| 			$flag = 0;
 | |
| 			if (array_key_exists($i,$this->data[$k]) && array_key_exists('lesson',$this->data[$k][$i])) {
 | |
| 				$content = "";
 | |
| 				foreach ($this->data[$k][$i]['lesson'] as $lesson) {
 | |
| 					if ($content) $content .= "<br>";
 | |
| 					if ($lesson->flag) $content .= "<span style='color:red;'>";
 | |
| 					//if (substr($lesson->week,$this->week,1) == '1') $content .= $lesson->{$view};
 | |
| 					if ($lesson->week[$this->week-1] == '1') {
 | |
| 						if ($lesson->{$view}) {
 | |
| 							$content .= $lesson->{$view};
 | |
| 						} else {
 | |
| 							$content .= "+++";
 | |
| 						} 
 | |
| 					}
 | |
| 					if ($lesson->week[$this->week-1] == 'x') $content .= "---";
 | |
| 					if ($lesson->flag) $content .= "</span>";
 | |
| 					$flag += $lesson->flag;
 | |
| 				}
 | |
| 			} else {
 | |
| 				$content = "-";
 | |
| 			}
 | |
| 			$subtxt = "";
 | |
| 			if (array_key_exists($i,$this->data[$k]) && array_key_exists('substitution', $this->data[$k][$i])) {
 | |
| 				foreach ($this->data[$k][$i]['substitution'] as $substitution) {
 | |
| 					$subtxt .= $substitution->text;
 | |
| 				}
 | |
| 				if ($subtxt) {
 | |
| 					$content = "<a href='#' data-toggle='tooltip' title='$subtxt'>$content</a>";
 | |
| 					//$content .= "<span class='tooltiptext'>$subtxt</span>";
 | |
| 				}
 | |
| 			}
 | |
| 			$cell = new \html_table_cell($content);
 | |
| //			if ($flag) $cell->style = 'color: red;';
 | |
| 			//if (array_key_exists($i, $this->data[$k] ) && array_key_exists('substitution', $this->data[$k][$i])) $cell->attributes['class'] = 'tooltip';
 | |
| 			$tablerow->cells[] = $cell;
 | |
| 		}
 | |
| 		$table->data[] = $tablerow;
 | |
| 	}
 | |
| 	return \html_writer::table($table);
 | |
|     }
 | |
| 
 | |
| }
 | 
