smarty-smarty 中显示用户查询图像 (用Jpgraph)
jpgraph在图像处理方面的性能当人没得说,很是方便,但从没有模板这个角度来看的话真的很方便,但是现在WEB应用了Smarty模板引擎之后,这个问题反而显得突出了:
- 用户提交查看表单
- 后台处理用户提交的数据
- 返回图像
问题就出现在第三步,图像在smarty的展示出现问题了,比较困扰。
Any and all enlightenment will be immensely appreciated.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
Smarty是PHP最常使用也非常受开发者欢迎的模板引擎,因为要做的系统的原因,我们还要在系统中使用在图像处理方面很具优势的Jpgraph插件来进行图像的数据化查询。因此,怎么样将两者玩完美地结合应用,是这篇文章的重中之重,希望能对你有所帮助。
起初,我们为了让系统有生机,我把一个已经写好的Jpgraph文件以HTML图像的形式导进模板:
<img src="model/plotline.php">
当然,这样直接显示我们的静态图形即可,说它是静态的,是因为还没有进行数据库的查询,也就没有数据传递了,此处用到的数据只是我在页面中定义的一个数组而已。
然后我们要和数据库取得连接此处使用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}?><img src="model/plotline.php">
<?{elseif $smarty.post.graph eq 1}?><img src="model/dateaxis.php">
<?{/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的核心解决问题最好。