Categories > TinyButStrong general (FR) >

[fr] class simpleXML de PHP5 ( désolé j'avais oublié de transmettre le fichier XML)

The forum is closed. Please use Stack Overflow for submitting new questions. Use tags: tinybutstrong , opentbs
By: Gerardmarrache
Date: 2004-07-18
Time: 16:45

[fr] class simpleXML de PHP5 ( désolé j'avais oublié de transmettre le fichier XML)

Bonjour, tout d'abord je trouve votre class de template formidable,
Je m'intéresse depuis peu à PHP4 et PHP5 depuis la version finalisée.

A partir d’un fichier XML,  je voudrais extraire certaines informations, à partir d’un exemple simple de la class simpleXML (PHP5) j’ai modifié le code  dans l’exemple  de http://www.phpteam.net/affiche.php?quoi=php5new2 pour que ça fonctionne avec la class de template tinyButStrong.

Code individu.php


<?php
include_once('tbs_class.php') ;
$population = simplexml_load_file('individu.xml');
$ind = array() ;

            foreach($population->individu as $individu)
            {
                $ind[] = array(
                'prenom'=>$individu->prenom,
                'nom'=>$individu->nom,
                'email'=>$individu->email) ;
              }
          
$TBS = new clsTinyButStrong ;
$TBS->LoadTemplate('individu.html') ;
$TBS->MergeBlock('blk1',$ind) ;
$TBS->Show() ;
?>

Page template individu.html

<table width="382" border="0">
  <tr bordercolor="0" bgcolor="#FF66FF">
    <td bordercolor="0">[blk1.#]</td>
    <td> [blk1.nom;block=tr] </td>
    <td bordercolor="0"> [blk1.prenom;block=tr] </td>
    <td bordercolor="0"> [blk1.email;block=tr] </td>
  </tr>
</table>
<table width="382" border="0">
  <tr bgcolor="#CCCCFF">
    <td>[blk1.#]</td>
    <td> [blk1.nom;block=tr] </td>
    <td> [blk1.prenom;block=tr] </td>
    <td> [blk1.email;block=tr] </td>
  </tr>

</table>
Page individu.xml

<?xml version="1.0"?>
<population>
    <individu>
        <prenom>nicolas</prenom>
        <nom>sulpice</nom>
        <email>test@phpteam.net</email>
    </individu>
    <individu>
        <prenom>georges</prenom>
        <nom>pierre</nom>
        <email>gp@photo.net</email>
    </individu>
</population>



Pourriez-vous me dire si il est possible d’optimiser ce code, ou bien mon proposer  mieux structuré, notamment pour un code permettant de faire des listes déroulantes.



By: Skrol29
Date: 2004-07-18
Time: 19:29

Re: [fr] class simpleXML de PHP5 ( désolé j'avais oublié de transmettre le fichier XML)

Salut,

Tu peux améliorer le template : un seul "block=tr" suffit pour chaque ligne de tableau. Pas besoin de le répéter. Tu peux le mettre sur n'importe quel champ, mais si tu le met sur le premier (même [blk1.#]) c'est un poil plus rapide.

Tu peux aussi améliorer le script PHP en utilisant des fonctions personnalisée pour la lecture des données spécifiques à SimpleXML. Voici un exemple de code qui marche :
<?php
include_once('tbs_class.php') ;
$population = simplexml_load_file('individu.xml');

$TBS = new clsTinyButStrong ;
$TBS->LoadTemplate('individu.html') ;
$TBS->MergeBlock('blk1',$population->individu) ;
$TBS->Show() ;

function tbsdb_SimpleXMLElement_open(&$Src,&$Query) {
    return $Src;
}
function tbsdb_SimpleXMLElement_fetch(&$Rs,$Num) {
    return get_object_vars($Rs[$Num-1]);
}
function tbsdb_SimpleXMLElement_close(&$Rs) {
}
?>
By: Gerardmarrache
Date: 2004-07-18
Time: 21:09

Re: [fr] class simpleXML de PHP5 ( désolé j'avais oublié de transmettre le fichier XML)

Merci de m'avoir répondu tres rapidement pour les corrections que tu as  au code  modifié que j'ai pris en exemple.

pour la page template, lorsque je supprime les block=tr il se poduit des erreurs du au parseur ??.

peux-tu me donner un exemple concret sur chacune des fonctions que tu m'as proposé.

Merci d'avance, et encore bravo pour votre travail.

G. MARRACHE.
By: Skrol29
Date: 2004-07-18
Time: 21:37

Re: [fr] class simpleXML de PHP5 ( désolé j'avais oublié de transmettre le fichier XML)

Pas besoin de toucher au fichier individu.php que j'ai envoyé juste avant, il marche tel quel en PHP 5, je l'ai testé.

Voici la page page individu.html améliorée:
<table width="382" border="0">
  <tr bordercolor="0" bgcolor="#FF66FF">
    <td bordercolor="0">[blk1.#;block=tr]</td>
    <td> [blk1.nom] </td>
    <td bordercolor="0"> [blk1.prenom] </td>
    <td bordercolor="0"> [blk1.email] </td>
  </tr>
</table>
<table width="382" border="0">
  <tr bgcolor="#CCCCFF">
    <td>[blk1.#;block=tr]</td>
    <td> [blk1.nom] </td>
    <td> [blk1.prenom] </td>
    <td> [blk1.email] </td>
  </tr>
</table>
By: gerarmarrache
Date: 2004-07-18
Time: 21:54

Re: [fr] class simpleXML de PHP5 ( désolé j'avais oublié de transmettre le fichier XML)

merci encore d'avoir répendu expressement à mes questions.

pour le coup du block=tr , j'avai pensai qu'il falait le mettre sur toute les lignes, et pour chaque champ, bon maintenant j'ai compris...

mais peux-tu me donner les exemples correspondants à tes fonctions :

function tbsdb_SimpleXMLElement_open(&$Src,&$Query) {
return $Src;
}
function tbsdb_SimpleXMLElement_fetch(&$Rs,$Num) {
return get_object_vars($Rs[$Num-1]);
}
function tbsdb_SimpleXMLElement_close(&$Rs) {
}

Merci d'avance
G. MARRACHE

By: Skrol29
Date: 2004-07-18
Time: 22:01

Re: [fr] class simpleXML de PHP5 ( désolé j'avais oublié de transmettre le fichier XML)

Salut,

Ces fonctions sont des fonctions personnalisées pour TBS et qui correspondent à un format demandé par TBS. Elles sont décrites dans le manuel à la rubrique "Ajout d'un type de source de données".

Le jeu de fonctions que je t'ai fourni reconnaissent les objets de classes "SimpleXMLElement" et récoltent les infos à afficher.

Je ne peux pas te donner d'exemples car elles sont faites sur mesure. Tu trouveras d'autres fonctions personnalisées pour d'autres sources de données dans la page de support sur ce site.
By: gerarmarrache
Date: 2004-07-19
Time: 00:51

Re: [fr] class simpleXML de PHP5 ( désolé j'avais oublié de transmettre le fichier XML)

reBonsoir
Je n'ai pas tres bien compris pourquoi vous  mettez les variables en référence dans vos fonctions (peux-être une explication dans la routine de vos class).

Faute d'avoir tous compris je vous propose une fonction que j'ai rajouté

code php individu.Php

<?php

include_once('tbs_class.php') ;

/* fonction rajoutée à la fin de tbs_class.php
function tbs_simplexml_file_load($filexml,$Query){
//$xml= 'individu.xml' ;
$Query_load= simplexml_load_file($filexml) ;
return $Query_load->$Query ;
}      
*/        

$TBS = new clsTinyButStrong ;
$TBS->LoadTemplate('individu.html') ;
$TBS->MergeBlock('blk1', tbs_simplexml_file_load('individu.xml','individu')) ;
$TBS->Show() ;

?>

Merci de me corriger car je ne vois pas ou mettre la fonction dans vos class.


G. MARRACHE.
By: gerarmarrache
Date: 2004-07-21
Time: 20:02

Re: [fr] class simpleXML de PHP5 ( désolé j'avais oublié de transmettre le fichier XML)

Bonsoir,  pouvez-me dire si il est possible de reproduire sans avoir besoin de javascript  un code en php + TBS en template  pour réaliser une sélection multiple dans 2 listes différentes, de l’une vers l’autre et vice et versa.

Voici les codes que j’ai utilisé qui fonctionne bien et que j'ai simplifié pour l'exemple :

1- code en PHP  move.php
  <?
include_once('tbs_class.php') ;
$item_lst_todo = array() ;
$item_lst_todo[] = array('name'=>'Rouge vermillont','id'=>1) ;
$item_lst_todo[] = array('name'=>'Vert' ,'id'=>2) ;
$item_lst_todo[] = array('name'=>'Bleu' ,'id'=>3) ;
$item_lst_todo[] = array('name'=>'Jaune','id'=>4) ;
$item_lst_todo[] = array('name'=>'Blanc','id'=>5) ;

$item_lst_done = array() ;
$item_lst_done[] = array('name'=>'violet','id'=>1) ;
//$voir_list = print_r('done_list') ;
$TBS = new clsTinyButStrong ;
$TBS->LoadTemplate('move.html') ;

$TBS->MergeBlock('done_list',$item_lst_done) ;
$TBS->MergeBlock('todo_list' ,$item_lst_todo) ;

$TBS->Show() ;

?>
    

2 - Le template move.html

<html>
<head>
<title>Exemple de sélection multiple sur 2 listes déroulantes</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script language='javascript' src='move.js';>
</script>

<style type="text/css">
<!--
body {
    background-color: #CCCCCC;
}
-->
</style></head>
<body>


<form action="/tbs/classes/move.php" method="post" enctype="multipart/form-data" name="moving_form" onSubmit="selectAll('moving_form', 'todo_list[]', 'done_list[]');; return true">
  <table width="100%" border="0" cellpadding="0" cellspacing="5">
    <tr align="left" valign="top">
      <td width="40%"> <div align="center">Liste &agrave; selectioner<br />        
          <select name="todo_list[]" size="7" multiple id="select2">
            <option value="[todo_list.id]">[todo_list.name;block=option]</option>
          </select>
</div></td>
      <td width="10%" align="center" valign="middle"> &nbsp; <p>
        <input onClick="return moveItems('moving_form', 'done_list', 'moving_form', 'todo_list', 'SVP selectez au moins un élément de la liste de gauche!')" type="button" value="&lt;&lt;">
      </p>
        <p>          <input name="button" type="button" onClick="return moveItems('moving_form', 'todo_list', 'moving_form', 'done_list', 'SVP selectez au moins un élément de la liste de Droite!')" value="&gt;&gt;">
        </p></td>
      <td width="40%">
        <div align="center">Liste selection&eacute;e<br />
              <select name="done_list[]" size="7" multiple id="done_list[]">
              <option value="[done_list.id]">[done_list.name;block=option]</option>
            </select>
        </div></td>
    </tr>
    <tr align="center" valign="middle">
      <td colspan="3"><input type="submit" name="btnSubmit" value="Valider"></td>
    </tr>
  </table>
  <table border="0" cellspacing="5" cellpadding="0">
  </table>
  <p>&nbsp;</p>
</form>

</body>
</html>



3 - Le code en javascript  move.js



function moveItems (fromForm, fromItem, toForm, toItem, advice)
{
    var fItem = fromItem +"[]";
    var tItem = toItem +"[]";
   
    if ((document.forms[fromForm] != undefined) &&
        (document.forms[fromForm].elements[fItem] != undefined) &&
        (document.forms[toForm] != undefined) &&
        (document.forms[toForm].elements[tItem] != undefined) &&
        (document.forms[fromForm].elements[fItem].options.selectedIndex >= 0)) {
       
        while (document.forms[fromForm].elements[fItem].options.selectedIndex >= 0) {
            ind = document.forms[fromForm].elements[fItem].options.selectedIndex;
           
            text  = document.forms[fromForm].elements[fItem].options[ind].text;
            value = document.forms[fromForm].elements[fItem].options[ind].value;
           
            document.forms[fromForm].elements[fItem].options[ind] = null;
           
            var newOption = new Option(text, value);
            toFormLength = document.forms[toForm].elements[tItem].options.length;
            document.forms[toForm].elements[tItem].options[toFormLength] = newOption;
        }
    } else {
        if ((advice != undefined) && (advice != "")) {
            alert (advice);
        }
    }
    return (false);
}

function selectAll (form_name) {
    for (var i = 1; i < arguments.length; i++) {     
        if ((document.forms[form_name] != undefined) &&
            (document.forms[form_name].elements[arguments[i]] != undefined) &&
            (document.forms[form_name].elements[arguments[i]].options != undefined)) {
            for (var j = 0; j < document.forms[form_name].elements[arguments[i]].options.length; j++) {
                document.forms[form_name].elements[arguments[i]].options[j].selected = true;
            }     
        }
    }
    return true;
}


Merci d'avance, en espérant que vous allez pas m'abondonner.

G. MARRACHE.
By: michael
Date: 2004-07-25
Time: 14:22

Re: [fr] class simpleXML de PHP5 ( désolé j'avais oublié de transmettre le fichier XML)

Hi Skrol29

I am starting to use TBS - it is excellent - thank you for this excellent class.

This example is very interesting to me - using XML in this way. Could you please kindly explain why the tbsdb_SimpleXMLElement functions were required to make this example work?

Thanks,

Michael.

By: Skrol29
Date: 2004-07-25
Time: 18:58

Re: [fr] class simpleXML de PHP5 ( désolé j'avais oublié de transmettre le fichier XML)

Salut,

J'avais pas vu ton message car tu l'as mis en réponse à ton propre message. Donc je n'ai pas eu de notification.

Des variables sont passées en références car parfois TBS doit récupérer ces variables éventuelement modifiées. Et aussi parce que parfois c'est plus rapide.

Ta solution est une autre possibilité. Tu as préparé un tableau et tu passes le tableau dans MergeBlock().
By: Skrol29
Date: 2004-07-25
Time: 23:14

Re: [fr] class simpleXML de PHP5 ( désolé j'avais oublié de transmettre le fichier XML)

I Micheal,

Gerarmarrache had a solution to display data from and XML file.
His solution was to build an array using Php SimpleXml functions; and he asked if there was a more optimized solution.

I told him that a solution using customized data functions for TBS should be more optimized, and I gave an example of such a function set.
By: michael
Date: 2004-07-25
Time: 23:54

Re: [fr] class simpleXML de PHP5 ( désolé j'avais oublié de transmettre le fichier XML)

hi Skrol29

Thanks for your answer. I see it now. This type of custom function usage would be a good tip (as suggested elsewhere about making a tips section).

Regards

Michael.
By: michael
Date: 2004-07-26
Time: 05:41

Re: [fr] class simpleXML de PHP5 ( désolé j'avais oublié de transmettre le fichier XML)

Hi Skrol29

I was checking into the performance on both versions of script: the original Gerardmarrache & your suggested improvement. I wondered what is the best way to time the performance of the script & report it in the HTML (using the template). Usually I echo the result of a timer to determine the time to produce the page. In TBS, I was wondering if this was the best way to do it. That is,

insert the following just before include_once('tbs_class.php');
$timer = new c_Timer; $timer->start();

insert the following just before $TBS->Show() ;
$timer->stop(); $totaltime = $timer->elapsed();

and in the template at the bottom, I have
time = [var.totaltime;frm=0.000]

Sorry if this is lame , I am relatively new to PHP.

Regards

Michael.
By: Skrol29
Date: 2004-07-26
Time: 10:25

Re: [fr] class simpleXML de PHP5 ( désolé j'avais oublié de transmettre le fichier XML)

Salut,

Oui c'est possible. Il faut que tu enregsitres dans un champ caché le contenu deux liste en cours de modifications, car les zone de liste elles-mêmes ne passeront comme valeur au script que leur valeur sélectionnée.

Mais je pense que la soution Javascript est quand même la meilleur car elle ne sollicite pas le serveur pendant la sélection des items.
By: gerarmarrache
Date: 2004-07-26
Time: 21:17

Re: [fr] class simpleXML de PHP5 ( désolé j'avais oublié de transmettre le fichier XML)

Salut,

Malheureusement je parle très mal l’anglais, donc je ne peut te répondre qu’en français (sorry).


Pour tester le temps qui sécoule entre chaque page j’ai choisi une autre fonction que vous trouverai dans « tbs_mesfonctions »

J’ai inclus par ailleurs, les autres fonctions nécessaires à l’ajout d'un type de source de données  telles suggérer par Skrol29 pour effecturer les testes qui s'imposent.

Code PHP dans tbs_mesfonctions

<?

//-----------fonctions personnelles pour ADODB
function tbsdb_adodb_open(&$source,&$query) {
  global $conn ;
  $conn->SetFetchMode(ADODB_FETCH_ASSOC);
  $rs = $conn->Execute($query) ;
  return $rs ;
}
function tbsdb_adodb_fetch(&$rs) {
  return $rs->FetchRow() ;
}
function tbsdb_adodb_close(&$rs) {
  $rs->Close() ;
}
//-------------------fonctions personnelles pour SimpleXML
function tbsdb_SimpleXMLElement_open(&$Src,&$Query) {
return $Src;
}
function tbsdb_SimpleXMLElement_fetch(&$Rs,$Num) {
return get_object_vars($Rs[$Num-1]);
}
function tbsdb_SimpleXMLElement_close(&$Rs) {
}

// fonction devenue obsolète mais qui fonctionne ( mieux vaut utiliser les autres de Skro29) 
function tbs_simplexml_file_load($filexml,$Query){
$Query_load= simplexml_load_file($filexml) ;
return $Query_load->$Query ;
}


//-------------- fonction permettant de calculer le temps écoulé pour l’affichage d’une page.
function tempsPage() {
        // Cette fonction récupère l'heure en microsecondes
        list($usec, $sec) = explode(" ", microtime());
        return ($usec + $sec);
}
$starttime = tempsPage();
//--------------fin de tbs_mesfonctions
 
?>



Ensuite il est nécessaire de placer la déclaration d’une variable prenant en compte la fonction tempsPage() juste avant  $TBS->SHOW() 

$exectime = round((tempsPage() - $starttime) * 100) / 100;

Prévoir dans la page de template html l’affichage de la variable par exemple :
<p> Il y eu [var.exectime] secondes pour afficher la page </p>.


Cela ma permis de constater qu’i l y a en faite très peu d’écart de temps entre une fonction personnalisée proposée par Skro29  « ajout d'un type de source de données » et le traitement d’une boucle de type for each  qui permet de parser éventuellement que les éléments (items) que l’on souhaite voir s’afficher.

Je pense qu’il faudrait étendre les exemples sur plusieurs champs voir une bonne centaine d’éléments pour se faire sa propre opinion.

By: michael
Date: 2004-07-27
Time: 23:39

Re: [fr] class simpleXML de PHP5 ( désolé j'avais oublié de transmettre le fichier XML)

gerarmarrache, merci (sorry for poor French)

regards

Michael