Utiliter des flux XML des guildes, cas pratique

Répondre
Partager Rechercher
Ok je decortique

Ingredients :

- 2 script php
- 1 base de donnée Mysql (ou postgres me demander dans ce cas la)
- L'url de ton fichier xml de vgplayer
- Du temps et un peu de patience

Recette :

Tous d'abord creer toi la table avec cette requete SQL (pour mysql) :

Code:
CREATE TABLE `listmember` (
`lm_key` VARCHAR( 32 ) NOT NULL ,
`lm_rank` VARCHAR( 20 ) NOT NULL ,
`lm_adclass` VARCHAR( 20 ) NOT NULL ,
`lm_adlvl` INT( 8 ) NOT NULL ,
`lm_crclass` VARCHAR( 20 ) NOT NULL ,
`lm_crlvl` INT( 20 ) NOT NULL ,
`lm_name` VARCHAR( 50 ) NOT NULL
) ENGINE = MYISAM ;
Ensuite on commence le premier ficher php. Ce fichier a pour but de recuperer les donner du ficher xml de ta guilde et de rentrer ces donnée dans la BDD

Change les donnée en rouge
Citation :
$xml = "http://vgplayers.station.sony.com/includes/guilds/guildsRosterXML.vm?guildId=111669149893";

$error_vg = false ;
$fp = fopen($xml, "r") or $error_vg = true;
if ($error_vg) {
}else{
while (!feof($fp)) { $data .= fgets($fp, 2048); }
fclose($fp);

// Déclaration de la fonction récursive ParseNode()
function ParseNode($node, &$array)
{
global $id;
$childnodes = $node->child_nodes();

foreach ($childnodes as $childnode) {
if (trim($childnode->tagname) == "id") {
$id = $childnode->get_content();
}
elseif (trim($childnode->tagname) != "") {
ParseNode($childnode, $array);
}
elseif (trim($childnode->node_name()) == "#text" && trim($childnode->get_content()) != "") {
$array[$id][$node->tagname] = $childnode->get_content();
}
}
}

// Parsing du document XML via la fonction ParseNode()
$domdoc = domxml_open_mem($data);
$root = $domdoc->document_element();
$arraydoc = array();

ParseNode($root, $arraydoc);


$link = mysql_connect("adresse du server de la bdd", "nom utilisateur", "mot de passe")or die("Impossible de se connecter");
mysql_select_db("nom de la BDD") or die("Could not select database");
echo "Connection DB ok\n" ;

$query = "TRUNCATE table listmember" ;
$result = mysql_query($query) or die("Query failed");
echo "Table listmember vidée\n" ;

while ($member = current($arraydoc)) {
if (strcmp($member['name'],'nom de ta guilde')) {
$key=key($arraydoc) ;
$query = "insert into listmember (lm_key,lm_rank,lm_adclass,lm_adlvl,lm_crclass,lm_crlvl,lm_name) values (\"$key\",\"".$member['guildRank']."\",\"".$member['adventureClass']."\",".$member['adventureLevel'].",\"".$member['craftingClass']."\",".$member['craftingLevel'].",\"".$member['name']."\");" ;
$result = mysql_query($query) or die("Query failed");
echo "Ligne $key ajoutée\n" ;
}
next($arraydoc) ;
}
mysql_close($link);
}
?>
Enfin il faut l'afficher dans un script php, voici un code a inserer dans une page :

Change les donnée en rouge
Citation :
$link = mysql_connect("adresse du server de la bdd", "nom utilisateur", "mot de passe")or die("Impossible de se connecter");
mysql_select_db("nom de la BDD") or die("Could not select database");
$str_member = "<table><tr><td>Nom</td><td>Aventurier</td><td>Artisant</td></tr>" ;
$query = "select * from listmember order by lm_rank" ;
$result = mysql_query($query) or die("Query failed");
while ($row = mysql_fetch_assoc($result)) {
$str_member = $str_member."<tr><td>";
$str_member = $str_member."<a href=\"http://vgplayers.station.sony.com/characters.vm?characterId=".$row['lm_key']."\">".$row['lm_rank']." <b>".$row['lm_name']."</b></a></td>" ;
$ad_name = explode(" ",$row['lm_adclass']) ;
$ad_name[0] == "Dread" ? $ad_name[0] = "Dread Knight" : $ad_name[0] = $ad_name[0] ;
$str_member = $str_member."<td>".$ad_name[0]." niveau ".$row['lm_adlvl']."</td>" ;
$cr_name = explode(" ",$row['lm_crclass']) ;
$str_member = $str_member."<td>".$cr_name[0]." niveau ".$row['lm_crlvl']."</td>" ;
$str_member = $str_member."</tr>";
}
$str_member = $str_member."</table>";
mysql_close($link);
Il faut alors afficher $str_member

