2009-12-05 8 views
0

Actuellement, j'utilise Fusioncharts Free dans mon projet qui nécessite que XML soit dans un format spécifique, à la fois pour l'affichage des données et pour l'apparence du graphique.Meilleures pratiques lors de la génération de données de services Web XML pour PHP

Je dispose d'un fichier PHP appelé webservice.php qui a beaucoup de répétitions similaires du ci-dessous:

$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 
} 

Le XML en sortie peut ressembler à ceci:

<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> 

Il devient un peu un cauchemar de maintenance pour mettre à jour ce code, mais il ne serait pas possible de transférer des données en utilisant un format standard - tel que REST, car Fusioncharts requiert des propriétés XML spécifiques. Y a-t-il de meilleures façons de gérer ce qui précède? Puis-je améliorer facilement la modularité et la maintenabilité de mon code?

Répondre

2

J'ai quelques idées à envisager.

# 1
L'utilisation d'un moteur de modèle, comme Smarty, probablement en faire un peu plus facile à entretenir. Il serait au moins débarrasser du code XML de votre code PHP.

Par exemple, vous pouvez créer un modèle pour le XML extrait de code que vous avez posté:

<?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} 

et l'appeler à partir de PHP comme

<?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
Vous pouvez créer des objets à vous aider à gérer le code. Par exemple, pour générer la même sortie XML comme avant, vous pouvez faire:

<?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; 
    } 
} 
?> 

Et appelez dans votre code principal comme:

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

# 3
Vous pouvez essayer d'utiliser quelque chose comme SimpleXML, mais je doute que cela aiderait beaucoup à la maintenabilité, car il serait tout aussi verbeux que la méthode d'écho

Et # 4
... non, je suis tous dehors :-) Espérons que cela aide.

+0

Merci pour la réponse. Smarty semble être la voie à suivre car je peux juste avoir des modèles pour chaque graphique rendant les choses beaucoup plus faciles à modifier. – CJD