Intial implementation of class
This commit is contained in:
parent
bb6c7942be
commit
9c8b98682a
1 changed files with 137 additions and 1 deletions
138
Gantt.php
138
Gantt.php
|
@ -25,11 +25,147 @@ class Gantt {
|
|||
**/
|
||||
private $events = array();
|
||||
|
||||
/**
|
||||
* HTML render of our chart
|
||||
* @access private
|
||||
* @var string
|
||||
**/
|
||||
private $html = '';
|
||||
|
||||
/**
|
||||
* List of colors to use for events
|
||||
* @access private
|
||||
* @var array
|
||||
**/
|
||||
private $colors = array();
|
||||
|
||||
/**
|
||||
* Track the number of times we've retrieved colors
|
||||
* @access private
|
||||
* @var integer
|
||||
**/
|
||||
private $color_count = 0;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
**/
|
||||
function __construct() {
|
||||
|
||||
//add a default set of colors
|
||||
$this->add_color('#FF8080');
|
||||
$this->add_color('#99CCFF');
|
||||
$this->add_color('#00FF00');
|
||||
$this->add_color('#FF9900');
|
||||
$this->add_color('#800080');
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an event to be processed
|
||||
* @param string name of the event
|
||||
* @param integer the week to start this event
|
||||
* @param integer duration
|
||||
* @return bool whether or not the event was added successfully
|
||||
**/
|
||||
public function add_event($event, $start, $duration) {
|
||||
// return false if we do not have valid data
|
||||
if(!is_int($start)) return false;
|
||||
if(!is_int($duration)) return false;
|
||||
|
||||
// add the event
|
||||
$this->events[] = (object)array(
|
||||
'event' => $event,
|
||||
'start' => $start,
|
||||
'duration' => $duration,
|
||||
);
|
||||
|
||||
// reset the HTML so it is re-rendered next attempt
|
||||
$this->html = '';
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an HTML Gantt chart from the current events
|
||||
* @return string html for our gantt chart
|
||||
**/
|
||||
public function render_html() {
|
||||
// if we have previously rendered this gantt and have not added
|
||||
// new events, we don't need to do it again and can returned the
|
||||
// cached html
|
||||
if($this->html != '') {
|
||||
return $this->html;
|
||||
}
|
||||
$columns = $this->find_last();
|
||||
|
||||
$this->html = '<table id="gantt">' . "\n";
|
||||
|
||||
// create the header
|
||||
$this->html .= ' <tr>' . "\n";
|
||||
$this->html .= ' <th>Task</th>' . "\n";
|
||||
$this->html .= ' <th>Weeks</th>' . "\n";
|
||||
for($i = 1; $i <= $columns; $i++) {
|
||||
$this->html .= ' <th>' . $i . '</th>' . "\n";
|
||||
}
|
||||
$this->html .= ' </tr>' . "\n";
|
||||
|
||||
// add all the rows
|
||||
foreach($this->events as $event) {
|
||||
$color = $this->get_color();
|
||||
$this->html .= ' <tr>' . "\n";
|
||||
$this->html .= ' <td>' . $event->event . '</td>' . "\n";
|
||||
$this->html .= ' <td>' . $event->duration . '</td>' . "\n";
|
||||
for($i = 1; $i <= $columns; $i++) {
|
||||
if($i >= $event->start && $i < ($event->start + $event->duration)) {
|
||||
$style = ' style="background-color:' . $color . '"';
|
||||
} else {
|
||||
$style = ' style="background-color:#fff"';
|
||||
}
|
||||
$this->html .= ' <td class="colored"'. $style .'> </td>' . "\n";
|
||||
}
|
||||
$this->html .= ' </tr>' . "\n";
|
||||
}
|
||||
$this->html .= '</table>' . "\n";
|
||||
|
||||
return $this->html;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the last column in our Gantt chart
|
||||
* @return integer last column
|
||||
**/
|
||||
private function find_last() {
|
||||
$last = 0;
|
||||
|
||||
foreach($this->events as $event) {
|
||||
$end = $event->start + $event->duration - 1;
|
||||
$last = ($end > $last) ? $end : $last;
|
||||
}
|
||||
|
||||
return $last;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a color to our list
|
||||
* @param string hexadecimal color code
|
||||
* @return bool whether or not the color was added
|
||||
**/
|
||||
public function add_color($color) {
|
||||
// the color was not properly formatted
|
||||
if(preg_match('/^#(?:[0-9a-fA-F]{3}){1,2}$/',$color) == 0) return false;
|
||||
// color is already in the list
|
||||
if(in_array($color,$this->colors)) return false;
|
||||
|
||||
$this->colors[] = $color;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a color to use
|
||||
* @param integer the number of times this function has been called
|
||||
* @return string color code
|
||||
**/
|
||||
private function get_color() {
|
||||
return $this->colors[++$this->color_count % count($this->colors)];
|
||||
}
|
||||
}
|
||||
?>
|
Loading…
Reference in a new issue