0

私は現在、プロジェクトでFusioncharts Freeを使用しています。これには、データの表示とグラフの表示の両方でXMLを特定の形式にする必要があります。

私はwebservice.phpと呼ばれるPHPファイルを持っています。これには以下の多くの同様の繰り返しがあります。

$address = $_SERVER['PHP_SELF'];

...

if ($address == 'webService.php/fcf/last5pricechanges/'){
//query MySQL DB and build up XML string in $output variable to output to browser
//building up each line of XML more or less line by line
}

出力されるXMLは次のようになります。

<graph caption="Active Items - Grouped by Site" showNames="1" decimalPrecision="0" bgcolor="eeeeee">
<set name="xyz.co.uk" value="1"/>
<set name="abc.com" value="5"/>
</graph>

このコードを更新することはメンテナンスの悪夢になりつつありますが、Fusionchartsは特定のXMLプロパティを必要とするため、RESTなどの標準形式を使用してデータを転送することはできません。上記を処理するためのより良い方法はありますか?コードのモジュール性と保守性を簡単に改善できますか?

4

1 に答える 1

2

私はあなたが考えることができるいくつかのアイデアを持っています。

#1 Smarty
のようなテンプレートエンジンを使用すると、おそらくこれを維持するのが少し簡単になります。少なくともPHPコードからXMLを取り除くでしょう。

たとえば、投稿したXMLスニペットのテンプレートを作成できます。

<?xml version="1.0" encoding="UTF-8" ?>
{foreach from=$graphs item=graph}
    <graph caption="{$graph.caption}" showNames="{$graph.show_names}" decimalPrecision="{$graph.decimal_precision}" bgcolor="{$graph.bg_color}">
    {foreach from=$graph.set item=set}
        <set name="{$set.name}" value="{$set.value}"/>
    {/foreach}
    </graph>
{/foreach}

そしてそれをPHPから次のように呼びます

<?php
$address = $_SERVER['PHP_SELF'];

$smart = new Smarty();
$graphs = array();

if ($address == 'webService.php/fcf/last5pricechanges/')
{
    $graph_result = mysql_query("SELECT caption, show_names, decimal_precision, bg_color
                                 FROM graph WHERE something='something else'");
    while($graph_row = mysql_fetch_assoc($graph_result))
    {
        $graph_row;
        $set_result = mysql_query("SELECT name, value FROM set WHERE graph_id = {$graph_row['id']}");
        while($set_row = mysql_fetch_assoc($set_result))
        {
            $graph_row['sets'][] = $set_row;
        }
        $graphs[] = $graph_row;
    }
}

$smarty->assign('graphs', $graphs);
$smarty->display('graph_template.tpl');
?>

#2
コードの管理に役立つオブジェクトを作成できます。たとえば、以前と同じXML出力を生成するには、次のようにします。

<?php
class Graph
{
    protected $caption;
    protected $show_names;
    protected $decimal_precision;
    protected $bg_color;

    protected $sets;

    public function __construct($graph_id)
    {
        $graph_result = mysql_query("SELECT caption, show_names, decimal_precision_bg_color
                                 FROM graph WHERE something='something else'");
        while($graph_row = mysql_fetch_assoc($graph_result))
        {
            list($this->caption, $this->show_names, $this->decimal_precision, $this->bg_color) = $graph_result;
            $set_result = mysql_query("SELECT name, value FROM set WHERE graph_id = {$graph_row['id']}");
            while($set_row = mysql_fetch_assoc($set_result))
            {
                $this->sets[] = $set_row;
            }
        }
    }

    public function fetch_xml()
    {
        $output  = '<?' . 'xml version="1.0" encoding="UTF-8" ?' . '>';
        $output .= "<graph caption=\"{$this->caption}\" showNames=\"{$this->show_names}\" decimalPrecision=\"{$this->decimal_precision}\" bgcolor=\"{$this->bg_color}\">\n";
        foreach($this->sets as $set)
        {
            $output .= "<set name=\"{$set->name}\" value=\"{$set->value}\"/>\n";
        }
        $output .= "</graph>";
        return $output;
    }
}
?>

そして、次のようにメインコードで呼び出します。

<?php
$address = $_SERVER['PHP_SELF'];
if ($address == 'webService.php/fcf/last5pricechanges/')
{
    $graph = new Graph(1);
    echo $graph->fetch_xml();
}
?>

#3 SimpleXML
の ようなものを試してみることができますが、echoメソッドと同じくらい冗長になるため、保守性に大いに役立つとは思えません。

そして#4
...いいえ、私はすべて出ています:-)それが役立つことを願っています。

于 2009-12-05T20:37:30.873 に答える