Smarty是PHP最常使用也非常受开发者欢迎的模板引擎,因为要做的系统的原因,我们还要在系统中使用在图像处理方面很具优势的Jpgraph插件来进行图像的数据化查询。因此,怎么样将两者玩完美地结合应用,是这篇文章的重中之重,希望能对你有所帮助。   起初,我们为了让系统有生机,我把一个已经写好的Jpgraph文件以HTML图像的形式导进模板:   

  当然,这样直接显示我们的静态图形即可,说它是静态的,是因为还没有进行数据库的查询,也就没有数据传递了,此处用到的数据只是我在页面中定义的一个数组而已。   然后我们要和数据库取得连接此处使用PDO的方式进行连接,最终取得的结果就是下面语句中的$conn。然后构造查询语句,取得数据,也就是这句话:   

$arrData['data']=$data->fetchAll();

  下面的几步是用来取其他数据的,总之呢,这个页面就是处理获取数据的://module_*_php.php

//查询数据库 
//详细数据 and 提交时间
$sql_graph="select data,submit_date from  data
where node_id ='$node'";
$data=$conn->query($sql_graph);
$arrData['data']=$data->fetchAll();

//数据量的情况
$rows=$data->rowCount();
//获取数据类型
$sql_type="select node.node_name,node.alert,data_type.data_type_title,data_type.unit  from node 
        LEFT JOIN `data_type`
        ON node.data_type_id=data_type.data_type_id
        where node_id='$node'";

$type=$conn->query($sql_type)->fetchAll();
//数据类型
 $_SESSION['type']=$type[0]['data_type_title'];

//数据单位 $_SESSION['u']=$type[0]['unit']; //节点名称 $_SESSION['node']=$type[0]['node_name']; $_SESSION['alert']=$type[0]['alert'];//节点阈值

  一般的情况,应该是将处理完的数据放在这个页面,然后交由本页面生成图像,但是这个地方因为SMARTY的原因,我是将处理结果通过SESSION的方式传递到了jpgraph的plotline.php进行处理并生成图像的。其实这个过程做起来不难,当时想的时候就有些问题了,上网查了好久还是没能解决,足足熬了一天,才将这个问题想透彻:问题就在这里,怎么样将查询数据库的结果传递到这个页面,在smarty社区有这样一位兄台,他是自己写了一个smarty自定义的函数,用来完成这样一个自动生成图像的函数,直接在模板页面调用,调用的时候当然还有参数之类的。但是方法是有了,他自己提问了1年之后自己有回复了一下,说自己只是找到自己的DB类出现了个小问题,但还是不能成功我以为麻烦了,经过细心研究,发现我之前用的那个办法其实就是最好的办法,将数据通过SESSION传递到plotline.php,然后处理即可。

Plotline.php: //数据来自graph_model.php session_start(); $datay=$_SESSION['datay']; $date_original=$_SESSION['date_original']; // print_r($date_original); $type=$_SESSION['type']; $unit=$_SESSION['u']; $node=$_SESSION['node']; $alert=$_SESSION['alert']; //将获取的数据处理成下面的数组形式 // $datay=array(23,33,25,40,20,50,70); // Create the graph. $graph = new Graph(980,400,'auto'); $graph->SetScale("textlin"); $graph->SetMargin(50,20,50,70); $graph->SetShadow(); $graph->legend->SetPos(0.5,0.97,'center','bottom');

$graph->title->Set($node.'单站含阈值柱状图');//节点名称 标注 // $graph->title->SetFont(FF_ARIAL,FS_BOLD,14); $graph->title->SetFont(FF_FONT1,FS_BOLD); $graph->title->SetFont(FF_SIMSUN,FS_BOLD,12);

$graph->subtitle->SetFont(FF_SIMSUN,FS_BOLD,10); $graph->subtitle->Set('(横轴为数据入库时间,纵轴为数据值)');

//x $graph->xaxis->title->Set("时间轴(入库时间)"); $graph->xaxis->title->setfont(FF_SIMSUN,FS_BOLD,10); $graph->xaxis->SetFont(FF_SIMSUN,FS_BOLD); // $graph->xaxis->SetLabelAngle(90); //yaxis $graph->yaxis->title->Set($type."/".$unit);//数据类型与数据单位 标注 $graph->yaxis->title->setfont(FF_SIMSUN,FS_BOLD,10); $graph->yaxis->SetFont(FF_SIMSUN,FS_BOLD);

// Create a bar pot $bplot = new BarPlot($datay); $bplot->value->Show(); $bplot->value->SetFont(FF_VERDANA,FS_BOLD,8); $bplot->SetValuePos('top'); $bplot->SetLegend("节点".$type."实值");

$graph->Add($bplot); //阈值部分设置 $pline = new PlotLine(HORIZONTAL,$alert,'red',4);//阈值部分 $pline->SetLegend('阈值');

$graph->legend->SetColumns(10); $graph->legend->SetFont(FF_SIMSUN,FS_BOLD,10);

$graph->Add($pline); $graph->Stroke();

模板页面:

<?{if !empty($arrData.img)}?> <?{if $smarty.post.graph eq 2}?> <?{elseif $smarty.post.graph eq 1}?> <?{/if}?> <?{html_image file=templates/images/okk.png }?>Generated by Mine Hydrogeology System <?{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}?> <?{/if}?>

  我还尝试过将数据在模板页面通过GET方式提交到plotlinr.php的方法。但这样的话因为传递的总是一个数组,所以试过多次之后总是不能成功,也就放弃了,也算是个经验之谈:这样的数据数组怎么能通过GET方式来传递呢,PHP最强势的地方不就是处理数据吗?还是抓住PHP的核心解决问题最好。