Smarty中處理Jpgraph影像技術

馮宗寶發表於2013-11-15

  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的核心解決問題最好。

相關文章