Intial implementation of class

This commit is contained in:
Andrew Tomaka 2011-10-26 12:20:38 -04:00
parent bb6c7942be
commit 9c8b98682a

138
Gantt.php
View file

@ -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 .'>&nbsp;</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)];
}
}
?>