IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Intégration de BIRT dans un environnement PHP


précédentsommairesuivant

IV. Intégration PHP

IV-A. Architecture mise en place

Image non disponible

L'architecture mise en place est assez simple. À gauche, PHP avec une page qui contient un formulaire basé sur des données présentes dans une SGBD MySQL, de l'autre un serveur d'applications sur lequel sont présentes deux applications de reporting : « birt » et « reporting ». Les échanges entre ces deux plateformes se font via le protocole HTTP.

IV-B. Prérequis

IV-B-1. Configuration de Jboss

Il y a trois étapes clefs :

Est présent sur la page http://localhost:8080/birtV2_3_0/ la version du viewer, du moteur de BIRT ainsi que la JRE utilisée.

IV-B-2. Conception d'un état BIRT avec paramètre

Il faut commencer par créer un état dit test de type graphique par exemple, en forme de camembert avec un paramètre pour la mise en place d'un formulaire. Vous trouverez l'exemple ici int-php.rptdesign.

IV-C. Méthode avec utilisation d'une balise IFrame

Ce mode est le plus répandu et le plus simple à mettre en place, car il s'agit d'une simple fenêtre ou frame HTML contenant une référence vers une URL.

IV-C-1. Schéma

Voir annexeAJAX.

IV-C-2. Mise en place du formulaire de saisie

Dans un premier temps nous allons mettre en place un formulaire de saisie, comme ci-dessous.

Formulaire PHP
Sélectionnez
<?php
$conn = mysql_connect("localhost", "login", "mdp");
if (!conn){
    die("Impossible de se connecter : ". mysql_error());
}else{
    echo 'Connexion réussie </BR>';
    mysql_select_db('classicmodels', $conn);
    $res = mysql_query('select c.customerNumber,c.customerName from customers c order by c.customerName',$conn);
    if(!$res){
        die('Requête invalide : '. mysql_error().'</BR>');
    }else{
        $client = $_GET['client'];
        ?>
        <DIV id="form">
        <form action="" name="int-php.iframe">
            <select name="client">
            <?PHP while ($row = mysql_fetch_assoc($res)) {
            if ( client!=null && $row['customerNumber'] == $client){
                echo '<option value ="'.$row['customerNumber'].'" selected="selected">'.$row['customerName'].'</option>';
            } else {
                echo '<option value ="'.$row['customerNumber'].'">'.$row['customerName'].'</option>';}}
            ?>
            </select><input type="submit" value="Ok">
        </form>
        <DIV>
        <?PHP}
    mysql_close($conn);}
?>

Nous devons alors avoir le formulaire ci-dessous :

Image non disponible

IV-C-3. Utilisation de BIRT Viewer

Maintenant la partie permettant de soumettre la bonne URL. Nous allons ici utiliser sept variables sous PHP.

Variable

Description

report

Nom de l'état « .rptdesign »

host

Nom de la machine ou adresse IP

port

Port du serveur sur lequel se trouve l'application

mode

Le type de servlet utilisé au niveau du Viewer de BIRT

war

Le nom de l'archive utilisée

param

La liste des paramètres transmis dans l'URL

dest

L'URL complète


Le code associé sera comme ci-dessous :

Iframe PHP
Sélectionnez
<?PHP
$report = "int-php.rptdesign";
$host = "localhost";
$port = "8080";
$mode ="run";
$war = "birtV2_3_0";
$param="&client=$client&__agentstyle=true";
// Redirect browser
$dest = "http://$host:$port/$war/$mode?__report=$report".$param;
?>
<DIV>
<?php
echo '<iframe frameborder="0" width="410px" height="210px" src="';
if ($client!=null ){
    echo $dest;
}else{ echo "#";}
    echo '"></iframe>';
?>
</DIV>

IV-D. Méthode avec utilisation d'une balise DIV

Dans le premier cas, nous avons utilisé le Viewer de BIRT. Dans le second nous souhaitons mettre en place le même état, mais en faisant appel à une version personnalisée de BIRT l'archive reporting.war afin de pouvoir supprimer les balises HTML et BODY du corps de la page.

Cette manipulation est impossible avec la seule utilisation du Viewer de BIRT et demande une implémentation de l'API de BIRT.

Nous ne rentrerons ici pas dans les détails sur toute la mise en œuvre de l'API de BIRT, nous ne spécifierons ici que le paramètre à passer dans l'URL à savoir __embedded. Nous aurons donc la liste des attributs suivants :

Attributs

Description

__report

Nom de l'état « .rptdesign »

__format

Format de sortie HTML, PDF et XLS, par défaut HTML

__embedded

Présence des balises HTML et BODY (false par défaut sinon true)

IV-D-1. Schéma