Important, il faut lancer si possible automatiquement le premier script PHP (toutes les 2H c'est pas mal) comme ca la base de donnée ce met a jour automatiquement !

Voila j'ai simplifié au max (en enlevant toute reference a ma guilde et la mise en page) si vous avez des questions posez les !

resultat visible ici : http://www.guilde-nomades.org/portal.php
__________________
http://www.canardpc.com
merci pour le code !

faut pas oublier de virer les phpbb_ des phpbb_listmember sinon ça marchera pas,
et pour le script d'affichage faut pas oublier d'afficher la chaine str_member sinon on voit rien

mais beau boulot... vais voir à utiliser ça
L"utilisation de php me semble pas hyper judicieuse, je m'explique : php et xml, en natif du moins, ne font pas forcément bon ménage. La preuve en est, pour pouvoir traiter comme l'on veut l'info il faut la passer dans une table sql dans l'exemple donné...

Alors qu'en actionscript on peut très facilement traiter du xml, bon y'en pour qui utiliser flash est encore pire que de subir un gang bang, mais AS reste un langage baser sur la norme ECMA, donc je pense qu'il est possible de bosser plus ou moins de la même manière avec javascript.

Et pour pas trop se prendre la tête y'aurais peut être moyen d'utiliser un framework ajax, y me semblait avoir vu dans la pre release de Adobe Spry une sorte de gestionnaire de tableaux automatique, reste à voir s'il est possible de le bidouiller avec du xml.

Note : Oui j'ai eu une formation de graphiste qui ne me fait que citer des produit d'Adobe, j'ai même un hôtel dédié au culte d'adobe devant le quel je prie 5 fois par jours...
Rougit
Bonjour

J'aurai besoin de votre aide pour afficher ca sur le site de ma guilde.. Je suis débutante... J'ai fais ce que vous avez demander... La question est... C'est quoi le code pour afficher ca sur une page ?

Merci d'avance...
Citation :
Publié par ozerworld
mwarf, ce ne serai que moi je le ferai en python ou en perl, bien plus puissant !!! mais l'aventage du php c'est que beaucoup d'hebrergeur le propose et que beaucoup le pratique ! Et tous le monde n'as pas de serveur dedié pour sa guilde
tout a fait et de plus pas toute les guilde compte dans leur rang un membre qui a une formation de codeur et qui maitrise tout les language possible et immaginable ...

L'exemple de ma propre guilde, où j'ai utilisé (et un peu améliorer/personnaliser ) le code qu'on trouve dans ce thread et qui est le fruit de multiples auteurs .. et j'aurai eté tout simplement incapable de faire autrement
Citation :
Publié par Evelyna
Bonjour

J'aurai besoin de votre aide pour afficher ca sur le site de ma guilde.. Je suis débutante... J'ai fais ce que vous avez demander... La question est... C'est quoi le code pour afficher ca sur une page ?

Merci d'avance...
Bien si tout ce passe bien, il te suffi d afficher le contenu de $str_member .

un : echo $str_member ; suffi
N'étant pas actuellement dans une guilde, j'aimerai savoir s'il était possible de récupérer des informations depuis d'autres fichiers XML mis à notre disposition.
De même, je suis à la recherche d'une liste de toutes les guildes d'un même serveur, est-ce que celle ci est disponible via XML ?
Merci
Pour ceux qui se le demande, tout les fichiers XML de vg players sont publiques visiblement, et donc accessible.

Ma petite pierre à l'édifice, l'utilisation du framework rico pour avoir un tableau dynamique assez pratique d'emploi dans le cadre d'un roster. Je me suis basé sur le boulot d'oze, et considère que tout le monde à bidouiller son bousin pour copier le contenu du xml de vgplayers dans une base mysql, attention tout de même pour mes propres besoin j'ai modifié quelque peut cette dernière. A vous de tripatouiller ce qui est nécessaire par la suite.


D'abord le code de la page qui affichera le roster
Code:
<?php
include("common/config.php");
?>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Document sans titre</title>
<style>
.fixedTable {
table-layout : fixed;
}
td.cell {
	padding	 : 2px 0px 2px 3px;
	margin		: 0px;
	border-bottom : 1px solid #b8b8b8;
	border-right : 1px solid #b8b8b8;
	height		: 22px;
	overflow	 : hidden;
	font-size	 : 11px;
	font-family: verdana, arial, helvetica, sans-serif;
	line-height: 12px;
	background-color : white;
}
.first {
border-left : 1px solid #b8b8b8;
}
.tableCellHeader {
padding		 : 2px 0px 2px 3px;
text-align	 : left;
font-size		: 11px;
border-top	 : 1px solid #b8b8b8;
border-right	 : 1px solid #b8b8b8;
background-color : #cedebd;
}
</style>
//Les trois balises script indispensable
<script src="framework/prototype.js"></script>
<script src="framework/rico.js"></script>
<script language="javascript">
function bodyOnLoad() 
{
var opts = { prefetchBuffer: true, onscroll : updateHeader,
				sortAscendImg: 'img/sort_asc.gif',
				sortDescendImg: 'img/sort_desc.gif'
			 };
new Rico.LiveGrid("data_grid",10,21, "xml_maker.php", opts);	 
}
function updateHeader( liveGrid, offset ) {
	 $('bookmark').innerHTML = "Listing records " + (offset+1) + " - " + (offset+liveGrid.metaData.getPageSize()) + " of " + 
	 liveGrid.metaData.getTotalRows();
	 var sortInfo = "";
	 if (liveGrid.sortCol) {
		 sortInfo = "&data_grid_sort_col=" + liveGrid.sortCol + "&data_grid_sort_dir=" + liveGrid.sortDir;
	 }
$('bookmark').href="http://monsite/index.php" + "?data_grid_index=" + offset + sortInfo;
}
 
</script>
</head>
//on oublie pas le onload ici
<body onload="javascript:bodyOnLoad()">
<a id="bookmark">Listing records</a>
<table id="data_grid_header" class="fixedTable" cellpadding="0" cellspacing="0" border="0" width="560">
<tr>
<th class="first_tableCellHeader">Rank</th>
<th class="tableCellHeader">Name</th>
<th class="tableCellHeader">Class</th>
<th class="tableCellHeader">Adventure level</th>
<th class="tableCellHeader">Craft</th>
<th class="tableCellHeader">Craft level</th>
</tr>
</table>
<div id="viewPort" style="float:left">
<table id="data_grid" class="fixedTable" cellpadding="0" cellspacing="0" border="0" style="float:left" width="560">
<?php
//les variables de connections sont dans le fichier config.php inclue au tout debut de ce script.
$link = mysql_connect($db_server, $db_login, $db_pass)or die("Impossible de se connecter");
mysql_select_db($db_database) or die("Table inexistante");
$query = "SELECT * FROM roster LIMIT 0,20";
$result = mysql_query($query) or die(mysql_error());
$nb_record = mysql_num_rows($result);
while ($data = mysql_fetch_array($result)){
echo "<tr>";
echo "<td class=\"cell\">".$data['r_rank']."</td>";
echo "<td class=\"cell\">".$data['r_name']."</td>";
echo "<td class=\"cell\">".$data['r_adclass']."</td>";
echo "<td class=\"cell\">".$data['r_adlvl']."</td>";
echo "<td class=\"cell\">".$data['r_crclass']."</td>";
echo "<td class=\"cell\">".$data['r_crlvl']."</td>";
echo "</tr>";
}
mysql_close();
 
?>
</table>
</div>
</body>
</html>
le fichier xml_maker.php, celui ci va nous pondre un fichier xml à la volée pour le live Grid de rico, on pourrait bien entendu se contenter de restructurer le fichier xml de vgplayers.

Code:
<?php
//Fix pour IE
header("Content-Type: text/xml");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
include("common/config.php");
$link = mysql_connect($db_server, $db_login, $db_pass)or die("Impossible de se connecter");
mysql_select_db($db_database) or die("Table inexistante");
$pagesize = ($_GET['pagesize']) ? $_GET['pagesize'] :20; //a modifier, le nombre d'enregistrement à afficher par page
$offset = ($_GET['offset']) ? $_GET['offset'] : 0;
$sort_col = ($_GET['sort_col']) ? $_GET['sort_col'] : 'r_rank';
//ATTENTION : les conditions (case), sont les nom de colone sans majuscule, avec un _ à la place des espaces.
switch($sort_col){ 
case("name"):
$sort_col="r_name";
break;
 
case("rank"):
$sort_col="r_rank";
break;
 
case("class"):
$sort_col="r_adclass";
break;
 
case("adventure_level"):
$sort_col="r_adlvl";
break;
 
case("craft"):
$sort_col="r_crclass";
break;
 
case("craft_level"):
$sort_col="r_crlvl";
break;
 
default:
$sort_col="r_rank";
}
$sort_dir = ($_GET['sort_dir']) ? $_GET['sort_dir'] : 'DESC';
$lp_sql = "select * from roster order by ".$sort_col." ".$sort_dir." limit
".$offset.",".$pagesize;
$result = mysql_query($lp_sql) or die(mysql_error());
// on commence à écrire au format xml 
$xml = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>";
$xml = "<ajax-response><response type=\"object\" id=\"data_grid_updater\"><rows update_ui=\"true\">";
while ($data = mysql_fetch_array($result)){
$xml .="<tr>";
$xml .="<td>".$data['r_rank']."</td>";
$xml .="<td convert_spaces=\"true\">".$data['r_name']."</td>";
$xml .="<td>".$data['r_adclass']."</td>";
$xml .="<td>".$data['r_adlvl']."</td>";
$xml .="<td>".$data['r_crclass']."</td>";
$xml .="<td>".$data['r_crlvl']."</td>";
$xml .="</tr>";
}
mysql_close();
$xml .='</rows></response></ajax-response>';
echo $xml;
?>
Bon appetit !

Edit : j'allais oublié, les fichiers prototype.js et rico.js sont disponible ici : http://openrico.org/ .
http://anathemaguild.free.fr/show_roster.php

Voila une démonstration du truc. J'ai pas particulièrement bosser sur la gueule du machin, mais c'est fonctionnel. ya juste à cliquer sur le label d'un colonne pour modifier l'ordre du tableau. Tout est en ajax, donc asynchrone.

Note : Dans le premier fichier il ya une variable opts à définir, que j'ai oublié d'annoter, en javascript, une des valeurs de cette variable détermines aussi le nombre de ligne visible du tableau, à expérimenter donc, sachant qu'openrico n'est que très peu documenté.
Citation :
Publié par ozerworld
Ok je decortique

Ingredients :

- 2 script php
- 1 base de donnée Mysql (ou postgres me demander dans ce cas la)
- L'url de ton fichier xml de vgplayer
- Du temps et un peu de patience
bonjour j'ai tout fait a la lettre et voici mon erreur :
Fatal error: Call to undefined function: domxml_open_mem() in c:\program files\easyphp1-7\www\roster.php on line 31

J'ai cherché et ca semble venir de domxml qui est pas activé dans php.
Moi je veux l'activer et j'obtiens ca :

Unknow(): Unable to load Dynamic library "C:\Program files\Easyphp1-7\php\extensions\php_domxml.dll" Le module spécifié est introuvable

Ce message apparaît 2 fois.
J4ai vérifie le fichier DLL dont il parle est bien au bon endroit.
Je l'ai copié dans le repertoire windows et systeme32 au cas ou.. mais rien a faire.

Ma version de php : 4.3.3

Quelqu'un a une idée?
Bonjour,
Mon problème ci dessus est résolu, enfin quasiment
Voila j'ai pu activer l'extension domxml mais voila ce que j'ai en lançant roster.php :

Citation :
Notice: Undefined variable: data in C:\Program Files\EasyPHP1-7\www\vg2\roster.php on line 8

Fatal error: Call to undefined function domxml_open_mem() in C:\Program Files\EasyPHP1-7\www\vg2\roster.php on line 31
Voici mon roster.php
J'ai volontairement caché le user et mdp de la bdd.

Code:
<?php
$xml = "http://vgplayers.station.sony.com/includes/guilds/guildsRosterXML.vm?guildId=111669150188";

$error_vg = false ;
$fp = fopen($xml, "r") or $error_vg = true;
if ($error_vg) {
}else{
while (!feof($fp)) { $data .= fgets($fp, 2048); }
fclose($fp);

// Déclaration de la fonction récursive ParseNode()
function ParseNode($node, &$array)
{
global $id;
$childnodes = $node->child_nodes();

foreach ($childnodes as $childnode) {
if (trim($childnode->tagname) == "id") {
$id = $childnode->get_content();
}
elseif (trim($childnode->tagname) != "") {
ParseNode($childnode, $array);
}
elseif (trim($childnode->node_name()) == "#text" && trim($childnode->get_content()) != "") {
$array[$id][$node->tagname] = $childnode->get_content();
}
}
}

// Parsing du document XML via la fonction ParseNode()
$domdoc = domxml_open_mem($data);
$root = $domdoc->document_element();
$arraydoc = array();

ParseNode($root, $arraydoc);


$link = mysql_connect("localhost", "******", "*******")or die("Impossible de se connecter");
mysql_select_db("db_dragon") or die("Could not select database");
echo "Connection DB ok\n" ;

$query = "TRUNCATE table listmember" ;
$result = mysql_query($query) or die("Query failed");
echo "Table listmember vidée\n" ;

while ($member = current($arraydoc)) {
if (strcmp($member['name'],'Les Elus du Dragon')) {
$key=key($arraydoc) ;
$query = "insert into listmember (lm_key,lm_rank,lm_adclass,lm_adlvl,lm_crclass,lm_crlvl,lm_name) values (\"$key\",\"".$member['guildRank']."\",\"".$member['adventureClass']."\",".$member['adventureLevel'].",\"".$member['craftingClass']."\",".$member['craftingLevel'].",\"".$member['name']."\");" ;
$result = mysql_query($query) or die("Query failed");
echo "Ligne $key ajoutée\n" ;
}
next($arraydoc) ;
}
mysql_close($link);
}
?>
Je ne comprend pas vu que dmxml est activé
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés