00001 <?php
00025 class chartService
00026 {
00032 public $m_PlotList;
00033
00040 function __construct(&$xmlArr)
00041 {
00042 }
00043
00050 Public function render($objName)
00051 {
00052
00053 $chartName = BizSystem::clientProxy()->getFormInputs("__this");
00054
00055
00056 $formObj = BizSystem::getObject($objName);
00057 $bizDataObj = $formObj->getDataObj();
00058
00059
00060 $chartXmlFile = BizSystem::GetXmlFileWithPath($objName."_chart");
00061 $xmlArr = BizSystem::getXmlArray($chartXmlFile);
00062
00063 ob_clean();
00064
00065 foreach($xmlArr["BIZFORM_CHART"]["CHARTLIST"]["CHART"] as $chart)
00066 {
00067 if (count($xmlArr["BIZFORM_CHART"]["CHARTLIST"]["CHART"]) == 1)
00068 $chart = $xmlArr["BIZFORM_CHART"]["CHARTLIST"]["CHART"];
00069
00070 if (($chartName && $chart["ATTRIBUTES"]["NAME"] == $chartName) || !$chartName)
00071 {
00072 if ($chart["ATTRIBUTES"]["GRAPHTYPE"] == 'XY')
00073 {
00074 $this->xyGraphRender($bizDataObj, $chart);
00075 break;
00076 }
00077 if ($chart["ATTRIBUTES"]["GRAPHTYPE"] == 'Pie')
00078 {
00079 $this->pieGraphRender($bizDataObj, $chart);
00080 break;
00081 }
00082 }
00083 }
00084 }
00085
00094 public function &getPlotData(&$bizObj, $fields, $labelField)
00095 {
00096 $oldCacheMode = $bizObj->GetCacheMode();
00097 $bizObj->SetCacheMode(0);
00098 $bizObj->runSearch(-1);
00099 while (1)
00100 {
00101 $recArray = $bizObj->GetRecord(1);
00102 if (!$recArray) break;
00103 $bizObj->UnformatInputRecArr($recArray);
00104
00105 foreach($fields as $fld)
00106 $recMatrix[$fld][] = $recArray[$fld];
00107 $recMatrix[$labelField][] = $recArray[$labelField];
00108 }
00109 $bizObj->SetCacheMode($oldCacheMode);
00110 return $recMatrix;
00111 }
00112
00120 public function xyGraphRender(&$bizObj, &$xmlArr)
00121 {
00122 include_once (JPGRAPH_DIR.'/jpgraph.php');
00123
00124 $graph = new Graph($xmlArr["ATTRIBUTES"]["WIDTH"],$xmlArr["ATTRIBUTES"]["HEIGHT"],"auto");
00125
00126 $graph->SetScale("textlin");
00127 $graph->yaxis->scale->SetGrace(10);
00128 list($m1, $m2, $m3, $m4) = explode(',', $xmlArr["ATTRIBUTES"]["MARGIN"]);
00129 $graph->img->SetMargin($m1, $m2, $m3, $m4);
00130
00131
00132 foreach($xmlArr['DATASET']['DATA'] as $dtmp)
00133 {
00134 if ($xmlArr['DATASET']['DATA']['ATTRIBUTES'])
00135 $dtmp = $xmlArr['DATASET']['DATA'];
00136 $fieldName = $dtmp["ATTRIBUTES"]["FIELD"];
00137 if ($fieldName)
00138 $fields[$fieldName] = $fieldName;
00139 }
00140
00141 $labelFld = $xmlArr['XAXIS']['ATTRIBUTES']['LABELFIELD'];
00142
00143 $recArray = &$this->getPlotData($bizObj, $fields, $labelFld);
00144
00145 $i = 0;
00146 foreach($xmlArr['DATASET']['DATA'] as $dtmp)
00147 {
00148 if ($xmlArr['DATASET']['DATA']['ATTRIBUTES'])
00149 $dtmp = $xmlArr['DATASET']['DATA'];
00150 $data = $recArray[$dtmp["ATTRIBUTES"]["FIELD"]];
00151 $plot = $this->renderXYPlot($data, $dtmp);
00152 if ($plot)
00153 $graph->Add($plot);
00154 $i++;
00155 }
00156
00157
00158 $graph->title->Set($xmlArr['TITLE']['ATTRIBUTES']['CAPTION']);
00159 $this->_drawString($graph->title,$xmlArr['TITLE']['ATTRIBUTES']['FONT'],$xmlArr['TITLE']['ATTRIBUTES']['COLOR']);
00160
00161
00162 $this->_drawAxis($graph->xaxis, $recArray[$labelFld],
00163 $xmlArr['XAXIS']['ATTRIBUTES']['FONT'], $xmlArr['XAXIS']['ATTRIBUTES']['COLOR'],
00164 $xmlArr['XAXIS']['ATTRIBUTES']['LABELANGLE'], $xmlArr['XAXIS']['ATTRIBUTES']['TITLE'],
00165 $xmlArr['XAXIS']['ATTRIBUTES']['TITLEFONT'], $xmlArr['XAXIS']['ATTRIBUTES']['TITLECOLOR'],
00166 $xmlArr['XAXIS']['ATTRIBUTES']['TITLEMARGIN']);
00167
00168 $this->_drawAxis($graph->yaxis, null,
00169 $xmlArr['YAXIS']['ATTRIBUTES']['FONT'], $xmlArr['YAXIS']['ATTRIBUTES']['COLOR'],
00170 $xmlArr['YAXIS']['ATTRIBUTES']['LABELANGLE'], $xmlArr['YAXIS']['ATTRIBUTES']['TITLE'],
00171 $xmlArr['YAXIS']['ATTRIBUTES']['TITLEFONT'], $xmlArr['YAXIS']['ATTRIBUTES']['TITLECOLOR'],
00172 $xmlArr['YAXIS']['ATTRIBUTES']['TITLEMARGIN']);
00173
00174
00175 $this->_drawLegend($graph->legend,$xmlArr['LAGEND']['ATTRIBUTES']['POSITION'],
00176 $xmlArr['LAGEND']['ATTRIBUTES']['LAYOUT'], $xmlArr['legend']['ATTRIBUTES']['FONT'],
00177 $xmlArr['LAGEND']['ATTRIBUTES']['COLOR'], $xmlArr['legend']['ATTRIBUTES']['FILLCOLOR']);
00178 $graph->Stroke();
00179 }
00180
00188 public function pieGraphRender(&$bizObj, &$xmlArr)
00189 {
00190 include_once (JPGRAPH_DIR.'/jpgraph.php');
00191 include_once (JPGRAPH_DIR.'/jpgraph_pie.php');
00192 include_once (JPGRAPH_DIR.'/jpgraph_pie3d.php');
00193
00194 $graph = new PieGraph($xmlArr["ATTRIBUTES"]["WIDTH"],$xmlArr["ATTRIBUTES"]["HEIGHT"]);
00195
00196
00197
00198 $fields[0] = $xmlArr['DATASET']['DATAPIE']["ATTRIBUTES"]["FIELD"];
00199 $legendFld = $xmlArr['DATASET']['DATAPIE']["ATTRIBUTES"]["LEGENDFIELD"];
00200
00201 $recArray = &$this->getPlotData($bizObj, $fields, $legendFld);
00202
00203 $chartData = $xmlArr['DATASET']['DATAPIE'];
00204 $plot = $this->renderPiePlot($recArray[$fields[0]], $chartData);
00205 $plot->SetLegends($recArray[$legendFld]);
00206 $graph->Add($plot);
00207
00208
00209 $graph->title->Set($xmlArr['TITLE']['ATTRIBUTES']['CAPTION']);
00210 $this->_drawString($graph->title,$xmlArr['TITLE']['ATTRIBUTES']['FONT'],$xmlArr['TITLE']['ATTRIBUTES']['COLOR']);
00211
00212
00213 $this->_drawLegend($graph->legend,$xmlArr['LEGEND']['ATTRIBUTES']['POSITION'],
00214 $xmlArr['LEGEND']['ATTRIBUTES']['LAYOUT'], $xmlArr['LEGEND']['ATTRIBUTES']['FONT'],
00215 $xmlArr['LEGEND']['ATTRIBUTES']['COLOR'], $xmlArr['LEGEND']['ATTRIBUTES']['FILLCOLOR']);
00216 $graph->Stroke();
00217 }
00218
00226 public function renderXYPlot(&$data, &$xmlArr)
00227 {
00228 $id = $xmlArr['ATTRIBUTES']['ID'];
00229 $field = $xmlArr['ATTRIBUTES']['FIELD'];
00230 $chartType = $xmlArr['ATTRIBUTES']['CHARTTYPE'];
00231 $pointType = $xmlArr['ATTRIBUTES']['POINTTYPE'];
00232 $weight = $xmlArr['ATTRIBUTES']['WEIGHT'];
00233 $color = $xmlArr['ATTRIBUTES']['COLOR'];
00234 $fillColor = $xmlArr['ATTRIBUTES']['FILLCOLOR'];
00235 $showVal = $xmlArr['ATTRIBUTES']['SHOWVALUE'];
00236 $legend = $xmlArr['ATTRIBUTES']['LEGENDFIELD'];
00237 $visible = $xmlArr['ATTRIBUTES']['VISIBLE'];
00238
00239 if ($chartType == 'Line' or $chartType == 'Bar')
00240 {
00241 if ($chartType == 'Line')
00242 {
00243 include_once (JPGRAPH_DIR.'/jpgraph_line.php');
00244 $plot = new LinePlot($data);
00245 $this->_drawMark($plot->mark,
00246 $xmlArr['POINTMARK']['ATTRIBUTES']['TYPE'], $xmlArr['POINTMARK']['ATTRIBUTES']['COLOR'],
00247 $xmlArr['POINTMARK']['ATTRIBUTES']['FILLCOLOR'], $xmlArr['POINTMARK']['ATTRIBUTES']['SIZE']);
00248 $plot->SetBarCenter();
00249 $plot->SetCenter();
00250 }
00251 else if ($chartType == 'Bar')
00252 {
00253 include_once (JPGRAPH_DIR.'/jpgraph_bar.php');
00254 $plot = new BarPlot($data);
00255 $plot->SetAlign('center');
00256 }
00257 if ($color) $plot->SetColor($color);
00258 if ($fillColor) $plot->SetFillColor($fillColor);
00259 if ($weight) $plot->SetWeight($weight);
00260 if ($showVal == 1) $plot->value->Show();
00261 if ($legend) $plot->SetLegend($legend);
00262 $this->_drawString($plot->value,$xmlArr['VALUE']['ATTRIBUTES']['FONT'],$xmlArr['VALUE']['ATTRIBUTES']['COLOR']);
00263 }
00264
00265 if ($chartType == 'GroupBar' or $chartType == 'AccBar')
00266 {
00267 $children = $xmlArr['ATTRIBUTES']['CHILDREN'];
00268 $childList = explode(",",$children);
00269 foreach($childList as $child)
00270 {
00271 $childPlotList[] = $this->m_PlotList[$child];
00272 }
00273 if ($chartType == 'GroupBar')
00274 $plot = new GroupBarPlot($childPlotList);
00275 else if ($chartType == 'AccBar')
00276 $plot = new AccBarPlot($childPlotList);
00277 }
00278
00279 $this->m_PlotList[$id] = $plot;
00280
00281 if ($visible == 1)
00282 return $plot;
00283 return null;
00284 }
00285
00293 public function renderPiePlot(&$data, &$xmlArr)
00294 {
00295 $id = $xmlArr['ATTRIBUTES']['ID'];
00296 $field = $xmlArr['ATTRIBUTES']['FIELD'];
00297 $chartType = $xmlArr['ATTRIBUTES']['CHARTTYPE'];
00298 $size = $xmlArr['ATTRIBUTES']['SIZE'];
00299 $center = $xmlArr['ATTRIBUTES']['CENTER'];
00300 $height = $xmlArr['ATTRIBUTES']['HEIGHT'];
00301 $angle = $xmlArr['ATTRIBUTES']['ANGLE'];
00302 $labelPos = $xmlArr['ATTRIBUTES']['LABELPOS'];
00303 $legendField = $xmlArr['ATTRIBUTES']['LAGENDFIELD'];
00304
00305 if ($chartType == "Pie")
00306 {
00307 $plot = new PiePlot($data);
00308 $plot->SetLabelPos($labelPos);
00309 }
00310 else if ($chartType == "Pie3D")
00311 {
00312 $plot = new PiePlot3D($data);
00313 $plot->SetHeight($height);
00314 $plot->SetAngle($angle);
00315 }
00316 list($c1, $c2) = explode(',', $center);
00317 $plot->SetCenter($c1,$c2);
00318 $plot->SetSize($size);
00319
00320 $this->_drawString($plot->value,$xmlArr['VALUE']['ATTRIBUTES']['FONT'],$xmlArr['VALUE']['ATTRIBUTES']['COLOR']);
00321
00322 return $plot;
00323 }
00324
00332 private function _drawString(&$g, $font=null, $color=null)
00333 {
00334 if ($font)
00335 {
00336 list($ft,$fs,$size) = explode(",",$font);
00337 $g->SetFont($this->_getFont($ft),$this->_getFontStyle($fs),$size);
00338 }
00339 if ($color) $g->SetColor($color);
00340 }
00341
00349 private function _drawLegend(&$g, $pos, $layout, $font, $color, $fcolor)
00350 {
00351 $this->_drawString($g,$font,$color);
00352 if ($fcolor) $g->SetFillColor($fcolor);
00353 if ($pos)
00354 {
00355 list($x,$y,$hap,$vap) = explode(",",$pos);
00356 $g->SetPos($x,$y,$hap,$vap);
00357 }
00358 if ($layout && $layout == 'HOR')
00359 {
00360 $g->SetLayout(LEGEND_HOR);
00361 }
00362 }
00363
00371 private function _drawAxis(&$g, $labels, $font, $color, $labelAng, $title, $titleFont, $titleColor, $titleMargin)
00372 {
00373 $this->_drawString($g,$font, $color);
00374 if ($title) $g->title->Set($title);
00375 $this->_drawString($g->title,$titleFont, $titleColor);
00376 if ($labels) $g->SetTickLabels($labels);
00377 if ($labelAng) $g->SetLabelAngle($labelAng);
00378 if ($titleMargin) $g->SetTitleMargin($titleMargin);
00379 }
00380
00388 private function _drawMark(&$g, $type, $color, $fcolor, $size)
00389 {
00390 if ($type) $g->SetType($this->_getMark($type));
00391 if ($color) $g->SetColor($color);
00392 if ($fcolor) $g->SetFillColor($fcolor);
00393 if ($size) $g->SetSize($size);
00394 }
00395
00403 private function _getMark($mark)
00404 {
00405 switch (strtoupper($mark))
00406 {
00407 case "SQUARE": return MARK_SQUARE;
00408 case "UTRIANGLE": return MARK_UTRIANGLE;
00409 case "DTRIANGLE": return MARK_DTRIANGLE;
00410 case "DIAMOND": return MARK_DIAMOND;
00411 case "CIRCLE": return MARK_CIRCLE;
00412 case "FILLEDCIRCLE": return MARK_FILLEDCIRCLE;
00413 case "CROSS": return MARK_CROSS;
00414 case "STAR": return MARK_STAR;
00415 case "X": return MARK_X;
00416 default: return 0;
00417 }
00418 }
00419
00427 private function _getFont($font)
00428 {
00429 switch (strtoupper($font))
00430 {
00431 case "ARIAL": return FF_ARIAL;
00432 case "COURIER;": return FF_COURIER;
00433 case "TIMES": return FF_TIMES;
00434 case "VERDANA": return FF_VERDANA;
00435 case "COMIC": return FF_COMIC;
00436 case "GEORGIA": return FF_GEORGIA;
00437 default: return FF_FONT1;
00438 }
00439 }
00440
00441
00449 private function _getFontStyle($fontStyle)
00450 {
00451 switch (strtoupper($fontStyle))
00452 {
00453 case "NORMAL": return FS_NORMAL;
00454 case "BOLD": return FS_BOLD;
00455 case "ITALIC": return FS_ITALIC;
00456 case "BOLDITALIC": return FS_BOLDITALIC;
00457 default: return FS_NORMAL;
00458 }
00459 }
00460 }
00461
00462 ?>