Voir annexeDIV.

IV-D-2. Mise en place du formulaire de saisie

Cette partie reste inchangée.

IV-D-3. Comment appeler la Servlet

Ici nous allons utiliser le code suivant :

DIV PHP
Sélectionnez
<?PHP
$report = "int-php";
$host = "localhost";
$port = "8080";
$mode ="osspartner";
$war = "reporting";
$param="&client=$client&__embedded=true";
// Redirect browser
$dest = "http://$host:$port/$war/$mode?__report=$report".$param;
?>
<DIV class="frame">
<?php
$r = fopen($dest, "r" );
$contents = '';
if ($r){
    while (!feof($r)) { 
        $contents.=fread($r, 8192);} 
    fclose($r); 
    echo $contents;
} else {
    }?>
</DIV>

Ce code va tout simplement injecter dans la page HTML, le code HTML renvoyé par l'appel de l'URL. À l'arrivée nous obtenons le rendu comme précédemment, mais sans les bordures de la Frame.

Il faut noter que cette méthode ne fait que réinjecter le code HTML renvoyé par l'appel d'une URL.

Avec le DIV l'image est directement intégrée dans la page, vous n'aurez plus aucune bordure et donc l'illusion que votre reporting vient de PHP et non Java. Par contre, nous n'avons pas traité le cas des erreurs.

IV-E. Méthode avec utilisation d'une balise DIV et utilisation du Framework AJAX

Il s'agit là de la dernière méthode mise en œuvre, attention celle-ci ne marche qu'avec le navigateur Internet Explorer.

Avec AJAX, il n'est pas permis de faire directement appel à une URL dont la racine est différente de la première. Or, ici il y a l'URL de Jboss et celle de PHP. Internet Explorer est plus permissif que les autres navigateurs, il est d'ailleurs le seul sur lequel la méthode marche.

IV-E-1. Schéma

Voir annexeIFrame.

IV-E-2. Mise en place du formulaire de saisie

Cette partie reste inchangée.

IV-E-3. Comment appeler la servlet

Le principe est le même que pour les étapes précédentes, il faut donc dans un premier temps construire l'URL d'appel avant d'utiliser la fonction Javascript.

AJAX PHP
Sélectionnez
<?PHP
$report = "int-php";
$host = "localhost";
$port = "8080";
$mode ="osspartner";
$war = "reporting";
$param="&client=$client&__embedded=true";
// Redirect browser
$dest = "http://$host:$port/$war/$mode?__report=$report".$param;
?>
<DIV id="zone" class="frame">
    <SCRIPT>
    window.onload=phpAJAX(<?PHP echo "'".$dest."'"?>,'zone');
    </SCRIPT>
</DIV>

IV-E-4. Utilisation de Javascript et AJAX

Pour la fonction Javascript il vous suffit de reprendre le code suivant :

Fonction Javascript
Sélectionnez
function phpAJAX(dest,zone){
    var xhr;
    try {
        xhr = new ActiveXObject('Msxml2.XMLHTTP');
    }catch (e){
        try {xhr = new ActiveXObject('Microsoft.XMLHTTP');
    }catch (e2){
        try {xhr = new XMLHttpRequest();
    }catch (e3) {
        xhr = false;}
    }}
    xhr.onreadystatechange = function() {
        switch(xhr.readyState){
        case 0:
            document.getElementById(zone).innerHTML = '<img src="../images/timeout.gif" width="100px" height="100px">';
            break;
        case 1:
            document.getElementById(zone).innerHTML = '<img src="../images/timeout.gif" width="100px" height="100px">';
            break;
        case 2:
            document.getElementById(zone).innerHTML = '<img src="../images/timeout.gif" width="100px" height="100px">';
            break;
        case 3:
            document.getElementById(zone).innerHTML = '<img src="../images/timeout.gif" width="100px" height="100px">';
            break;
        case 4:
            if(xhr.status == 200){
                document.getElementById(zone).innerHTML = xhr.responseText;
            }else{ 
                document.getElementById(zone).innerHTML = xhr.responseText;}
            break;
        default:}
        };
    xhr.open('GET',dest,true);
    xhr.send(null);
}

Pour simuler la progression entre le l'appel de l'URL et la réponse une GIF animée est utilisée.

Image non disponible

IV-E-5. Utilisation de Jquery

Il existe des bibliothèques Javascript telles que JQuery et l'appel à la fonction Javascript se réduit à une ligne. Pour cela, il suffit de télécharger la bibliothèque à l'adresse suivante http://jquery.com/.

JQuery
Sélectionnez
$.ajax({
type: "GET",
url: "<?PHP echo $dest; ?>"
});

précédentsommairesuivant

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2009 J. Sauvebois. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC.